próbowałem następny kod (to pokazuje podobne rezultaty w Google Chrome i nodejs):Praca z tablicami w V8 (emisja wydajność)
var t = new Array(200000); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 27839.499ms
undefined
również prowadzona Kolejne testy:
var t = []; console.time('wtf'); for (var i = 0; i < 400000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 449.948ms
undefined
var t = []; console.time('wtf'); for (var i = 0; i < 400000; ++i) {t.push(undefined);} console.timeEnd('wtf');
wtf: 406.710ms
undefined
ale w Firefox wszystko wygląda dobrze w pierwszym wariancie:
>>> var t = new Array(200000); console.time('wtf'); ...{t.push(Math.random());} console.timeEnd('wtf');
wtf: 602ms
Co dzieje się w V8?
UPD * magicznie zmniejszając wydajność *
var t = new Array(99999); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 220.936ms
undefined
var t = new Array(100000); t[99999] = 1; console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 1731.641ms
undefined
var t = new Array(100001); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 1703.336ms
undefined
var t = new Array(180000); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 1725.107ms
undefined
var t = new Array(181000); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 27587.669ms
undefined
Dlaczego chcesz 'new Array (200000)'? Nie robi nic poza ustawieniem 'length'. (Na przykład nie wstępnie alokuje pamięci, ponieważ tablice nie są tak naprawdę tablicami). –
Napisałem ten kod tylko do testu. Zastanawiam się, dlaczego pokazuje tak straszną wydajność. – yttrium
Muszę wyjść i nie mam czasu na odpowiedź, ale odpowiedź jest prosta. V8 cofa się do rzadkich tablic w pierwszym przykładzie i optymalizuje do C jak sekwencyjne tablice pamięci w twoim drugim. Zobacz https://code.google.com/p/v8/source/browse/trunk/src/array.js, –