Почему такая большая разница в производительности между операциями с массивами браузеров? - PullRequest
0 голосов
/ 11 сентября 2018

Я настраивал свою библиотеку goodcore и настраивал некоторые тесты производительности для сравнения с собственными функциями массива.Затем я запустил их на своем ноутбуке с Edge, FF, Chrome и Node 10.9.Конечно, моя библиотека показала смешанные результаты, но что было более интересно, так это то, что разница между браузерами иногда в 30 раз превышала лучшие и худшие, и она, по-видимому, не различалась полностью между операциями.

Используемые массивы длиной 10000 со случайнымиот 0 до 100000.

РЕДАКТИРОВАТЬ Версии:

  • Хром: 68.0.3440.106
  • FF: 62.0
  • Edge: 41.16299.371.0
  • Узел: 10,9

Вот мои результаты (только для собственных операций):

РЕДАКТИРОВАТЬ: теперь с правильными значениями итакже пользовательские алгоритмы (без встроенного)

Graph1 Graph2

Данные показывают количество операций в секунду в Benchmark.js.

enter image description here

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

1 Ответ

0 голосов
/ 11 сентября 2018

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

Да.

Более длинный ответ: возможно, оба, но единственный способ ответить на него наверняка - детально рассмотреть реализацию каждого браузера.

Большие различия, которые вы измерили, в частности, выглядят так, как будто они могут быть связаны с принципиально различным выбором структур данных под капотом; однако даже при той же базовой структуре данных эффективность остальной части реализации может иметь огромное значение (я видел 10x - 100x).

Кроме того, ИМХО ваши результаты несколько подозрительны: Chrome и Node используют один и тот же движок V8 и должны иметь очень похожие характеристики. Результаты типа «indexOf» или «splice (remove 1)», где вы видите разницу примерно в 10 раз между тем, что должно быть примерно таким же результатом, указывают на то, что что-то может быть не так в ваших тестах. И если этим двум результатам нельзя доверять, то почему вы больше уверены в своих результатах Edge / Firefox?

Говоря о качестве эталона: использование только одного типа массива (только одного размера, только одного типа содержимого, всегда плотного) - еще одна причина, по которой ваши результаты, вероятно, не отражают полную историю; поэтому, пожалуйста, будьте осторожны, делая выводы из этого.

Почему такая большая разница в производительности

Потому что быстрые встроенные методы Array - это тонна инженерных усилий. Инженерная команда каждого браузера делает все возможное, чтобы тратить время на функциональность, которая, по их мнению, имеет наибольшее значение. В результате вы увидите различные степени оптимизации в различных реализациях.

Если есть различия в выбранных структурах данных под капотом (я не знаю), то это, как правило, компромиссы: один выбор может быть быстрее в X, но медленнее в Y, чем другой выбор; или один может быть быстрее, но потреблять больше памяти; и т.д.

...