Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   От чего такая разница? (https://javascript.ru/forum/misc/29457-ot-chego-takaya-raznica.html)

9xakep 28.06.2012 14:58

От чего такая разница?
 
Почему массив в опере обрабатывается в 100 раз медленне чем в Firefox и chrome?
var arr = []
for (i=0;i<1000000;i++) arr[i] = i
console.time('test1')
for (i=0;i<arr.length;i++) arr[i]
console.timeEnd('test1')
//
* Opera 12: ~700ms
* Firefoz 14: 6-8 ms, ~7ms
* Google Chrome 19: 7ms

Deff 28.06.2012 15:14

9xakep,
Он в консоле поди медленней, посколь там Dragonfly параллельно тестит все переходы и ошибки
пробуй через document.write или appendChild в div выводить

melky 28.06.2012 15:57

потестим :

var arr = [], i, started, len;

for (i=0; i < 1e6; i += 1) arr[i] = i;

started = Date.now();
for (i=0 ;i < arr.length; i += 1) arr[i];
alert("Прошли массив с проверкой св-а length :  " + (Date.now() - started) + " ms");
/*
FF : 9
CH: 36
OP : 220
*/



started = Date.now();
for (i=0 ;i in arr; i += 1) arr[i];
alert("Прошли массив с проверкой in :  " + (Date.now() - started) + " ms");
/*
FF : 11
CH : 100
OP : 409
*/

started = Date.now();
for (i=0, len = arr.length;i < len; i += 1) arr[i];
alert("Прошли массив с кешированием length :  " + (Date.now() - started) + " ms");
/*
FF : 9
CH : 33
OP : 237
*/

что за фигня? Linux x86_64.

9xakep 28.06.2012 16:11

А я сейчас читаю Стояна Стефанова, по твоему совету ктстати) Там сказано, что гораздо оптимальнее делать так:
var arr = [], length, time;
for (i=0;i<1e7;i++) arr[i]
length = arr.length // объявить длину вначале, а не обращаться к ней каждый раз
time = Date.now();
for (i=0;i<length;i++) arr[i]
alert(Date.now() - time+'ms')

Deff,
var arr = [], time

for (i=0;i<1000000;i++) arr[i] = i
time = Date.now();
for (i=0;i<arr.length;i++) arr[i]
alert(Date.now()-time+'ms') 
/*
* Opera 12: 202 ms
* Chrome 20: 22 ms
* FireFox 14: 6 ms
* O_O_O_O *
*/

Я почему-то всегда считал, что она лидирует в скорости обработки js

tadjik1 28.06.2012 16:14

круто-круто)) а какая опера, melky?

tadjik1 28.06.2012 16:16

Цитата:

Сообщение от 9xakep
) Там сказано, что гораздо оптимальнее делать так:
var arr = [], length, time;

так делать совсем необязательно, свойство «длина» сохраняется в кеше интерпретатора браузера, это никак не влияет на циклы.
http://2012.jsconf.us/
Vyacheslav Egorov - One day of life in V8

ну да, как минимум для в8)

melky 28.06.2012 16:17

Цитата:

Сообщение от 9xakep
А я сейчас читаю Стояна Стефанова, по твоему совету ктстати) Там сказано, что гораздо оптимальнее делать так:

отлично :) этот совет устарел, ибо браузеры кешируют длину. об этом там написано, вроде

Цитата:

Сообщение от tadjik1 (Сообщение 184936)
круто-круто)) а какая опера, melky?

Цитата:

[melky@colch ~]$ opera --version
Opera 12.00 Build 1467 for Linux x86_64.

Deff 28.06.2012 16:19

melky,
Cовет тот жа - выведи не через алерт а в div

9xakep 28.06.2012 16:22

Цитата:

Сообщение от melky
отлично этот совет устарел, ибо браузеры кешируют длину. об этом там написано, вроде

неа...мб издание старое..2011 год.
ссыль
Deff,
<div id='res'>

</div>
<script>
var arr = [], time

for (i=0;i<1000000;i++) arr[i] = i
time = Date.now();
for (i=0;i<arr.length;i++) arr[i]
document.getElementById('res').innerHTML = (Date.now()-time)
/* омг
* Opera: ~600ms
* Chrome: ~6ms
* Firefox: ~6 ms
*/
</script>

melky 28.06.2012 16:27



ПРОШУ ВСЕМ ПОКЛИКАТЬ
http://jsperf.com/array-iteration-comp





Цитата:

Сообщение от tadjik1
так делать совсем необязательно, свойство «длина» сохраняется в кеше интерпретатора браузера, это никак не влияет на циклы.

судя по тестам, только в V8. я думал, везде уже так.

Цитата:

Сообщение от Deff (Сообщение 184942)
melky,
Cовет тот жа - выведи не через алерт а в div

я сунул в jsperf, там будет ровнее статистика


Часовой пояс GMT +3, время: 01:31.