Как стать автором
Обновить

Комментарии 34

Вот из-за этого почти никогда не использую map, reduce и filter.

А что с in? Вы не замеряли?

Нет, не замерял, ни в рамках подготовки статьи, ни в рамках разработки библиотеки.
Функционал просто стараюсь наращивать итерациями — когда время есть:)

Может скорее всего strict сыграть свою роль на производительность, хотя я не проверял(нету данных по производительности). В strict режиме не работает for const i of stack, а без strict const выполняется как let или var.

Мы пишем код для машин или для людей?
Я согласен, что местами в этом есть необходимость. В большинстве же случаев вполне хватает нативных конструкций.

Полностью с вами солидарен.
Но, в моем случае, я писал библиотеку, и, следовательно, интерфейсы я пишу для людей, а реализации для машины. И, думаю, если реализация окажется медленной, то Вас эстетическая сторона кода вообще интересовать не станет — вы просто выберете библиотеку побыстрее:)

Я не по поводу библиотеки)
Я писал касательно не использовать map, reduce и filter )
Ваша библиотека по результатам бенчмаркинга вызвала интерес у меня)

Для всего есть время и место.
Как видите, на массивах размером < 25k элементов вообще не стоит выбора что использовать — нативные методы обгоняют любые другие реализации.
Но если стоит вопрос о том, что отработать надо шустро, а элементов в массиве много, то лучше проверить наличие альтернатив:)
Да и я не призывал избегать map, filter и reduce, пост написан исключительно с целью предостеречь, мол «осторожно, может произойти и так»

Мой комментарий адресован Full-R

Я не пропагандирую начать создавать web на ассемблере вместо предназначенных для этого ООП языков и их обвязки, я за экологию и экономию заряда батареи не смотря на то, что вода уже кипит и ток мчится по проводам неперывно. Платим мы все равно ценой КВ в час.

Время чтения и понимания кода вы учитываете ?)

У меня свой собственный framework на архитектуре Kernel<Model<View и в данном случае обвязка интерфейса и беготня по циклам не относится к тому, что я бы хотел позволить разрабатывать кому-то на сахаре. Есть также более высокоуровневые функции для работы с ядром. Для бэкенда, например, все самое интересное начинается на API моделей, которые по сути транслируют в JOINы(для выборки) через ядерный компонент движка БД. Для frontend это, к примеру методы detach для event, которые по хэшу md5 элементов и приатаченых функций лопатят сотни HTML элементов. И там все на for потому, что это разумно для моего полностью динамического интерфейса и вам не надо понимать как это работает потому что API простое и удобное. Я написал анонс в песочницу, но меня пока не публикуют. Но вообще то, что торчит из ядра обычно уже есть сахар и обвязка более простая чем Kernel Parts — с читабельностью и осмысленностью API проблем нет, а код выполняется даже с подключением к БД на бэкенд, который создан по принципу SPL ценой 1Мб памяти и 0.003 секунды после кэширования на самом дешёвом Linux хостинге. Если анонс опубликуют — можем подискуссировать о подходах. Сейчас здесь не место — это территория автора статьи. Спасибо ему, кстати.

И, что более важно, в большинстве случаев речь о коллекциях до сотни элементов. 50млн — в 0.001% случаев, наверное. Не использовать более понятные конструкции в таком случае — неразумно.

Качественно написанный нативный код всегда быстрее качественно написанного кода для виртуальной машины. А утверждать превосходство вм кода сравнивая разные алгоритмы для вм с неизвестно каким нативным кодом дело бесполезное

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

Код не смотрел, но видимо где-то закралось кеширование или оптимизация. Но это не отменяет того, что используется for-конструкция, следовательно, не совсем корректно говорить, что она медленнее.

Можно ещё чуть чуть ускорить:
image


Оффтоп: Пожалуйста не используйте прозрачность на тексте. Это заставляет браузер текст растрировать. Из за этого у меня большая часть текста терялась при конвертации. Ну и на производительность прозрачность влияет.

Там прозрачность тексту нужна, чтобы выделение текста было видимо.

Я не о об этом:


[mol_textarea_edit] {
    color: transparent;
}

Это походу никак не влияет рендеринг по крайней мере пока текст не выделен.


А об этом:


[mol_text_type="code-punctuation"] {
    opacity: .5;
}

[mol_theme="$mol_theme_light"], :root {
    --mol_theme_text: rgba( 0 , 0 , 0 , .9 );
}

Если тут убрать прозрачность то тогда текст при конвертации в XPS остаётся текстом.

А, убрать полупрозрачность, хорошо.

С тестированием здесь всё в порядке, просто нативные методы ещё дырки в массивах учитывают (дополнительная операция in), вот и оказываются медленнее.

Поли чем тут дырки в массиве, когда тестировалось на одинаковых массивах без дырок?

При том, что нативные методы не в курсе, что тест на массивах без дырок и операцию in выполняют всегда. Описанному в статье методу оптимизации нативных методов уже лет так восемь минимум.

Как обычно в случае с JIT-компиляцией, главным становится вопрос «как меряем», а не «как быстро работает код». Потому что все отличия в 10 раз на ровном месте всего лишь представляют из себя случай, когда Benchmark.js не смог воспрепятствовать JIT-оптимизациям по прогоняемому коду для одних случаев, и смог для других.
Я потому и замерял все по 10 раз.
А средние выводил из межквартильного размаха, чтобы убрать самые быстрые и самые медленные выбросы.
Таким образом — статистика основанна на средних значениях.
Я потому и замерял все по 10 раз.

Это ничего не меняет. Если определенный прогон проходит определенные JIT-оптимизации, то 10 раз он тоже их будет проходить. Вы же не думаете, что на работу компилятора влияет фаза луны?

Лично я научился осторожно относиться к бенчмаркам JS еще во времена, когда JIT-компиляция только началась, и я собственными глазами на продовом коде увидел, как два очень-очень похожих по вычислительной сложности алгоритма отличались по производительности на два порядка. Просто потому, что на один из сразу же набрасывался компилятор, а на второй почему-то не набрасывался.
Понял, спасибо большое — учту.

Чет сложно придумывается кейс даже для массивов из 50к элементов, разве что язык в этой точке уже немного не по назначению используется. Ну и это — как идея, почему бы вам в вашей библиотеке не проверять размер массива и не выбирать соответсвющую реализацию исходя из него, если вдруг 10кк сценарии таки имеют место быть.

В разных окружениях будут разные результаты: node, chrome, Firefox
Так же, разные (как ни странно) результаты будут в зависимости от того, что именно происходит внутри цикла — например, если вынести все операции в отдельную функцию

Я очень рекомендую почитать блог Вячеслава Егорова — mrale.ph всем, кто интересуется данной темой. Освещена тема внутреннего устройства V8 движка, производительности и написания правильных бенчмарков. Может mraleph тоже сюда заглянет.

Насколько я знаю, мистер Алеф давно перешёл из группы V8 в группу Дарт, и с тех пор многое могло поменяться. Но некоторые его описания остаются актуальными, да.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории