2014-10-05 2 views
5

Я портирую часть моего кода OpenGL на WebGL, и тот факт, что JavaScript не имеет подлинных массивов, печален. Я могу использовать Float32Array (и другие другие типы ArrayBuffer), но это не помогает производительности.Любой способ улучшить производительность массива JavaScript?

В качестве эксперимента для сравнения Array против Float32Array против Float64Array производительности, я приуроченная пузырь рода на 100000 поплавки, чтобы увидеть, есть ли разница:

function bubbleSort(array) { 
    var N = array.length; 
    for (var i = 0; i < N; i++) 
     for (var j = i; j < N-1; j++) 
      if (array[j] > array[j+1]) { 
       var tmp = array[j]; 
       array[j] = array[j+1]; 
       array[j+1] = tmp; 
      } 
} 

// var nums = new Array(100000);  // regular 'JS' array 
// var nums = new Float32Array(100000); // actual buffer of 32-bit floats 
var nums = new Float64Array(100000); // actual buffer of 64-bit floats 
for (var i = 0; i < nums.length; i++) 
    nums[i] = Math.random() * 1000; 

bubbleSort(nums); 

for (var i = 0; i < nums.length; i++) 
    console.log(nums[i]); 

Не большая разница. Действительно, компилятору понадобилась бы информация о статическом типе для аргумента array для bubbleSort, чтобы действительно получить достойную производительность. Мы просто застряли с плохой производительностью массива в JS? Как это обойти? Короткие использования asm.js, что является ...

+4

Как вы на самом деле это испытали? Вы уверены, что это не 'Math.random()', называемое 100 тыс. Раз, что вызывает проблемы с производительностью? – Rob

+1

@Rob Немедленно удалить 'bubbleSort' и его завершение. – wcochran

+2

Сообщение с «пузырьковой сортировкой» и «исполнением» кажется оксюмороном. – user949300

ответ

3

Вы должны увидеть этот ответ: What is the performance of Objects/Arrays in JavaScript? (specifically for Google V8)

В частности, следующие пункты:

  • Array.push (данные); быстрее, чем Array [nextIndex] = данные почти в 20 раз.
  • V8 записи массива немного быстрее, чем V8 читает

Так что да, это выглядит как массив индексации медленно JS. Если верно, что массив пишет быстрее, чем читает в тесте производительности, то, скорее всего, динамическое распределение не разборчиво, когда оно помещает данные (быстрее всего?), Тогда как когда дело доходит до чтения, это будет много адресов памяти для перехода между ними и так будет намного медленнее.

Мне было бы интересно узнать, объявите ли вы массив с использованием литерала синтаксиса [0, 1, 2, ..., 100000], будет ли производительность лучше?

(Я установил JSPerf, если у меня есть время).

+0

Отлично - спасибо! Представляю некоторые (ранние) реализации просто хешировал индекс, который обрабатывается как строка - тогда, конечно, удаление должно быть быстрым.Я тестировал w/Node, который использует V8. Больше испытаний .... – wcochran

Смежные вопросы