• +5
    И ещё, если мы говорим о производительности, то что в коде делает рекурсия? Итеративный вариант точно будет быстрее, да ещё и от переполнения стека защищён. Тут конечно можно сделать через оптимизацию хвостовой рекурсии, но для этого надо код переписать. Так как есть, ни один компилятор не осилит. Да и не думаю, что хоть один движок js это вообще делает.
    Бинарный поиск в JavaScript. Практический пример
  • +7
    Извините, но пост ужасен. Во-первых, с такими темпами у нас будут статьи «2+2 на JavaScript». Во-вторых, выкладывать код не самого хорошего качества в обучающей статье — плохо.
    Я молчу про однобуквенные переменные с комментом (это же канон плохого коментария, от которого надо избавляться). Но этот код не будет работать с пустым массивом — банально зациклится. Это одна из ошибок новичка, такое студенты на первом курсе пишут и больше такого не делают. Зачем такое публиковать?
    Кроме того, 100 лет как принянто диапазоны делать открытыми справа, то есть не включать правую границу и не писать уродливое data.length -1. В случае пустого получаем -1, а что это за индекс?
    Ну и в качестве придирки. Плохим тоном, хотя и без последствий в js, является вычисление среднего (a+b)/2. Давно придумали писать a + (b-a)/2, чтобы не иметь переполнений. Да, в js всё double и проблем не будет, но ведь потом так напишут на чём-нибудь ближе к железу.
    Бинарный поиск в JavaScript. Практический пример
  • 0
    Я не один с таким поведением был: https://habrahabr.ru/company/tm/blog/335642/#comment_10362148
    Сейчас шрифты вернулись старые. Претензии к ним снимаются. Но плотность текста из-за интервалов и размера шрифта всё ещё актуальна.
    Редизайн Хабрахабра и Гиктаймс. Финишная прямая
  • +5
    Знаете, первый раз я хочу закрыть хабр и не возвращаться. Шрифты вообще невменяемые. Если сегодня утром они были просто мелкими, то сейчас они мелкие полужирные. Начертание цифр невменяемое, 1 вылазит за пределы, как в падонкаффском сленге. Я нЕ хОчУ ЧиТаТь ЭтИ зАбОрЧиКи. Интервалы — п#z$@ц, границ между блоками вообще не видно. Где комментарии, где пост, не понять.
    Плотность информации упала в разы — читать по диагонали стало невозможно, а точнее не даёт прироста скорости. Похоже буду читать хабр не на сайте, а через агрегаторы, а если не получится, то ну нахер.
    P.S. Пока писал жирность пофиксили, но всё так же плохо читается.
    Редизайн Хабрахабра и Гиктаймс. Финишная прямая
  • +5
    Без знаний вам даже в голову не придёт, что вам нужно умножать матрицы. Я видел код, где из двух матриц трансформации вытаскивались компоненты сдвига и скейла, чтобы просуммировать руками и создать из них матрицу. В то время как надо было просто перемножить исходные. Это проще, это быстрее писать, быстрее работает. Или поиск минимума через сортировку массива. Такое сплошь и рядом, но это же полный бред. С точки зрения абстракций всё хорошо, так как очень мало кто включает алгоритмическую сложность в свой интерфейс.

    Абстракции это очень важно, но это два ортогональных навыка: абстракции программирования и математическая подготовка.
    Эти токсичные, токсичные собеседования
  • +1
    А я нигде и не писал про знание алгоритмов. Алгоритмические задачки они именно про мышление, а не знание. Чтобы написать бинарный поиск или какую-нибудь сортировку нужно именно мышление. А за одно и проверка опыта обработки краевых случаев, знания известных проблем (все возможные переполнения и выходы за границу). Такие алгоритмы выявляют массу проблем, которые будут встречаться в коде.
    Эти токсичные, токсичные собеседования
  • –5
    Видите ли в чём дело, обычно не перемножают. А того, кто этим занимается каждый день, нужно спрашивать более сложные вещи. Проблема часто не может быть решена на том уровне, на котором создана. То есть квалификация кандидата должна быть выше, чем уровень повседневных задач. Кроме того это индикатор общих и частных знаний — насколько глубоко человек погружается в ту или иную тему, на сколько интересуется смежными. Умножение матриц действительно считаю минимальным возможным знанием в геометрии и алгебре. Так же как и геометрический смысл и идею аффинных преобразований. Неспециалисту не надо влёт писать матрицу хитрой трансформации, но хотя бы представлять, как это работает.

    С большинством проблема — оно создаёт стереотипы и ожидания. И такие вот статьи укрепляют стереотипы, что можно особо не учиться и пойти работать, обесценивают высшее образование и тд и тп. Может вместо выкидывания вопросов из собеседования лучше просто поднять общий уровень и научить решать эти задачи? Может так мы поднимем общее качество софта, которым пользуемся?
    Эти токсичные, токсичные собеседования
  • –7
    <holywar>
    

    Ну вот опять 25. Почему все постоянно пишут, что алгоритмы никому не нужны. Если они не нужны вам, чтобы делать сайтики, то это не значит, что они не нужны никому. Я вот ни за что не возьму на работу человека, у которого есть высшее профильное образование, а он не знает, как оценить сложность алгоритма сортировки. Или высшее математическое без умения перемножить две матрицы на доске. Оба этих навыка мне нужны примерно раз в месяц, то есть постоянно. Отсутствие базовых навыков говорит о полном нежелании разбираться в том, как всё устроено.
    Ну и логические задачки тоже могут быть полезны. Далеко не всем и не везде, но обычно в команде нужен хотя бы один круто соображающий человек для решения нестандартных проблем. Дебаг редко воспроизводящегося бага — очень сложная логическая задача, иногда нужны не инструменты и опыт, а просто мозги. Разумеется опыт первичен, а алгоритмы и логика вторичны, если вам нужен работник прямо сейчас. А вот для джунов всё наоборот — можно научить умного интересующегося человека, но раскачать логику «опытному» программисту на грани невозможного.
    </holywar>
    
    Эти токсичные, токсичные собеседования
  • 0
    Отредактировано
    Вероятно нужны ещё скобочки, чтобы вызвать функцию на созданном объекте:
    double z=Add{ .y=20, .x=10 }();
    

    Перепутал оператор double с оператором (). Вот такое приведение кажется опасным. Ещё никогда операторы неявного приведения до добра не доводили.
    Но выглядит очень круто, никогда не смотрел на именованные аргументы с этой стороны.
    Типы struct, union и enum в Modern C++
  • +4
    Правила перегрузки со списками инициализации вообще безумные. То, что один элемент списка приводит к поиску других конструкторов, регулярно ломает код. Например:
    struct InitMap {
      using Map = map<string, string>;
      InitMap(Map m) {}
    };
    InitMap m({{"k", "v"}});
    

    Компилятору непонятно, то ли конструктор копирования звать, то ли конструктор от map. Добавляем «пустой» элемент:
    InitMap m({{"k", "v"}, {});
    

    И всё работает. Самая магия, что вариант
    InitMap m({{string("k"), "v"}});
    

    Работает, а приведение обоих элементов нет:
    InitMap m({{string("k"), string("v")}});
    

    Это всё объяснимо и после поллитра, а то и больше, даже понятно. Но лучше бы не усложняли инициализацию. Задача сделать универсальную инициализацию на все случаи жизни так и не решена. Куча мест, где в шаблонах нельзя бездумно написать {}, иногда ещё и две версии приходится делать.
    Списки инициализации в C++: хороший, плохой, злой
  • +1
    Спасибо за статью. Интересно.
    Не совсем понятен вопрос, в чём преимущество перед диапазонами? Вы сами про них упоминаете, но в чём их минусы? Почему бы не пользоваться ими?
    Там компонуемость лучше, написание функций проще и без макросов. Тот же пример из документации:
    std::vector<int> vi{1,2,3,4,5,6,7,8,9,10};
    using namespace ranges;
    auto rng = vi | view::remove_if([](int i){return i % 2 == 1;})
                  | view::transform([](int i){return std::to_string(i);});
    // rng == {"2","4","6","8","10"};
    

    Ничто не мешает пользоваться ими уже сейчас. Да, не в std, но ranges-v3 уже работающая header-only имплементация. Принести её в проект ничего не стоит.
    Элементы функционального программирования в C++: композиции отображений
  • 0
    А как же сравнение с недавним лидером: https://habrahabr.ru/company/mailru/blog/323242/
    Какой map быстрее, и есть ли альтернатива Judy
  • +2
    Может быть буду непопулярен с таким мнением, но: и что? Если мы не на эмбедед железе, то какое нам дело до размеров виртуальной таблицы? На скорость это, конечно, влияет, но как сильно? Интересно было бы посмотреть на бенчмарки, желательно из реального кода, где кроме вызовов есть что-то ещё. Порог скорости при переходе с невиртуального вызвова, который потенциально инлайнится, на виртуальный мне понятен. А как влияет размер vtbl угадывать не возьмусь.
    Виртуальность и оверхед
  • 0
    О.П.С.О.СОВ

    Не совсем по теме, но как вы это расшифровываете? Я знаю ОПераторов СОтовой Связи. А какой смысл вы вкладываете в эти буквы с такой расстановкой точек? Не троллинг и не придирки, действительно интересны альтернативные варианты.
    История SMS: как передать текст по голосовому каналу
  • 0
    Сколь угодно точно == так точно как кому-то угодно == с точностью до любого заданного эпсилон. Любое измерение представимо рациональным числом с любой заданной точностью. Даже если измеряемая сущность иррациональна мы можем сколь угодно точно приблизиться к ней.
    Просто возьмите их определение из вики — оно такое, как вы и хотите.

    Иррациона́льное число́ — это вещественное число, которое не является рациональным

    Бесхвостая кошка — кошка без хвоста. Определение вещественного числа на вики уже совсем не математическое, а абстрактное и данное для обывателя. А строгие определения там очень даже используют пределы. Самое простое — замыкание рациональных чисел.
    В реальном мире движение происходит, по всей видимости, в системе конечно-малых

    Лихо вы к квантованию пространства перешли! Трактовать Зенона можно очень по разному. И мне кажется, что он просто показал, что нельзя говорить о полёте стрелы просто как о моментах нахождения стрелы в заданной точке. Иначе в каждый момент времени стрела стоит и никогда не долетит. Про это ещё Аристотель говорил.
    Пределы решают проблему полностью, потому что спокойно позволяют просуммировать ряд по времени и показать, что величина конечна и «Ахиллес обгонит черепаху». Просто во времена Зенона не могли и подумать о суммировании бесконечного числа величин и получении конечного результата.
    Я должен знать, о чём ты думаешь: прозрачность мышления ИИ как необходимое условие
  • 0
    Сборка мусора в планах, но в основном для взаимодействия с JS. https://github.com/WebAssembly/design/blob/master/GC.md
    Сейчас модель памяти сишная, то есть без сборки мусора, но с указателями и адресной арифметикой.
    Пробуем делать web-frontend на Rust (WebAssembly)
  • 0
    Долго гуглил, но так и не смог понять: какой из вариантов корутин обсуждается? Было два: бустовый и microsoft'овский, и точно были холивары, который лучше и правильнее. Будут у нас слова co_async, co_await или нет?
    Что приняли в C++17, фотография Бьярне Страуструпа и опрос для C++20
  • 0
    Если вам нужна глубина в сцене, то забудьте о батчинге.

    Вот за это я и не люблю Unity (и все подобные комбаины «для простого старта»). Нет никакой проблемы батчить изометрию. Знаю проект, где вообще за 2 draw call'а сцена на 10 000 изометрических спрайтов с анимацией рисуется. Там безумное перекрытие объектов друг другом (over draw > 70). Но это всё оптимизируется и выпиливается, в итоге нет никакого over draw, нет тысяч вызовов. Одна проблема — этот подход требует скилов и очень гибкого движка. В случае с юнити единственный выход — уйти в C++, получить контекст и нарисовать всё самому. Но если так рисовать всю игру, то зачем вообще фреймвёрк?
    Сложности при создании изометрической игры в Unity
  • 0
    Ну как бы уже не остался.
    Задачи «на логику» сами должны быть чёткими и логичными. Потому что без внесения достаточного уровня абстракции они просто не работают. Невозможно идти постоянно на северо-восток: кроме гор и морей мы упрёмся ещё и в дискретность шага. Если корректировки очень редки, то можно вообще никогда не остановиться. Математика это не влезание в голову к спрашивающему, а работа только своей.
    Общение с заказчиком это не головоломка, не математическая задача, это совершенно ортогональный навык. Там как раз наоборот требования нелогичны и противоречивы и часто вообще не соотносятся с тем, что действительно удовлетворит потребности. И безполезно лезть в голову к кому-либо, там всё равно ответа нет. Его надо создать.
    А «кодер» как раз ищет наиболее простое логичное решение в задаче. Например, (A, B) = (B, A), потому что «в моём языке так можно».
    Все программисты попадают в #ТАЙ
  • 0
    Формулировка задач страдает от недосказанности и неточности. Что такое переменная и «классическая математика»? В математической нотации все значения неизменяемы. Может вы хотели ограничиться простыми арифметическими операторами +-*/ и императивным ЯП?
    Что такое идти на северо-восток? У этого понятия есть 2 трактовки: выбрать направление и идти, не сворачивая; и ваш вариант с непрерывной корректировкой. Про магнитный полюс тоже уже написали выше.
    Все программисты попадают в #ТАЙ
  • 0
    Он не такой и сложный. По крайней мере читать научиться можно быстро. Про разговор не знаю, я только читал и писал :), что всё это значило понятия не имею. Мы, между прочим, их цифрами пользуемся. Видоизменёнными кончено, но вот как выглядят их цифры сейчас: ० १ २ ३ ४ ५ ६ ७ ८ ९
    Кое-что вывернуто, но вполне читаемо.
    Локализация Unity-игры на хинди
  • +2
    Занимался как-то тем же самым. Только у нас ещё и bitmap шрифты были. То есть надо было все возможные графемы затолкать, а потом рендерер научить их мёржить. Как до, так и после этой работы, считал, что никогда не надо писать свои рендереры шрифтов. Да, мы добились успеха и многие подтвердили, что рисуем правильно, но невозможно забыть тот месяц, когда хинди стоял третьей раскладкой клавиатуры в системы на равне с RU и ENG. Там же каждая гласная может модифицировать написание предыдущей согласной, (и) меняет порядок, (р) хоть и согласная, но умеет сливаться с другими согласнымии и с самой собой. Как оказалось, word неправильно рисует длинные последовательности из этой (р), да и вообще ошибки много где нашлись, видимо потому, что в языке не встречается.
    По этой причине мне кажется, что подход с фиксированной таблицей в статье не может работать. Общее количество возможных лигатур в деванагари колоссально, их надо уметь рисовать на ходу. Та же шапочка у (и) вообще-то имеет очень много разных длин, так как она относится к слогу, и между ней и согласной может быть ещё пачка графем. Хотя на это обычно забивают.
    Вариативность у (р) с отсечением матры (|) вообще безумная и часто своя для каждой пары.
    Это, кстати, оказалось даже рентабельно. Индусов много.
    Локализация Unity-игры на хинди
  • +1
    Не стоит считать производительность по количеству инструкций. Одна инструкция div (divq) требует десятки тактов, тогда как большинство битовых — 1 такт.
    Я написал самую быструю хеш-таблицу
  • +6
    Огромное спасибо за перевод. Собирался переводить эту статью для хабра, но вы опередили.
    Что касается темы, то удивительно, что в этой области ещё столько простора для исследований и оптимизаций. Казалось бы структура данных, старая как мир, уже не может быть улучшена. Не сказал бы, что использованные в статье техники очень сложные или тянут на докторскую. Просто оптимизации, а значит есть куда расти дальше.
    Я написал самую быструю хеш-таблицу
  • 0
    взять JS код, распарсить его с помощью D при компиляции

    Где-то на этом месте ничего не получится :)
    Это кончено возможно, но применимо только для ненормального программирования. AOT оптимизации в JS почти невозможны без изменения поведения кода. Парсинг в D превратится в ещё одну виртуальную машину. Слишком уж он динамичный и многое себе позволяет. Если же ввести ограничения на код, не давать менять типы в рантайме, добавлять свойства и тд, то может и получится. Только с такими ограничениями проще сразу на D писать.
    Метарегулярные выражения на D
  • +2
    Не зависят. С концептами лучше, но работают и без них. Достаточно брать с гитхаба. Там всё макросами завёрнуто, поэтому работает даже на старых компилерах. Так что ranges-v3 однозначно лучше того, что предложено в статье. И судя по моим бенчмаркам очень резво работает.
    Простая реализация Stream из Java 8 в С++
  • 0
    Поделитесь пожалуйста ссылкой или хотябы названием мануала. В гугле не забанили, но хочется быть уверенным, что я нашёл то, что надо.
    10 грехов в системах навигации сайтов / приложений
  • 0
    Во-первых, измерить иррациональную величину невозможно. Измерение — процесс сверения с эталоном. Сколько эталонов помещается, такова и величина. Поэтому результат измерений всегда рационален. Вы можете ввести иррациональный эталон (иррационален он относительнодругого, например гипотенуза относительно катета), но количество эталонов в измеряемой величине будет рациональным. А как уже ответили, плотность множества рациональных позволяет сколь угодно точно измерить что-угодно.
    Во-вторых, по поводу интуитивности. Попробуйте описать множество иррациональных чисел, не вводя определение предела или других контринтуитивных идей. Даже через геометрические интерпретации + корни рациональных уравнений вы не опишете всех. А предел — довольно сложная идея, которая решила всевозможные апории Зенона и им подобные.
    Я должен знать, о чём ты думаешь: прозрачность мышления ИИ как необходимое условие
  • 0
    С этой точки зрения оно мало чем отличается от бесконечной дроби 0.(3).

    В том-то и дело, что отличается. Любое рациональное число представимо обыкновенной дробью. 0.3(3) — не более чем запись числа 1/3. Одна из многих. Так же как 0.9(9) — другая запись 1. Я всё ещё могу сказать, что 1 карандаш — треть от пачки из 3-х карандашей.
    Рациональное число — всегда количество долей чего-то в чём-то. Оно интуитивно, потому что люди осознают только целые, а это просто способ на пальцах посчитать доли. Иррациональные числа не представимы никакой дробью. Нельзя сказать, что это доля чего-то. Считалось, что рациональных чисел достаточно для оперирования геометрии, а оказалось, что нет. Абстракция отрезка и описывающего его числа развалилась, они перестали быть тождественны.
    Я должен знать, о чём ты думаешь: прозрачность мышления ИИ как необходимое условие
  • +2
    А зачем? Может стоит возвращать константную ссылку, чтобы подобного не происходило? Или это замысел такой?
    Иммутабельные данные в C++
  • +3
    Вы очень сильно недооцениваете влияние философии. Понятно, что большинство современных философов сильно отстали от науки и не в состоянии что-либо объяснять. Однако, существует множество вопросов, поставленных точными дисциплинами, ответы на которые выходят за их рамки. Например, проблема корня из 2 и появления иррациональных чисел в математике. У математики нет проблем с иррациональностью, она с ней работает. А вот интерпретация и осознание этих величин — вопрос скорее философский. Когда-то он переворачивал мировоззрение и представления об устройстве мира.
    Точно так же квантовая физика и подтверждение неравенства Белла перевернуло мировоззрение в ХХ веке. Детерминизм как идея мироздания умер. Сейчас мы сталкиваемся с ещё более запутанными свойствами мира в физике и сложной сущностью ИИ в технике. И вопрос осознания явлений — всё ещё вотчина философии. Просто она становится всё сложнее и сложнее.
    Я должен знать, о чём ты думаешь: прозрачность мышления ИИ как необходимое условие
  • 0
    Ожидал увидеть что-то вроде https://github.com/libffcall/libffcall
    Там в рантайме генерируется код для каждого использования, что позволяет передать замыкание туда, где ожидается обычная сишная функция, не предусматривающая пользовательских данных. Руки чешутся начать использовать, но уровень шаманства отпугивает.
    Передаем указатели на функции-члены в C API
  • +3
    Спасибо за статью, радикальный подход!
    Проясните, пожалуйста, следующий момент:
    test().setX(1000); // не поменяет исходный объект
    

    Что такое setX на неизменяемом объекте? Какой объект поменяется? Я ожидал увидеть здесь ошибку компиляции, так как не константные методы не должны работать на immutable.
    Иммутабельные данные в C++
  • +5
    Это касается не только обучения. Часто намеренно оставляю задачу незавершённой чтобы вернуться к ней на следующий день. Это позволяет легче вернуться в контекст работы. Если же приходишь на работу и тебе надо начинать что-то с нуля, но настраиваться сложнее. Главное правило — не оставлять больше одной задачи, то есть не превращать в откладывание на потом. Незавершённая работа — закладка в книге, их не может быть больше одной.
    Эффект Зейгарник на практике
  • +2
    Начал использовать Catch только благодаря header-only. Ваша реализация тоже выглядит достойно, возможно попробую.
    dock: простая библиотека модульного тестирования кода на С++
  • +2
    Для окружности достаточно взять всего 2 точки, определяемые касательными к окружности из точки обзора. Их придётся менять при сдвиге точки, но для этих расчётов не критично. Это в целом привычная практика по-разному обрабатывать окружности и полигоны, и хотя в рендеринге окружность тоже полигон, в модели она может оставаться идеальной окружностью.
    Эффективный расчёт области видимости и линии взгляда в играх
  • 0
    Вы привели отличный пример, для чего и были созданы итераторы в шарпе: тяжёлые асинхронные операции. В них мелочи вроде косвенного вызова или даже боксинг совсем незаметны. Но если нам нужна всего лишь ленивая конкатенация, то накладные расходы становятся больше простого взятия символа из строки.
    Идиома Ranges
  • +1
    Не буду утверждать со стопрцентной уверенностью, но скорее всего это влияние стандарта С++11. Поддержка многопоточности сломала некоторые оптимизации в стандартной библиотеке, например, copy on write. Скорее всего в конкатенации тоже что-то поменялось. Я постараюсь сегодня повторить бенчмарки, тогда можно будет сравнить дизасм.
    Идиома Ranges
  • 0
    Здесь имеется в виду проблема С++ итераторов, описанная параграфом выше. Итератор не может сказать, валиден ли он. Для итерирования всегда нужна пара, иначе не остановиться. В С# такого нет, в нём один объект итератора полностью отвечает и за взятие следующего, и за остановку. Буду рад узнать название лучше, чем целостность.
    Идиома Ranges
  • +1
    Согласен, про контексты не корректно выразился. Я имею в виду yeild. Это по сути аналог переключения контекстов потоков, только для корутин. Дешевле, но не бесплатно.
    Идиома Ranges