PDA

Просмотр полной версии : Производительность разных версий плееров


__i
21.06.2006, 14:39
Тут скорее не вопрос, а факты которые поломали мое сознание %((

тестировал на производительность работы циклов fori и fore для массива и объекта получил вот такие интересные данные:

версия плеера: 6 7(сама среда флеш MX 2004) 7(отдельно) 9(IE)
результаты
запуск1 fore - 1031 ms fore - 3094 ms fore - 625 ms fore - 187 ms
fori - 1594 ms fori - 266 ms fori - 250 ms fori - 594 ms
fore in array - 1125 ms fore in array - 3406 ms fore in array - 656 ms fore in array - 219 ms

запуск2 fore - 953 ms fore - 3484 ms fore - 578 ms fore - 187 ms
fori - 1594 ms fori - 266 ms fori - 266 ms fori - 578 ms
fore in array - 1062 ms fore in array - 3313 ms fore in array - 640 ms fore in array - 235 ms



по этим результатам получаеться что в большенстве случаем обычный цикл вообще сосет!.

В 8 у меня небыло, но как раз с него все и началось(знокомы тестил) - в нем fori тоже сосет !

исходный код флешки


_root.createTextField('tf',1,0,0,200,200);
mc = _root.createEmptyMovieClip(bt,2);
mc.beginFill(0,100);
mc.lineTo(20,0);
mc.lineTo(20,20);
mc.lineTo(0,20);
mc.lineTo(0,0);
mc.endFill();
mc._x=200;
mc.onRelease = function (){
_root.test();
}

_root.test = function(){

var c:Object = new Object();
var d:Array = new Array();

var i:Number = 100000
for (; --i; ){
c['c'+i] = i
d[i] = {nm:'c'+i, val:i}
}

t = new Date().getTime();

for (var i:String in c){
c[i] = 12;
}

_root.tf.text += 'fore - '+(new Date().getTime() - t) + ' ms\n';
t = new Date().getTime();

var i:Number = 100000
for (; --i;){
d[i].val = 12;
}
_root.tf.text += 'fori - '+(new Date().getTime() - t) + ' ms\n';

t = new Date().getTime();

for (i:String in d){
d[i].val = 12;
}
_root.tf.text += 'fore in array - '+(new Date().getTime() - t) + ' ms\n';

}

Жду коментариев...

etc
21.06.2006, 15:15
Flash 8 Pro (IDE):
fore - 203 ms
fori - 406 ms
fore in array - 235 ms

Flash 8 (Standalone):
fore - 219 ms
fori - 422 ms
fore in array - 250 ms

Reijii
21.06.2006, 15:17
дело скорее всего в том, как на низком уровне организован массив и объект во flash. скорее всего массив посто утроен там как то по гадски. Вроде разных валидайций на наличие элеменита, пересчета длины массива и тп. а в объекте такого просто нет. вот и вся производительность,
к стати если в for..in объекта добавить подсчет "длины" объекта, то время почти сравняется:

var ln:Number = 0;
for (var i:String in c){
c[i] = 12;
ln++;
}
trace(ln);

__i
21.06.2006, 16:15
к стати если в for..in объекта добавить подсчет "длины" объекта, то время почти сравняется:

var ln:Number = 0;
for (var i:String in c){
c[i] = 12;
ln++;
}
trace(ln);

Естественно он сравняеться то за одну итерацию цикла мы делаем 1 операцию, а то 2 !

Reijii
21.06.2006, 16:26
так вот я и пишу что в массиве на низком уровне скорее всего присутствуют некие операции, к примеру тот же пересчет / подсчет размера массива, которые отсутствуют в объекте

iNils
21.06.2006, 18:35
Я не очень понял всех ваших манипуляция и переписал тест так:
_root.createTextField ('tf', 1, 0, 0, 200, 200);
mc = _root.createEmptyMovieClip (bt, 2);
mc.beginFill (0, 100);
mc.lineTo (20, 0);
mc.lineTo (20, 20);
mc.lineTo (0, 20);
mc.lineTo (0, 0);
mc.endFill ();
mc._x = 200;
mc.onRelease = function () {
_root.test ();
};
_root.test = function () {
var obj = new Object ();
var arrayA = new Array ();
var m = 100000;
for (var i = 0; i < m; i++) {
obj['obj' + i] = i;
arrayA[i] = {nm:'obj' + i, val:i};
}
///////////////////////////////////////////////////
var t2 = getTimer ();
for (var i in obj) {
obj[i] = 12;
}
var t3 = getTimer ();
trace (t3 - t2);
///////////////////////////////////////////////////
var t3 = getTimer ();
for (var i:Number = 0; i < m; i++) {
arrayA[i].val = 12;
}
var t4 = getTimer ();
trace (t4 - t3);
///////////////////////////////////////////////////
for (var q in arrayA) {
arrayA[q].val = 12;
}
var t5 = getTimer ();
trace (t5 - t4);
};
В IDE 8 получил следущее (2 запуска):

152
152
179
-------
154
152
184

__i
22.06.2006, 13:42
2iNils результаты IDE MX 2004:
1739
300
796

1374
227
823

текстовое поле для того чтобы можно было потестить везде а не только в IDE.
Конструкция
var i:Number = 100000
for (; --i; ){.....
или
for (i=100000-1; i>0;i-- ){.....
в 7 плеере (остальные не тестил) работает быстрее чем обычный цикл, это даже Мук пишет в своей книге

Вобщем к чему я клоню - не всегда стоит использовать извесные способы оптимизации. Я просто решил уже переписать некоторый код где бегал по массивам (типа оптимизировать), и все смотрел в 7м плеере, типа круто получалось, а потом решил потестить и вылезли такие вот результаты %(

iNils
22.06.2006, 13:59
У меня как видишь вылезли другие. А я не понял зачем ты использовал такую конструкцию arrayA[q].val = 12, а не просто arrayA[q] = 12. Цикл к этому ни какого отношения не имеет.

И про Мука, если не сложно укажи где именно, хочу посмотреть.

__i
22.06.2006, 14:28
У меня как видишь вылезли другие. А я не понял зачем ты использовал такую конструкцию arrayA[q].val = 12, а не просто arrayA[q] = 12. Цикл к этому ни какого отношения не имеет.

arrayA[q].val использовал для того чтобы показать что я хочу достучаться именно до того значения у которого будет соответствующее имя arrayA[q].nm

Основы ActionScript 2.0 на пример на странице 423 в коментариях листинга класса Observable, метода notifyObservers.

..........
//Производим отсчет в обратном порядке, потому что так быстрее
//и порядок в данном случае значения не имеет.
......

Король
22.06.2006, 14:43
надо мерять по средним арифметическим от нескольких результатов - они разнятся постоянно даже внутри ИДЕ одной версии

__i
22.06.2006, 14:55
естетсвенно разнятся, но впринципе из нескольких прогонов уже видно различая во времени, особено когда они в 2 и больше раза отличаються

__i
30.06.2006, 15:24
var c:Array = new Array();
var c1:Array = new Array();
var t=new Date().getTime();

for (var i =0; i <100000; i++){
c[i]=new Array() ;
}
trace((new Date().getTime())-t);

var t=new Date().getTime();
for (var i =0; i <100000; i++){
c1[i]=[];
}

trace((new Date().getTime())-t);

в первом и во втором у нас получаеться массив массивов, но второй способ быстрее. тестил я его на
7 и 8 плеере
я незнал такого %(

iNils
30.06.2006, 15:47
Не на много.

__i
30.06.2006, 17:05
ну приблизительно на 20-30%, что тоже порою играет большую роль

iNils
30.06.2006, 17:35
ну приблизительно на 20-30%, что тоже порою играет большую роль
Поменяй методы местами и сравни.

__i
30.06.2006, 17:51
Кхм а в чем подвох?, то что идет вторым циклов всегда быстрее... %( почему так ?