Какой движок использует опера?
вот тут
http://habrahabr.ru/post/175403/ написано: Цитата:
Я щас обновил оперу до 12.17 и вижу Browser identification Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.17 непонято, перешли они или нет? По скорости движка особ не заметно: на одной и той же странице я проверил оперу и хром -- разница в обработке скриптов огромная, явно разые движки. Или че там за магия происходит? |
Цитата:
|
devote,
Спасибо, да скачал -- оказалось таким же тормозным говном как и хром. Жаль. |
Лол. Чуви, то, что твой код тормозит под v8 еще не значит, что Хром — тормозное говно.
|
Хром - тормозное говно! Дискач?
|
ixth,
Я тут немного подумал, и понял причину тормозов того кода, более или менее. Там вот что происходит. Если запущен цикл, браузер не может обработать пользовательский ввод. то есть, я жму на клаву, и события эти становяться в очередь. Изнутри цикла ты не сможешь захватить действия пользователя, события. Тут тупиковый вариант, архитектурная лажа. Следовательно, цикл по любому выполняется, что в хроме, что в фф, где угодно. А это значит, что V8 отсасывает не на чем то там космическо-волшебном, а на банальной обработке массива. Попросту говоря, он не умеет массивы. Как вариант -- регекспы. А нахрен, спрашивается, такой двиг нужен, если он сосет на ключевых вещах? |
Ох, щи… Правильно написанный код под v8 иногда даже рвет (неоптимизированный) нативный C++, ЕМНИМС. Покажи мне тесткейсы, на которых v8 по-твоему сосет.
|
ixth,
Тот код, который мы обсуждали, является, по сути, таким примером. В старой опере и фф тормозов нет. А тормоза там именно из-за скорости перебора в массиве. Возможно регекспы там добавляют тормозов, но хрен редьки не слаще. |
Знаешь что меня забавляет? Наблюдать как люди вокруг вместо того чтобы скромно следовать заветам Сократа и считать, что они ничего не знают, сразу находят причину своих проблем снаружи. Это, кажется, называется ресентимент. Я написал код, который тормозит и мне лень пораскинуть мозгами? Это все браузер виноват! Я не понимаю декларативного подхода? Нет, это просто тупой шаблонизатор! Грустно, в общем. В итоге хорошие вещи обычно оказываются оплеваны людьми, которые даже не попытались научиться их готовить.
Твой код тормозил по распространенной причине: ты пытался запихнуть в innerHTML СЛИШКОМ много. Браузер просто давился, пересчитывая DOM и все, что с этим связано. Бла-бла-бла, даже я не вдаюсь в причины. Решение — использовать ф-цию replaceHTML, которая делает странное. Найдешь ее в обновленном коде. http://jsfiddle.net/ainop/g41x6tto/5/ |
ixth,
Я уж не знаю, как этот чувачок там тестировал ЭТО, но мои тесты кагбэ не подтверждают, мягко говоря, его позицию. Видимо не случайно ссылка с реальными тестами у него ведет в никуда, а выложены только результаты. Вот мои результаты: ff: replace: 125ms inner: 47ms chrome: replace: 191.000ms inner: 91.000ms opera: replace: 257.000ms inner: 116.000ms старая опера: replace: 445ms (445010µsec) inner: 250ms (250109µsec) <html> <head> <title>Untitled</title> </head> <body> <div id="id"><div> <script> test=function(fu, i){ console.time(fu.name) while(i--){fu()} console.timeEnd(fu.name) } function replaceHtml(el, html) { var oldEl = typeof el === "string" ? document.getElementById(el) : el; /*@cc_on // Pure innerHTML is slightly faster in IE oldEl.innerHTML = html; return oldEl; @*/ var newEl = oldEl.cloneNode(false); newEl.innerHTML = html; oldEl.parentNode.replaceChild(newEl, oldEl); /* Since we just removed the old element from the DOM, return a reference to the new element, which can be used to restore variable references. */ return newEl; }; str="fooooooooooooooooooovvvvvmvmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmddssmxmxmxmxm" function replace(){replaceHtml("id", str)} function inner(){document.getElementById("id").innerHTML=str} i=10000 test(replace, i) test(inner, i) </script> </body> </html> По сабжу: новый код ничуть визуально не отличается от предыдущих версий: на V8 тормозит ввод. Что не удивительно: на других двигах ко времени ввода следующего символа цикл успевает закончится, а на тормозном V8 -- нет. Никакой магии:) ЗЫ и причем тут декларативный подход ЯННП? |
Цитата:
Если бы все было иначе, я бы не спорил. Цитата:
<html> <head> <title>Untitled</title> </head> <body> <div id="id"><div> <script> var str = Array(1000).join("fooooooooooooooooooovvvvvmvmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmddssmxmxmxmxm"); var strWithElems = Array(1000).join("fooooo<br/>oooooooo<br/>oooooovvvvvmvmmm<br/>mmmmmmmmmmmm<br/>mmmmmmmmmmmmm<br/>mmmmmmmmmmmmm<br/>mddssmxmxmxmxm"); var elem = document.getElementById("id"); test('innerHTML with simple text', function () { elem.innerHTML = str; }, 1000); test('replaceHTML with simple text', function () { elem = replaceHtml(elem, str); }, 1000); test('innerHTML with complex text', function () { elem.innerHTML = strWithElems; }, 1000); test('replaceHTML with complex text', function () { elem = replaceHtml(elem, strWithElems); }, 1000); function test(title, fn, i) { console.time(title); while (i--) { fn(); } console.timeEnd(title); } function replaceHtml(el, html) { var oldEl = typeof el === "string" ? document.getElementById(el) : el; /*@cc_on // Pure innerHTML is slightly faster in IE oldEl.innerHTML = html; return oldEl; @*/ var newEl = oldEl.cloneNode(false); newEl.innerHTML = html; oldEl.parentNode.replaceChild(newEl, oldEl); /* Since we just removed the old element from the DOM, return a reference to the new element, which can be used to restore variable references. */ return newEl; }; </script> </body> </html> Код:
innerHTML with simple text: 579.010ms Цитата:
И да, расскажи про машину, на которой все это выполняется. Нетбук какой-то? Какая версия Хрома? Я просто давно не видел, чтобы что-то js- ное тормозило. Цитата:
|
Цитата:
Цитата:
Цитата:
|
а причем тут вообще DOM? топикстартер срёт V8 а тесты проводит замеряя обработку DOM...
|
Цитата:
Цитата:
Цитата:
Цитата:
Профайлинг кода с innerHTML: И с replaceHTML: Как видишь, вариант с replaceHTML выполняется за 10 миллисекунд. С innerHTML — за 5000 (5 секунд то есть). Никакого объяснения, кроме того, что Хром не любит объемный innerHTML у меня нет. Поиск с регулярками в профиле занимает какое-то смешное время, так что я его тут не привожу. |
ixth,
Да, похоже ты прав, я думал цикл долго выполняется, а оказывается, отрисовка выполняется в десятки раз дольше, если верить отладчикам. Если это так, то тут не надо, наверное онанировать на скорость innerHTML vs replace, тем более, это не кроссбраузерное решение. Тут надо пытаться сделать асинхронную отрисовку, возможно кусками. Спасибо за помощь. |
Проблема не совсем в скорости отрисовки. Если посмотреть на маленькие сиреневые прямоугольнички, то видно, что они отрабатывают довольно быстро, а весь тупняк идет до них. Проблема именно в присвоении innerHTML. Еще раз: replaceHTML выполняется в 100 (sic!) раз быстрее, за 10 миллисекунд против пяти секунд innerHTML.
Но, в принципе, да, проблему лучше решать сменой подхода. |
Часовой пояс GMT +3, время: 14:09. |