I will use while and length for futur codes, even if the diffenrences
seems very little.
Merci pour les liens et les precisions :]
L
Juan Pablo Califano a écrit :
My undestanding is that push should be slower than accessing the index
directly, but take that as "common sense": a function call should involve a
bit more processing, but I don't know the specifics. I do know that both
compiles to different bytecode. Off the top of my head, it was 4 ops,
something like
push value
push index
push theobject
setproperty ==> theobject[index] = value
Making a push involves a callProperty operation, where you pass the object,
the method and the arguments. Maybe it's the same number of operations, but
I think the call operation is a bit more complex internally, as it creates a
new frame on the stack, it has to pass the arguments, executes the function,
clears the stack frame and then returns back to the callee.
For disassembling, I'm using abcdump, a tool that is included in the Tamarin
project. You can find a compiled version for Windows and use instructions
here (though it's super easy to use):
http://iteratif.free.fr/blog/index.php?2006/11/15/61-un-premier-decompileur-as3
It's in french, but looking at the text added to your reply, I assume you'll
have not problems with that ;)
Another post about the subject, in English
http://www.5etdemi.com/blog/archives/2007/01/as3-decompiler/
Cheers
Juan Pablo Califano
2008/7/30, laurent <[EMAIL PROTECTED]>:
Hm yes, there's no difference between For and while.
What do you think about a[ a.length ] and a.push(); ?
How did you get the decompiles function ?
Thanks for pushing it.
L
Juan Pablo Califano a écrit :
I'd take these results with a pinch of salt. I don't think they're
conclusive, since one test seems to affect the performance of the others
(and we are talking about really small differences anyway, which I think
could be attributed to other factors than the tested code itself).
Let's take, for instance the for / while tests. If I run all your tests, I
get results similar to yours.
takeLengthPlusOut : 1958
takeForWithLengthPlus : 1788
However, if I run just those two tests the results change. And if I alter
the order in which the tests are run, the first one always seems to take
less time.
// running just these two, tracing the results in the same order the loops
are executed
takeLengthPlusOut : 1876
takeForWithLengthPlus : 2003
takeLengthPlusOut : 1876
takeForWithLengthPlus : 1935
takeForWithLengthPlus : 1874
takeLengthPlusOut : 1946
takeForWithLengthPlus : 1861
takeLengthPlusOut : 1935
I think this particular for / while case is very illustrative of some
external bias, because the execution order consistently affects the
results
and because if you disassemble both loops, they're nearly identical. The
only difference is the order in which one operation previous to the loop
is
executed (it's not even the "body" of the loop or its conditional test).
FOR:
function takeForWithLengthPlus():String /* disp_id 0*/
{
// local_count=4 max_scope=1 max_stack=3 code_len=61
0 getlocal0
1 pushscope
2 pushbyte 0
4 setlocal1
5 pushnull
6 coerce Array
8 setlocal2
9 pushnan
10 setlocal3
11 findpropstrict Array
13 constructprop Array (0)
16 coerce Array
18 setlocal2
19 findpropstrict flash.utils::getTimer
21 callproperty flash.utils::getTimer (0)
24 convert_d
25 setlocal3
26 pushbyte 0
28 setlocal1
29 jump L1
L2:
33 label
34 getlocal2
35 getlocal2
36 getproperty length
38 getlocal1
39 setproperty null
41 inclocal_i 1
L1:
43 getlocal1
44 pushint 10000000 // 0x989680
46 iflt L2
50 pushstring "takeForWithLengthPlus : "
52 findpropstrict flash.utils::getTimer
54 callproperty flash.utils::getTimer (0)
57 getlocal3
58 subtract
59 add
60 returnvalue
}
WHILE:
function takeLengthPlusOut():String /* disp_id 0*/
{
// local_count=4 max_scope=1 max_stack=3 code_len=61
0 getlocal0
1 pushscope
2 pushbyte 0
4 setlocal1
5 pushnull
6 coerce Array
8 setlocal2
9 pushnan
10 setlocal3
11 pushbyte 0
13 setlocal1
14 findpropstrict Array
16 constructprop Array (0)
19 coerce Array
21 setlocal2
22 findpropstrict flash.utils::getTimer
24 callproperty flash.utils::getTimer (0)
27 convert_d
28 setlocal3
29 jump L1
L2:
33 label
34 getlocal2
35 getlocal2
36 getproperty length
38 getlocal1
39 setproperty null
41 inclocal_i 1
L1:
43 getlocal1
44 pushint 10000000 // 0x989680
46 iflt L2
50 pushstring "takeLengthPlusOut : "
52 findpropstrict flash.utils::getTimer
54 callproperty flash.utils::getTimer (0)
57 getlocal3
58 subtract
59 add
60 returnvalue
}
The only difference is that in the foor loop, i = 0 is run immediately
before testing i against 10000000:
26 pushbyte 0
28 setlocal1
whereas in the while loop, that assignment is executed before constructing
the array:
11 pushbyte 0
13 setlocal1
Cheers
Juan Pablo Califano
2008/7/29, laurent <[EMAIL PROTECTED]>:
Hi,
I often asked myself if a[ a.length ] = xxx was faster or slower then
a.push( xxx ), I did some test at wake up, fresh with coffee.
So now I know the answer and I got a bit more about while and for, and
more
obvious about using them with decremental or incremental counters.
from results, > means faster :
for > while ....hey yes...oO
increment > decrement
length > push
increment or certainly make any number operation at same time than
putting
the value in variable is slower than separate those actions, like:
a[ a.length ] = i++;
slower than:
i++;
a[ a.length ] = i;
"while incremental" is faster than "for decremental".
This is a totaly useless information as if you can use the while
incremental instead of For decremental, then just use For incremental.
I heard that any loop was compiled to a while loop so I started coding
everything with a while, what is faster to write and more elegant.
Now I'll go back to those For loops, I promess I never stoped loving you
guys...
here some convincing results :
takeLengthMinus : 1695
takeLengthMinusOut : 1598
takeLengthPlus : 1580
takeLengthPlusOut : 1550
takePushMinus : 1860
takePushMinusOut : 1768
takePushPlus : 1756
takePushPlusOut : 1685
Don't compare results between separate paragraphe because they did not
run
all together:
takeForWithLengthMinus : 1624
takeForWithLengthPlus : 1581
The For loop is directly with operation outside, so it has to be compared
to the
other outside operations:
takeLengthMinusOut : 1686
takeLengthPlusOut : 1610
takePushMinusOut : 1788
takePushPlusOut : 1666
takeForWithLengthMinus : 1626
takeForWithLengthPlus : 1563
I guess that's why I learned to use for( i = 0; i < n; i++ ) for my first
loops.
So if we want our code faster we have to make it longer and actually more
human readable, at the same time it means more computer readable as it
gets
faster....hm, is the computer so close to human...?!
I [ mean my brain ] actually use a dicotomic way to find my current
client
folder in the list of all my works.
cheers.
L
and here the codes :
function takeLengthMinus():String{
var i : int = 10000000;
var a: Array = new Array();
var t: Number = getTimer();
while( i-- ){
a[ a.length ] = i;
}
return "takeLengthMinus : " + ( getTimer() - t );
}
function takeLengthMinusOut():String{
var i : int = 10000000;
var a: Array = new Array();
var t: Number = getTimer();
while( i ){
a[ a.length ] = i;
i--;
}
return "takeLengthMinusOut : " + ( getTimer() - t );
}
function takeLengthPlus():String{
var i : int = 0;
var a: Array = new Array();
var t: Number = getTimer();
while( i < 10000000 ){
a[ a.length ] = i++;
}
return "takeLengthPlus : " + ( getTimer() - t );
}
function takeLengthPlusOut():String{
var i : int = 0;
var a: Array = new Array();
var t: Number = getTimer();
while( i < 10000000 ){
a[ a.length ] = i;
i++;
}
return "takeLengthPlusOut : " + ( getTimer() - t );
}
function takePushMinus():String{
var i : int = 10000000;
var a: Array = new Array();
var t: Number = getTimer();
while( i-- ){
a.push( i );
}
return "takePushMinus : " + ( getTimer() - t );
}
function takePushMinusOut():String{
var i : int = 10000000;
var a: Array = new Array();
var t: Number = getTimer();
while( i ){
i--;
a.push( i );
}
return "takePushMinusOut : " + ( getTimer() - t );
}
function takePushPlus():String{
var i : int = 0;
var a: Array = new Array();
var t: Number = getTimer();
while( i < 10000000 ){
a.push( i++ );
}
return "takePushPlus : " + ( getTimer() - t );
}
function takePushPlusOut():String{
var i : int = 0;
var a: Array = new Array();
var t: Number = getTimer();
while( i < 10000000 ){
a.push( i );
i++;
}
return "takePushPlusOut : " + ( getTimer() - t );
}
function takeForWithLengthMinus():String{
var i : int;
var a: Array = new Array();
var t: Number = getTimer();
for( i = 10000000; i > 0; i-- ){
a[ a.length ] = i;
}
return "takeForWithLengthMinus : " + ( getTimer() - t );
}
function takeForWithLengthPlus():String{
var i : int;
var a: Array = new Array();
var t: Number = getTimer();
for( i = 0; i < 10000000; i++ ){
a[ a.length ] = i;
}
return "takeForWithLengthPlus : " + ( getTimer() - t );
}
//trace( takeLengthMinus() );
trace( takeLengthMinusOut() );
//trace( takeLengthPlus() );
trace( takeLengthPlusOut() );
//trace( takePushMinus() );
trace( takePushMinusOut() );
//trace( takePushPlus() );
trace( takePushPlusOut() );
trace( takeForWithLengthMinus() );
trace( takeForWithLengthPlus() );
_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
__________ Information from ESET NOD32 Antivirus, version of virus
signature database 3309 (20080730) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com
_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
__________ Information from ESET NOD32 Antivirus, version of virus signature
database 3309 (20080730) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com
_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders