Как отмечали другие авторы, массивы JavaScript являются основным узким местом производительности для выполняемых вами операций.Поскольку они динамические, доступ к элементам, естественно, гораздо медленнее, чем со статическими массивами Java.
Хорошая новость заключается в том, что в JavaScript появляется новый стандарт для статически типизированных массивов, который уже поддерживается в некоторых браузерах.Хотя это еще не поддерживается в самом Node, вы можете легко добавить их с помощью библиотеки: https://github.com/tlrobinson/v8-typed-array
После установки typed-array
через npm, вот моя модифицированная версия вашего кода:
{Float32Array} = require 'typed-array'
genHeightField = (sz) ->
timeStart = new Date()
DATA_SIZE = sz
SEED = 1000.0
iters = 0
# Initialize 2D array of floats
data = new Array(DATA_SIZE)
for rows in [0...DATA_SIZE]
data[rows] = new Float32Array(DATA_SIZE)
for cols in [0...DATA_SIZE]
data[rows][cols] = 0
# The rest is the same...
Ключевой строкой там является объявление data[rows]
.
Со строкой data[rows] = new Array(DATA_SIZE)
(по существу, эквивалентной оригиналу) я получаю номера тестов:
17
75
417
1376
5461
Ипо линии data[rows] = new Float32Array(DATA_SIZE)
я получаю
19
47
215
855
3452
Так что одно небольшое изменение сокращает время работы примерно на 1/3, то есть увеличение скорости на 50%!
Это все еще неJava, но это довольно существенное улучшение.Ожидайте, что будущие версии Node / V8 уменьшат разрыв в производительности.
Предупреждение: Следует отметить, что обычные числа JS имеют двойную точность, то есть 64-битные числа с плавающей запятой.Использование Float32Array
, таким образом, снизит точность, сделав это в некотором смысле сравнением яблок и апельсинов - я не знаю, насколько повышение производительности связано с использованием 32-разрядной математики, а сколько - с более быстрым доступом к массиву.Float64Array
является частью спецификации V8, но еще не реализован в библиотеке v8-typed-array .)