[AccessD] Timer etc.
Arthur Fuller
fuller.artful at gmail.com
Tue Sep 27 20:08:01 CDT 2022
I made the changes to the data types as you suggested, Stuart, and it
brought the times much closer together.
While: 182.7031
For: 192.3081
That's still with 1 million iterations.
On Tue, Sep 27, 2022 at 7:07 PM Arthur Fuller <fuller.artful at gmail.com>
wrote:
> 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
>
>
--
Arthur
More information about the AccessD
mailing list