Занятно. Действительно, у меня первая пробежка с
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>