[AccessD] Timer etc.

Arthur Fuller fuller.artful at gmail.com
Tue Sep 27 18:07:46 CDT 2022


Thanks, Stuart. I'll make those changes.

On Tue, Sep 27, 2022 at 5:34 PM Stuart McLachlan <stuart at lexacorp.com.pg>
wrote:

> That result should have gone without saying.
>
> The For...Next loop just required incrementing or decremeing a Register
> Variable,
> comparing it to a constant and jumping
> INC     EDX
> CMP     EDX, 1000000
> JLE     LP1
> That may well be optimised by a good compilerby loading EDX with
> 100000  and then just two instructions:
> DEC   EDX
> JNE   LP1
>
> The While...Wend loop will have several extra steps to perform: with the
> variable  i -
> moving it in and out of registers, both when  incrementing  it and when
> comparing it to
> 1000000.
>
> As a side note, rounding Timer by declaring it as LONG is a strange thing
> to do. If you'd
> made it double or single , you could have got meaningful relative
> difference results in a
> fraction of a second with far fewer iterations.
>
>
> On 27 Sep 2022 at 12:09, Arthur Fuller wrote:
>
> > A few messages ago, I asked for advice on resolving times. Gustav and
> > JWC (Colby) replied, and I got what I needed.
> >
> > I'm teaching myself C++, and came across some code, which I decided to
> > port to VBA with modifications. The point of the exercise was to
> > compare the performance of a While Loop and a For/Next loop. On a
> > small scale, the differences are unnoticable, so I upped the iteration
> > count to one million. Then the difference is dramatic. The While test
> > took 612 seconds; the For/Next loop took 190 seconds.
> >
> > In case anyone is interested, here is the code:
> >
> > <code>
> > Option Explicit
> >
> > Const CON_Limit = 1000000
> >
> > Function WhileLoopTest()
> >     Dim i As Long
> >     i = 1
> >     Dim timStart As Long, timStop As Long
> >     timStart = Timer
> >     'Debug.Print timStart
> >     While i <= CON_Limit
> >         Debug.Print i
> >         i = i + 1
> >     Wend
> >     timStop = Timer
> >     'Debug.Print timStop
> >     'MsgBox "Elapsed time for " & CON_Limit & " iterations" & vbCrLf &
> >     _ '    (timStop - timStart) & " seconds.", vbOKOnly, "While Test"
> >     WhileLoopTest = (timStop - timStart)
> > End Function
> >
> > Function ForNextTest()
> >     Dim i As Long
> >     i = 1
> >     Dim timStart As Long, timStop As Long
> >     timStart = Timer
> >     'Debug.Print "Start: " & timStart
> >     For i = 1 To CON_Limit
> >         Debug.Print i
> >     Next
> >     timStop = Timer
> >     Debug.Print "Stop: " & timStop
> >     'MsgBox "Elapsed time for " & CON_Limit & " iterations" & vbCrLf &
> >     _ '    (timStop - timStart) & " seconds.", vbOKOnly, "For/Next
> >     Test" ForNextTest = (timStop - timStart)
> >
> > End Function
> >
> > Sub DurationTest()
> >     MsgBox "This program compares While loops with For/Next loops",
> > vbOKOnly + vbInformation, _
> >     "Timing Test"
> >     Dim TimeW As Currency, TimeF As Currency
> >     TimeW = WhileLoopTest()
> >     TimeF = ForNextTest()
> >     MsgBox "Results of comparison for " & CON_Limit & " iterations:" &
> > vbCrLf & _
> >         "While Loop: " & TimeW & " seconds." & vbCrLf & _
> >         "For/Next  : " & TimeF & " seconds.", _
> >         vbOKOnly + vbInformation, _
> >         "While v. For/Next Comparison"
> > End Sub
> > </code>
> >
> > --
> > Arthur
> > --
> > AccessD mailing list
> > AccessD at databaseadvisors.com
> > https://databaseadvisors.com/mailman/listinfo/accessd
> > Website: http://www.databaseadvisors.com
> >
>
>
> --
> AccessD mailing list
> AccessD at databaseadvisors.com
> https://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
>


-- 
Arthur


More information about the AccessD mailing list