[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