Jump to content

DllStructGetData($tSTRUCT, "param") vs $tSTRUCT.param


Recommended Posts

Hello.

Is there any benefits to use one method or the other to get/set data from/to a structure?

The common way:

$myVar = DllStructGetData($tSTRUCT, "param")

Or "object" way:

$myVar = $tSTRUCT.param

Personally I think using object is easier to read and it seems to be 30% faster:
 

bench()
Func bench()
    Local $loops = 5
    Local $length = 10000
    For $n = 0 To $loops
        Local $r
        Local $t1 = TimerInit()
        For $i = 0 To $length
            $r = benchFunc()
        Next
        $t1 = TimerDiff($t1)
        ConsoleWrite("Func: " & $t1 & @CRLF)

        Local $t2 = TimerInit()
        For $i = 0 To $length
            $r = benchObj()
        Next
        $t2 = TimerDiff($t2)
        ConsoleWrite("Obje: " & $t2)

        If $t2 < $t1 Then
            ConsoleWrite(" (" & Round(((($t1 - $t2) / $t1) * 100), 3) & "% faster)" & @CRLF)
         Else
            ConsoleWrite(" (" & Round(((($t2 - $t1) / $t2) * 100), 3) & "% slower)" & @CRLF)
         EndIf

        ConsoleWrite("---" & @CRLF)
    Next
EndFunc

Func benchFunc()
    Local Const $tagSTRUCT1 = "struct;int var1;byte var2;uint var3;char var4[128];endstruct"
    Local $tSTRUCT1 = DllStructCreate($tagSTRUCT1)

    DllStructSetData($tSTRUCT1, "var1", -1)
    DllStructSetData($tSTRUCT1, 2, 255)
    DllStructSetData($tSTRUCT1, "var3", -1)
    DllStructSetData($tSTRUCT1, "var4", "Hello")

    Local $result = DllStructGetData($tSTRUCT1, "var1") & " | " & _
                    DllStructGetData($tSTRUCT1, "var2") & " | " & _
                    DllStructGetData($tSTRUCT1, "var3") & " | " & _
                    DllStructGetData($tSTRUCT1, "var4")
    Return $result
EndFunc

Func benchObj()
    Local Const $tagSTRUCT1 = "struct;int var1;byte var2;uint var3;char var4[128];endstruct"
    Local $tSTRUCT1 = DllStructCreate($tagSTRUCT1)

    $tSTRUCT1.var1 = -1
    $tSTRUCT1.var2 = 255
    $tSTRUCT1.var3 = -1
    $tSTRUCT1.var4 = "Hello"

    Local $result = $tSTRUCT1.var1 & " | " & _
                    $tSTRUCT1.var2 & " | " & _
                    $tSTRUCT1.var3 & " | " & _
                    $tSTRUCT1.var4
    Return $result
EndFunc

 

One thing I don't know, though, if possible use objects for array elements:

DllStructGetData ( Struct, Element , index = Default )

 

Link to comment
Share on other sites

look !, an extra 5% !!!

Global Const $tagSTRUCT1 = "struct;int var1;byte var2;uint var3;char var4[128];endstruct"
bench()
Func bench()
    Local $loops = 2
    Local $length = 10000
    For $n = 0 To $loops
        Local $r
        Local $t1 = TimerInit()
        For $i = 0 To $length
            $r = benchObj() ; benchFunc()
        Next
        $t1 = TimerDiff($t1)
        ConsoleWrite("Func: " & $t1 & @CRLF)

        Local $t2 = TimerInit()
        For $i = 0 To $length
            $r = benchObj_global()
        Next

        $t2 = TimerDiff($t2)
        ConsoleWrite("Obje: " & $t2)

        If $t2 < $t1 Then
            ConsoleWrite(" (" & Round(((($t1 - $t2) / $t1) * 100), 3) & "% faster)" & @CRLF)
         Else
            ConsoleWrite(" (" & Round(((($t2 - $t1) / $t2) * 100), 3) & "% slower)" & @CRLF)
         EndIf

        ConsoleWrite("---" & @CRLF)
    Next
EndFunc

Func benchObj()
    Local Const $tagSTRUCT1 = "struct;int var1;byte var2;uint var3;char var4[128];endstruct"
    Local $tSTRUCT1 = DllStructCreate($tagSTRUCT1)

    $tSTRUCT1.var1 = -1
    $tSTRUCT1.var2 = 255
    $tSTRUCT1.var3 = -1
    $tSTRUCT1.var4 = "Hello"

    Local $result = $tSTRUCT1.var1 & " | " & _
                    $tSTRUCT1.var2 & " | " & _
                    $tSTRUCT1.var3 & " | " & _
                    $tSTRUCT1.var4
    Return $result
EndFunc

Func benchObj_global()
    Local $tSTRUCT1 = DllStructCreate($tagSTRUCT1)
    $tSTRUCT1.var1 = -1
    $tSTRUCT1.var2 = 255
    $tSTRUCT1.var3 = -1
    $tSTRUCT1.var4 = "Hello"

    Local $result = $tSTRUCT1.var1 & " | " & _
                    $tSTRUCT1.var2 & " | " & _
                    $tSTRUCT1.var3 & " | " & _
                    $tSTRUCT1.var4
    Return $result
EndFunc

 

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.
autoit_scripter_blue_userbar.png

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...