PureBytes Links
Trading Reference Links
|
Hello,
I have run your code and results are pretty much the same in both settings.
Best regards,
Tomasz Janeczko
amibroker.com
Dennis Brown wrote:
> Hello Tomasz,
>
> Below is some AFL I wrote to explore the speed difference between
> Array and Loop operations. I wanted to explore a number of different
> array operations to see if I could speed up my indicators.
>
> It shows the difference in speed for finding the highest value in a
> whole array.
> I am not sure my math is correct though, because one of the results
> seem counter intuitive.
>
> For instance:
>
> I test a for() loop that does nothing in order to get the loop
> overhead. I subtract that number from the loop that is doing the real
> operation to get just the time to do the one operation. I subtracted
> off the loop overhead because a loop will usually have a lot of
> operations that spread out the overhead. I do this for 1,000 cycles
> and for 10,000 cycles.
>
> I would expect the time to execute a single AFL line after subtracting
> off the overhead would be the same regardless of the number of
> cycles. However, the results say that it takes almost twice as long
> to execute that operation in a 1,000 cycle loop than a 10,000 cycle
> loop. Since this is not what I would expect, so I have to assume I
> did something wrong. I figured I should ask for a review before
> making statements about how much faster arrays are.
>
> On the other hand, the array operation shows almost one third of the
> time per bar when going from 1,000 to 10,000 bars, which is reasonable.
>
> Am I missing something in my understanding, or am I just a lousy AFL
> coder? :)
>
> Best regards,
> Dennis
>
> /*
> ////////////////////////////////////////////////////////////////////////////////////////
> // Simple test code to show speed difference between loop and array
> operations -- 7/4/2009 Dennis Brown
> // Edit this AFL for each comparison of equivelent operations
> // Check both 1000 and 10,000 bar operations to derive the overhead
> // Timing on one pass is jumpy, so it will avarage passes for a large
> term average -- just wait a while
> // Watch out for differences in operation lengths due to one way
> nature of SetBarsRequired()
> // Do the short cycle length first, then the long one, then edit AFL
> with short one selected to reset SBR -- what a pain
> // If I could switch to lower SBR numbers on the fly, I could
> calculate a complete curve with overheads
> // Number of bars loaded seems to always be 200 more than the
> requested number with SBR
> // Interestingly, //comments seem to run a little faster than /*
> comments */ in the timing loop
> */
> LoopText = ArrayText = ""; // init and make global
>
> function LoopOperation( Length ) { /* Edit this function with the loop
> operator to be tested */
> GetPerformanceCounter( True ); /* reset the timer */
> MaxPrice = 0;
> for ( i=0; i<Length; i++ ) {
> /* insert the loop operation(s) to be tested below */
> MaxPrice = Max( MaxPrice, C[i] );
> }
> LoopText = "MaxPrice = Max( MaxPrice, C[i] );" ; /* duplicate
> operator here for display output */
> return round(1000000/Length*GetPerformanceCounter( False ) ); /*
> returns time in microseconds per 1000 */
> }
>
> function ArrayOperation( Length ) { /* Edit this function with the
> array operator to be tested */
> GetPerformanceCounter( True ); /* reset the timer */
> MaxPrice = LastValue( HHV( C, Length ) );
> ArrayText = "MaxPrice = LastValue( HHV( C, Length ) );" ; /*
> duplicate operator here for display output */
> return round(1000000/Length*GetPerformanceCounter( False ) ); /*
> returns time in microseconds per 1000 */
> }
>
> function LoopOverhead( Length ) { /* loop overhead to be tested, do
> NOT edit */
> GetPerformanceCounter( True ); /* reset the timer */
> for ( i=0; i<Length; i++ ) { ; }
> return round(1000000/Length*GetPerformanceCounter( False ) ); /*
> returns time in microseconds per 1000 */
> }
>
> // main routine
> LastSBRLength = StaticVarGet( "LastSBRParameterValue" );
> SBRLength = Param( "Base cycle length", 1000, 1000, 10000, 9000 );
> Length = BarCount-200;
> if ( ParamTrigger("Reset Averages", "Click to Reset" ) OR
> LastSBRLength != SBRLength OR Length != SBRLength ) {
> StaticVarSet( "TimeSum0", 0 );
> StaticVarSet( "TimeSum1", 0 );
> StaticVarSet( "TimeSum2", 0 );
> StaticVarSet( "TimeCycles", 0 );
> StaticVarSet( "LastSBRParameterValue", SBRLength );
> Title = " Warning -- SetBarsRequired() can not reduce bars -- Edit
> AFL to reset SBR or increase length parameter";
> }
> else { // only execute the code if all the bar requirements match so
> we get accurate results (i.e., first cycle is all bars)
>
> TimeSum0 = StaticVarGet( "TimeSum0" );
> TimeSum1 = StaticVarGet( "TimeSum1" );
> TimeSum2 = StaticVarGet( "TimeSum2" );
> TimeCycles = 1 + StaticVarGet( "TimeCycles" );
>
> TimeSum0 += LoopOverhead( Length ); // loop overhead to be tested
> TimeSum1 += LoopOperation( Length ); // loop operator to be tested
> TimeSum2 += ArrayOperation( Length ); // array operator to be tested
>
> StaticVarSet( "TimeSum0", TimeSum0 );
> StaticVarSet( "TimeSum1", TimeSum1 );
> StaticVarSet( "TimeSum2", TimeSum2 );
> StaticVarSet( "TimeCycles", TimeCycles );
>
> Time0 = round( TimeSum0 / TimeCycles );
> Time1 = round( TimeSum1 / TimeCycles );
> Time2 = round( TimeSum2 / TimeCycles );
>
> OpTime = Time1-Time0; // subtract off the constant loop overhead
> speedup = NumToStr( OpTime /Time2, 0.1 );
> if ( Length != SBRLength ) { warning = " !!! Warning Length
> Mismatch !!!"; } else { warning = ""; }
>
> Title = "Per 1000 bars (cycles) Tming Test\n" +
> "Bars Loaded = " + BarCount + "\n" +
> "Base Cycle Length = " + Length + warning + "\n\n" +
> "Looped Operation: " + LoopText +
> "\n\n" +
> "Loop Overhead = " + time0 + "us\n" +
> "Looped Operator = " + OpTime + "us\n\n" +
> "Array Operation: " + ArrayText +
> "\n\n" +
> "Array Operator = " + time2 + "us\n" +
> "Speedup Factor = " + speedup;
>
> } // end of active code
>
> RequestTimedRefresh( 1 );
> //Override all bar requirements for our test
> SetBarsRequired( SBRLength, sbrAll );
>
>
>
> ------------------------------------
>
> **** IMPORTANT PLEASE READ ****
> This group is for the discussion between users only.
> This is *NOT* technical support channel.
>
> TO GET TECHNICAL SUPPORT send an e-mail directly to
> SUPPORT {at} amibroker.com
>
> TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
> http://www.amibroker.com/feedback/
> (submissions sent via other channels won't be considered)
>
> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> http://www.amibroker.com/devlog/
>
> Yahoo! Groups Links
>
>
>
>
>
------------------------------------
**** IMPORTANT PLEASE READ ****
This group is for the discussion between users only.
This is *NOT* technical support channel.
TO GET TECHNICAL SUPPORT send an e-mail directly to
SUPPORT {at} amibroker.com
TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
http://www.amibroker.com/feedback/
(submissions sent via other channels won't be considered)
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/amibroker/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/amibroker/join
(Yahoo! ID required)
<*> To change settings via email:
mailto:amibroker-digest@xxxxxxxxxxxxxxx
mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx
<*> To unsubscribe from this group, send an email to:
amibroker-unsubscribe@xxxxxxxxxxxxxxx
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
|