VAN0 Posted June 26, 2020 Share Posted June 26, 2020 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: expandcollapse popupbench() 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 More sharing options...
argumentum Posted June 26, 2020 Share Posted June 26, 2020 look !, an extra 5% !!! expandcollapse popupGlobal 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. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now