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, там будет ровнее статистика

9xakep 28.06.2012 16:50

melky,
tadjik1,
да, вы правы. У Вячеслава Егорова(на сайте, что дал tadjik1) 5:10, он начинает говорить об этом, и говорит, что браузер кеширует длину.

Deff 28.06.2012 16:51

melky,
Просто об аlert-
1. Открытие модального окна в Опере - куча проверок, да и само создание элемента это время
9xakep,

Цитата:

Сообщение от 9xakep
ссыль
Deff,


9xakep 28.06.2012 16:55

Deff,
лол, а на локалке 600.
Сейчас с 12 зашел, результат: 21 ms.

9xakep 28.06.2012 17:10

melky,
И кстати, в книге написано, мол лучше использовать: +=, нежели: ++, почему? Сказано, что оптимизация, но за счет чего?...

melky 28.06.2012 18:30

Цитата:

Сообщение от 9xakep (Сообщение 184984)
melky,
И кстати, в книге написано, мол лучше использовать: +=, нежели: ++, почему? Сказано, что оптимизация, но за счет чего?...

+= очевиднее. а вот быстрее, или нет, нужно замерять :)

9xakep 28.06.2012 20:37

melky,

9xakep 28.06.2012 20:42

melky,
лол, += быстрее гораздо)
<div id='res'>

</div>
<script>
/*
* Chrome: 90 / 9
* Opera: 30 / 20
* Firefox: 15 / 5
*/
var arr = [], l = 1e6, time;
time = Date.now()
for (i = 0; i < l; i++) arr[i] = i
document.getElementById('res').innerHTML = (Date.now() - time)

time = Date.now();
for (i = 0; i < l; i+=1) arr[i] = i
document.getElementById('res').innerHTML += "<br>" + (Date.now() - time)
</script>

B@rmaley.e><e 28.06.2012 20:55

ORLY?
<div id='res'>

</div>
<script>
var arr = [], l = 1e6, time;

time = Date.now();
for (i = 0; i < l; i+=1) arr[i] = i
document.getElementById('res').innerHTML += "<br>" + (Date.now() - time)

time = Date.now()
for (i = 0; i < l; i++) arr[i] = i
document.getElementById('res').innerHTML += "<br>" + (Date.now() - time)
</script>
Немного пищи для размышлений:
<div id='res'>

</div>
<script>
var arr = [], l = 1e6, time, element = document.getElementById('res');

time = Date.now();
for (i = 0; i < l; i+=1) arr[i] = i
element.innerHTML += "<br>" + (Date.now() - time)

time = Date.now()
for (i = 0; i < l; i++) arr[i] = i
element.innerHTML += "<br>" + (Date.now() - time)

time = Date.now()
for (i = 0; i < l; ++i) arr[i] = i
element.innerHTML += "<br>" + (Date.now() - time)

time = Date.now();
for (i = 0; i < l; i+=1) arr[i] = i
element.innerHTML += "<br>" + (Date.now() - time)
</script>


Хватит думать, что Вы умнее компилятора.

Deff 28.06.2012 20:59




9xakep 28.06.2012 21:00

B@rmaley.e><e,
wtf? Что за магия?
И что это значит? i &lt; знак закодировался что ли...? И все же почему так?
Deff,
так в том то и дело, что он поменял местами действия :)

Deff 28.06.2012 21:03

Цитата:

Сообщение от 9xakep
i &lt;

тож что и <

B@rmaley.e><e 28.06.2012 21:03

Chromium


9xakep, это значит, что компилятор умнее Вас и знает, что, как и когда нужно оптимизировать. Лучше не мешайте ему.
А все Ваши "тесты" без подкрепления аргументами в виде описания проводимых движком оптимизаций не стоят ни гроша.

&lt; — это всё парсер лох.

9xakep 28.06.2012 23:10

B@rmaley.e><e,
да я и не говорил, что умнее компилятора, лучше бы сразу сказали, что к чему, чем начинать оскорблять. :-E

Deff 28.06.2012 23:27

9xakep,
Оскорбили парсер, а отнюдь не тебя! (В некоторых вариантах парсер увеличивает длину кода

9xakep 28.06.2012 23:44

Deff,
эм...что?) Я не оскорблял парсер...
Или я туплю уже

Deff 28.06.2012 23:47

Цитата:

Сообщение от B@rmaley.e><e
&lt; — это всё парсер == лох.

9xakep, Так понятней ?

9xakep 28.06.2012 23:54

Deff,
Это я и так понял, только не я его оскорбил...Ладно пофиг, я действительно сейчас туплю)

melky 29.06.2012 05:53

Цитата:

Сообщение от B@rmaley.e><e
Немного пищи для размышлений:

и что Вы хотели своей пищей нам показать? случайность времени выполнения давно просекли, только непонятно, откуда она берётся.

<div id="el"></div>
<script>
var arr = [], l = 1e6, timee, buffer, elem = document.getElementById("el"),id;

id = setInterval(function tick() {
    time = Date.now();
    for (i = 0; i < l; i += 1) arr[i] = i;
    buffer = "<br>" + (Date.now() - time);
    elem.innerHTML += buffer;
}, 1000);

elem.onclick = function() { clearInterval(id); };
</script>

Вывод :
Код:

25
9
8
8
9
8
9
8
9
....


B@rmaley.e><e 29.06.2012 07:13

Цитата:

Сообщение от melky
случайность времени выполнения давно просекли, только непонятно, откуда она берётся.

Надо понимать, что тут происходит. Память под 1 000 000 чисел не будет выделена одним куском, поэтому в первом цикле неизбежны тормоза из-за её выделения.
А сравнивать производительность i++, ++i и i+=1 глупо — компилятор вполне может определить, где можно использовать более быстрый способ инкремента.


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