Я портирую часть моего кода 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, что является ...
Как вы на самом деле это испытали? Вы уверены, что это не 'Math.random()', называемое 100 тыс. Раз, что вызывает проблемы с производительностью? – Rob
@Rob Немедленно удалить 'bubbleSort' и его завершение. – wcochran
Сообщение с «пузырьковой сортировкой» и «исполнением» кажется оксюмороном. – user949300