Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 12.07.2010, 15:48
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от B~Vladi
Этот цикл работает медленнее.
Во сколько раз?
Ответить с цитированием
  #22 (permalink)  
Старый 12.07.2010, 16:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,059

Сообщение от Kolyaj
Во сколько раз?
меня конечно не спрашивали но я приводил ссылку выше там можно посмотреть и сравнить время выполнения.
https://blogs.oracle.com/greimer/ent..._way_to_code_a

Последний раз редактировалось рони, 17.07.2014 в 21:33.
Ответить с цитированием
  #23 (permalink)  
Старый 13.07.2010, 00:12
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Ладно, с этим разобрались.
Чтобы не плодить тем, задам тут.

Использую такой код:
var frame = document.createElement('frame');
frame.href = 'about:blank'; // В принципе не обязательно, браузеры и так это грузят.
document.body.appendChild(frame);


После загрузки фрейма в WebKit, его документ находится в режиме совместимости... Собсно, как это исправить? Из-за этого много чего просто не работает.
Если грузить по урлу родительского окна, всё в порядке, но такой вариант не прокатит - грузяцо лишние байты, которые мне не нужны.

В общем, мне надо мне получить фрейм, чтобы динамически его наполнить элементами. А с этим режимом все валицо
Ответить с цитированием
  #24 (permalink)  
Старый 13.07.2010, 00:20
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

var iFrame = document.createElement("iframe");
document.body.appendChild(iFrame);
var iFrameDocument = iFrame.contentDocument;
iFrameDocument.open();
iFrameDocument.write('<!DOCTYPE html>');
iFrameDocument.close();
alert(iFrameDocument.compatMode);

Последний раз редактировалось Octane, 13.07.2010 в 00:24.
Ответить с цитированием
  #25 (permalink)  
Старый 13.07.2010, 08:06
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021


Старый добрый write... Совсем забыл про него.
Octane, спасибо.
Ответить с цитированием
  #26 (permalink)  
Старый 13.07.2010, 09:39
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Главное про document.close не забывай.
Ответить с цитированием
  #27 (permalink)  
Старый 13.07.2010, 23:18
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Вернусь к первому вопросу.

Столкнулся с одной интересной вещью. Есть код:
var fragment = document.createDocumentFragment();
for(var i = 0; i < 10000; i++){
  fragment.appendChild(document.createElement('div'));
}
document.body.appendChild(fragment);


Далее тестируем производительность в мозилле:
var arr = Array.prototype.slice.call(document.getElementsByTagName('div'));

var elems = document.getElementsByTagName('div');

console.time('While');
var l = elems.length;
var arrWhile = [];
while(l){
  arrWhile.push(elems[--l]);
}
console.timeEnd('While');


У меня показывает 9 ms. Если убрать первую строку или поменять 'div' на '*' (либо другой какой тег) в этой строке, начинает показывать 17 ms.
Это что? Кеширование?

Последний раз редактировалось B~Vladi, 14.07.2010 в 08:13.
Ответить с цитированием
  #28 (permalink)  
Старый 14.07.2010, 14:17
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Что-то я не понял. Вот так видно, что кеширование коллекций какое-то есть, скорее всего (причем именно в FF, в Опере 10.60 все время тратится что-то на выборку, хотя сама она и происходит значительно быстрее):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Some test</title>

        <script type="text/javascript">
<!--
        function _init() {
            var fragment = document.createDocumentFragment();
            for (var i = 100000; i--; ) {
                fragment.appendChild(document.createElement('DIV'));
            }
            document.body.appendChild(fragment);
        }

        function _test() {
            var arr = [],
                results = document.getElementById('results'),
                start = (new Date()).getTime();

            // Get collection
            var elems = document.getElementsByTagName('DIV'),
                l = elems.length;

            results.appendChild(document.createTextNode('Find: ' +
                ((new Date()).getTime() - start) +
                'ms\n'));

            // Push
            start = (new Date()).getTime()
            while (l) {
                arr.push(elems[--l]);
            }

            results.appendChild(document.createTextNode('Push: ' +
                ((new Date()).getTime() - start) +
                'ms\n\n'));
        }
//-->
        </script>
    </head>

    <body onload="_init()"><button onclick="_test()">Test</button><pre id="results"></pre></body>
</html>
Ответить с цитированием
  #29 (permalink)  
Старый 14.07.2010, 14:27
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от e1f
Что-то я не понял.
Дело не в том, что кеширование происходит при обращении к коллекции, а при преобразовании её в массив. На это я наткнулся, когда решил сравнить 2 способа преобразования на скорость. Когда я запустил последовательно 2 способа (см. приведённый выше скрипт) и посмотрел на консоль - решил, что while работает быстрее в 1.5 раза. Ну думаю, ок, будем юзать его. Убираю первый способ и мин 10 пытаюсь понять происходящее.
Вот как-то так всё получилось. Другие браузеры пока не тестил (не считая хрома - там все за 1 ms выполняется, не перестаю на него удивляцо).
Ответить с цитированием
  #30 (permalink)  
Старый 14.07.2010, 14:51
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Занятно. Действительно, у меня первая пробежка с push по массиву на 50К занимает 160-170ms, со slice 150-160ms. Следующий запуск теста -- уже push 50-60, slice 40-50ms, то есть в принципе slice быстрее (не знаю, как Вы получили другой результат). НО! Подождите секунд 20-30, и поробуйте запустить тест снова -- опять большие цифры! То есть, кеширование происходит на весьма ограниченное время. Иллюстрация:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Some test</title>

        <script type="text/javascript">
<!--
        function _init() {
            var fragment = document.createDocumentFragment();
            for (var i = 50000; i--; ) {
                fragment.appendChild(document.createElement('DIV'));
            }
            document.body.appendChild(fragment);
        }

        function _test() {
            var arr = [],
                results = document.getElementById('results'),
                start = (new Date()).getTime();

            // Get collection
            var elems = document.getElementsByTagName('DIV'),
                l = elems.length;

            results.appendChild(document.createTextNode('Find: ' +
                ((new Date()).getTime() - start) +
                'ms\n'));

            if (Math.random() < 0.5) {
                _push();
                _slice();
            } else {
                _slice();
                _push();
            }

            results.appendChild(document.createTextNode('\n'));

            function _push() {
                arr = [];
                start = (new Date()).getTime();

                // Push
                while (l) {
                    arr.push(elems[--l]);
                }

                results.appendChild(document.createTextNode('Push: ' +
                    ((new Date()).getTime() - start) +
                    'ms\n'));
            }

            function _slice() {
                arr = [];
                start = (new Date()).getTime();

                // Slice
                arr = Array.prototype.slice.call(elems);

                results.appendChild(document.createTextNode('Slice: ' +
                    ((new Date()).getTime() - start) +
                    'ms\n'));
            }
        }
//-->
        </script>
    </head>

    <body onload="_init()"><pre id="results"></pre><button onclick="_test()">Test</button></body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Sortable, два связанных списка. Как один из них сделать неизменяемым? kvecxjo jQuery 1 30.03.2010 03:15
Сортировка элементов списка тупым способом ururu Events/DOM/Window 9 11.01.2010 01:41
Выбор элементов и построение списка выбранных элементов. madgals Events/DOM/Window 6 14.04.2009 22:30
Блок выбора элементов из списка. Аля joblist Acrossfy Элементы интерфейса 3 26.03.2009 00:49
Динамическое обновление списка select (продолжение мытарств) macam Элементы интерфейса 2 25.06.2008 16:04