Мне приходится обрабатывать множество изображений. Во-первых, мне нужно проверить, больше ли размер изображения больше 50x60 и соответственно увеличить счетчик плохих изображений.
Проблема заключается в том, что скорость n.width
/n.height
в Internet Explorer 8 чрезвычайно низкая. Я проверил n.offsetWidth
, n.clientWidth
, но они все одинаковы по скорости. Я не могу использовать n.style.width
, хотя, потому что это значение не всегда устанавливается в тегах <img />
, которые меня интересуют.
Рассмотрим следующий код:
Javascript
var Test = {
processImages: function () {
var fS = new Date().getTime();
var minimagew = 50,
minimageh = 60;
var imgs = document.getElementsByTagName('img');
var len = imgs.length,
isBad = 0,
i = len;
while (i--) {
var n = imgs[i];
var imgW = n.width;
var imgH = n.height;
if (imgW < minimagew || imgH < minimageh) {
isBad++;
}
}
var fE = new Date().getTime();
var fD = (fE - fS);
console.info('Processed ' + imgs.length + ' images in '
+ fD + 'ms. ' + isBad + ' were marked as bad.');
}
};
HTML
<img src="http://nsidc.org/images/logo_nasa_42x35.gif" />
[snip 9998 images]
<img src="http://nsidc.org/images/logo_nasa_42x35.gif" />
Код создает следующие выходные синтаксические разборки 10k изображений (3 разных Ctrl + F5)
- FF: обработано 10000 изображений в 115 мс. 10000 были отмечены как плохие.
- FF: обработано 10000 изображений в 99 мс. 10000 были отмечены как плохие.
- FF: обработано 10000 изображений в 87 мс. 10000 были отмечены как плохие.
- IE8: обработано 10000 изображений в 206 мс. 10000 были отмечены как плохие.
- IE8: обработано 10000 изображений в 204 мс. 10000 были отмечены как плохие.
- IE8: обработано 10000 изображений в 208 мс. 10000 были отмечены как плохие.
Как вы можете видеть, код в FF 3.6 в два раза быстрее, чем код, выполняемый в IE8.
Чтобы доказать, что проблема действительно связана со скоростью свойства размерности браузера, если я изменяю: n.width
и n.height
на константы, поэтому мы будем иметь:
var imgW = 43;
var imgH = 29;
Я получаю следующие результаты:
- FF: обработано 10000 изображений в 38 мс. 10000 были отмечены как плохие.
- FF: обработано 10000 изображений в 34 мс. 10000 были отмечены как плохие.
- FF: обработано 10000 изображений в 33 мс. 10000 были отмечены как плохие.
- IE8: обработано 10000 изображений в 18 мс. 10000 были отмечены как плохие.
- IE8: обработано 10000 изображений в 22 мс. 10000 были отмечены как плохие.
- IE8: обработано 10000 изображений в 17 мс. 10000 были отмечены как плохие.
Это правильно! Когда мы пропускаем проверку размера <img />
(вызов node.width
/node.clientWidth
и т.д.), IE8 фактически работает лучше, чем Firefox.
Есть ли у вас какие-либо идеи, почему IE так долго проверяет размер изображения и, в конечном итоге, как повысить производительность этой проверки?