Показать сообщение отдельно
  #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>
Ответить с цитированием