offsetHeight и style.display

Проведем тестирование скорости вычисления значений offsetHeight и style.display.

Для удобства профайлинга вынесем доступ к этим значениям в отдельные функции:

function fnOffset(el)
{
        return !!el.offsetHeight;
}

function fnStyle(el)
{
        return el.style.display=='none';
}

где el — тестовый контейнер.

Проведем тест на тысяче итераций, на каждой итерации будем добавлять в тестовый контейнер элемент <span>. Проверим время, затрачиваемое на добавление тысячи элементов, без вызова тестовых функций тест clean. Проведем тестирование во всех браузерах, замеряя время следующим способом:

var time_start = new Date().getTime();
/* ... тест ... */
var time_stop=new Date().getTime();
var time_taken=time_stop-time_start;

где time_taken — это время, затраченное на тест, в миллисекундах.

IE sp62 IE8bFirefox 2.0.0.12Opera 9.22Safari 3.04b
clean 128 153 15 15 16
offsetHeight 23500 10624 4453 4453 5140
style.display 171 209 56 56 34
height vs. style 140 раз 50 раз 80 раз 80 раз 150 раз

Таблица 6.3. Результаты выполнения тестов по определению видимости элементов. Времена приведены в миллисекундах. Взято среднее значение серии из 5 тестов

Судя по результатам тестов, доступ к offsetHeight медленнее в 50-150 раз.

Получается, что по отдельности и offsetHeight, и добавление элементов работают быстро, а вместе — очень медленно. Как же так?