Показать сообщение отдельно
Старый 14.09.2009, 20:27
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 1  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
По умолчанию Производительность участка кода зависит от разной компоновки одного и того же?

Не раз уже сталкиваюсь со странными (для меня) явлениями в исполнении кода. Например, скорость исполнения участка кода зависит от последовательности его в этом самом коде (при этом параллельных операций, а-ля Loader'им картинку - не производится; общая нагрузка на процессор - так же стабильная).
Те же самые операторы +=, ++ ведут себя по разному для одних и тех же операций. При чем отклонения не пару миллисекунд, а сотни.

Примеры: здесь тестировался миф о том, что типизованный массив с фиксированной длиной исполняется быстрее:
Код AS3:
var v:Vector.<int> = new Vector.<int>();	var v:Vector.<int> = new Vector.<int>();
v[0] = 0;					v[0] = 0;
v.fixed = true;						
 
var t:int;					var t:int;
t = getTimer();					t = getTimer();
 
for (v[0] = 0; v[0] < 100000000; v[0]+=1) ;	for (v[0] = 0; v[0] < 100000000; v[0]+=1) ;
trace (getTimer() - t); //1206			trace (getTimer() - t); //1208
 
v.fixed = false;				v.fixed = true;
t = getTimer();					t = getTimer();
 
for (v[0] = 0; v[0] < 100000000; v[0]+=1) ;	for (v[0] = 0; v[0] < 100000000; v[0]+=1) ;
trace (getTimer() - t); //1243			trace (getTimer() - t); //1247
Что это? Кто первый тот и папа? ))


Или это:
Код AS3:
// пример №1
var n:Number = 1.13456;
var t:int;
 
t = getTimer();
 
for (var i:uint = 0; i<100000000; i+=1)
{
 n = Math.floor(n);
 n = 1.13456;
}
 
trace(getTimer()-t); //10289
t = getTimer();
 
for (var j:uint = 0; j<100000000; j+=1)
{
 n = n >> 0;
 n = 1.13456;
}
 
trace(getTimer()-t); //1860
 
===================================
 
// пример №2
var n:Number = 1.13456;
var t:int;
 
t = getTimer();
 
for (var i:uint = 0; i<100000000; i++)
{
 n = Math.floor(n);
 n = 1.13456;
}
 
trace(getTimer()-t); //10253
t = getTimer();
 
for (var j:uint = 0; j<100000000; j++)
{
 n = n >> 0;
 n = 1.13456;
}
 
trace(getTimer()-t); //1485
 
=====================================
 
// пример №3
"var n:Number = 1.13456;
var t:int;
 
t = getTimer();
 
for (var i:uint = 0; i<100000000; i++)
{
 n = Math.floor(n);
 n = 1.13456;
}
 
trace(getTimer()-t); //10192
t = getTimer();
 
for (var j:uint = 0; j<100000000; j+=1)
{
 n = n >> 0;
 n = 1.13456;
}
 
trace(getTimer()-t); //1328
Примеры тестировались не раз, погрешность -- незначительна. (на более слабых ПК погрешность увеличивается - но не суть, пропорция остается)
Как видите, от перекомпоновки операторов в счетчике цикла мы получаем разные значения для одних и тех же вычислений.
Это что ж получается -- "от перемены мест слагаемых сумма..." меняется ?


Последний раз редактировалось switcher!; 14.09.2009 в 20:29.