Here are 7 benchmark tests. Obvious mistakes/having potentially already done these tests earlier in the thread, are concerns.
[classic dichotomy]
benchmark tests - <= v. <
< slightly faster
[curious]
benchmark tests - || v. else
|| slightly faster
[classic dichotomy]
benchmark tests - for loop v. loop (on array)
loop slightly faster
[classic dichotomy]
benchmark tests - assign key, don't care about value (value as string/number)
'0'/'1'/(blank) roughly the same, 'a' takes about 40% longer
[curious][expected to take longer, but not this much longer]
benchmark tests - get file paths (A_LoopFileFullPath v. A_LoopFileLongPath)
A_LoopFileLongPath took around 65 times longer
[classic AHK knowledge]
benchmark tests - read lines (FileRead / FileReadLine / A_LoopReadLine / .ReadLine())
FileRead fastest
A_LoopReadLine slightly slower
.ReadLine() around 5 times slower than FileRead
FileReadLine around 350 times slower than .ReadLine() (so around 1750 times slower than FileRead)
[classic AHK knowledge]
benchmark tests - append text (with/without prior VarSetCapacity)
if don't prepare capacity, around 8 times slower (this is very much dependent on how many times expansion/copying is necessary)
Code: Select all
return
;==================================================
;q:: ;benchmark tests - <= v. <
oQPC := []
vNum := 1000000
vQPC := QPC()
Loop, % vNum
var := 2 <= 3
oQPC.Push(QPC()-vQPC)
vQPC := QPC()
Loop, % vNum
var := 2 < 3
oQPC.Push(QPC()-vQPC)
if !(SubStr(Clipboard, 1, 16) = ";benchmark tests")
Clipboard := ";benchmark tests (ms)`r`n;CATEG 1`t" "CATEG 2"
Clipboard .= "`r`n;" oQPC.1 "`t" oQPC.2
oQPC := ""
MsgBox, % Clipboard
return
;benchmark tests (ms)
;3 <= 3 3 < 3
;174.843555 161.943055
;184.344235 157.053729
;179.711071 159.100035
;186.744636 157.246171
;190.099553 161.883184
;benchmark tests (ms)
;2 <= 3 2 < 3
;173.132954 166.935873
;184.478516 154.672572
;193.881265 155.923448
;175.886167 156.159512
;183.458571 155.182758
;==================================================
;q:: ;benchmark tests - || v. else
oQPC := []
vNum := 1000000
a := 0, b := 0, c := 1
vQPC := QPC()
Loop, % vNum
if a || b || c
{
}
oQPC.Push(QPC()-vQPC)
vQPC := QPC()
Loop, % vNum
if a
{
}
else if b
{
}
else if c
{
}
oQPC.Push(QPC()-vQPC)
if !(SubStr(Clipboard, 1, 16) = ";benchmark tests")
Clipboard := ";benchmark tests (ms)`r`n;CATEG 1`t" "CATEG 2"
Clipboard .= "`r`n;" oQPC.1 "`t" oQPC.2
oQPC := ""
MsgBox, % Clipboard
return
;benchmark tests (ms)
;|| else
;188.241840 221.797423
;192.765525 216.007465
;186.399949 216.933756
;189.934480 211.650564
;187.081625 213.128950
;==================================================
;q:: ;benchmark tests - for loop v. loop (on array)
oQPC := []
oArray := StrSplit("abcdefghijklmnopqrstuvwxyz")
vNum := 100000
vQPC := QPC()
Loop, % vNum
for _, vValue in oArray
vValue2 := vValue
oQPC.Push(QPC()-vQPC)
vQPC := QPC()
Loop, % vNum
Loop, % oArray.Length()
vValue2 := oArray[A_Index]
oQPC.Push(QPC()-vQPC)
if !(SubStr(Clipboard, 1, 16) = ";benchmark tests")
Clipboard := ";benchmark tests (ms)`r`n;CATEG 1`t" "CATEG 2"
Clipboard .= "`r`n;" oQPC.1 "`t" oQPC.2
oArray := ""
MsgBox, % Clipboard
return
;benchmark tests (ms)
;for loop loop
;655.221461 559.977317
;607.630822 571.460156
;583.126885 537.965727
;616.441273 542.546290
;598.056586 537.650549
;==================================================
;q:: ;benchmark tests - assign key, don't care about value (value as string/number)
oQPC := []
vNum := 1000000
vNum2 := 10
oArray := []
vQPC := QPC()
Loop, % vNum
{
oArray := []
Loop, % vNum2
oArray[A_Index] := 0
}
oQPC.Push(QPC()-vQPC)
oArray := []
vQPC := QPC()
Loop, % vNum
{
oArray := []
Loop, % vNum2
oArray[A_Index] := 1
}
oQPC.Push(QPC()-vQPC)
oArray := []
vQPC := QPC()
Loop, % vNum
{
oArray := []
Loop, % vNum2
oArray[A_Index] := ""
}
oQPC.Push(QPC()-vQPC)
oArray := []
vQPC := QPC()
Loop, % vNum
{
oArray := []
Loop, % vNum2
oArray[A_Index] := "a"
}
oQPC.Push(QPC()-vQPC)
if !(SubStr(Clipboard, 1, 16) = ";benchmark tests")
Clipboard := ";benchmark tests (ms)`r`n;CATEG 1`t" "CATEG 2"
Clipboard .= "`r`n;" oQPC.1 "`t" oQPC.2 "`t" oQPC.3 "`t" oQPC.4
oArray := ""
MsgBox, % Clipboard
return
;benchmark tests (ms)
;CATEG 1 CATEG 2
;2397.100274 2219.101515 2212.104300 3065.423231
;2228.236554 2188.672056 2203.594914 3018.515121
;2246.667000 2281.473461 2359.130911 3021.296987
;2259.591449 2240.394226 2218.417702 3008.272468
;2248.675674 2225.712134 2200.738638 3009.223134
;==================================================
;q:: ;benchmark tests - get file paths (A_LoopFileFullPath v. A_LoopFileLongPath)
oQPC := []
vNum := 10
vDir1 := A_ScriptDir
vQPC := QPC()
Loop, % vNum
Loop, Files, % vDir1 "\*", F
vPath := A_LoopFileFullPath
oQPC.Push(QPC()-vQPC)
vQPC := QPC()
Loop, % vNum
Loop, Files, % vDir1 "\*", F
vPath := A_LoopFileLongPath
oQPC.Push(QPC()-vQPC)
if !(SubStr(Clipboard, 1, 16) = ";benchmark tests")
Clipboard := ";benchmark tests (ms)`r`n;CATEG 1`t" "CATEG 2"
Clipboard .= "`r`n;" oQPC.1 "`t" oQPC.2
oArray := ""
MsgBox, % Clipboard
return
;benchmark tests (ms)
;CATEG 1 CATEG 2
;11.150982 1521.535401
;21.380378 1428.592872
;19.755307 1403.026225
;21.218299 1407.470367
;24.869150 1406.404663
;==================================================
;q:: ;benchmark tests - read lines (FileRead / FileReadLine / A_LoopReadLine / .ReadLine())
;note: creates file: A_Desktop "\z benchmark test num list.txt"
oQPC := []
vDir1 := A_ScriptDir
vNum := 1000
vPath := A_Desktop "\z benchmark test num list.txt"
if !FileExist(vPath)
{
VarSetCapacity(vOutput, vLen*(StrLen(vLen)+2)*2)
vLen := 10000
Loop, % vLen
vOutput .= A_Index "`r`n"
vOutput := SubStr(vOutput, 1, -2)
FileAppend, % vOutput, % "*" vPath
}
FileRead, vText, % vPath
StrReplace(vText, "`n", "", vLen), vLen += 1
vText := ""
vQPC := QPC()
Loop, % vNum
{
FileRead, vText, % vPath
Loop, Parse, vText, `n, `r
vTemp := A_LoopField
}
oQPC.Push(QPC()-vQPC)
if 0
{
vQPC := QPC()
Loop, % vNum
{
Loop, % vLen
FileReadLine, vTemp, % vPath, % A_Index
}
oQPC.Push(QPC()-vQPC)
}
else
oQPC.Push("")
vQPC := QPC()
Loop, % vNum
{
Loop, Read, % vPath
vTemp := A_LoopReadLine
}
oQPC.Push(QPC()-vQPC)
vQPC := QPC()
Loop, % vNum
{
oFile := FileOpen(vPath, "r")
Loop, % vLen
vTemp := oFile.ReadLine()
oFile.Close()
}
oQPC.Push(QPC()-vQPC)
if !(SubStr(Clipboard, 1, 16) = ";benchmark tests")
Clipboard := ";benchmark tests (ms)`r`n;CATEG 1`t" "CATEG 2"
Clipboard .= "`r`n;" oQPC.1 "`t" oQPC.2 "`t" oQPC.3 "`t" oQPC.4
oArray := ""
MsgBox, % Clipboard
return
;benchmark tests (ms)
;vNum := 1
;FileRead FileReadLine A_LoopReadLine .ReadLine()
;1.427069 2302.362469 1.400128 6.431433
;4.239726 2197.148941 1.378317 6.136354
;4.433451 2200.732650 1.549377 6.937344
;1.572470 2270.846778 1.380027 6.105563
;4.382133 2175.230578 1.375751 6.162014
;benchmark tests (ms)
;vNum := 100
;FileRead FileReadLine A_LoopReadLine .ReadLine()
;1355.364595 1463.975378 6748.853790
;1315.788550 1423.718086 6300.894773
;1286.870408 1393.392546 6417.610384
;1345.471760 1450.831972 6503.906372
;1270.004734 1405.458700 6337.372063
;==================================================
;q:: ;benchmark tests - append text (with/without prior VarSetCapacity)
oQPC := []
vNum := 1000000
vNum2 := 1
vQPC := QPC()
Loop, % vNum2
{
vOutput := ""
VarSetCapacity(vOutput, vNum*StrLen(vNum)*2)
Loop, % vNum
vOutput .= A_Index
}
oQPC.Push(QPC()-vQPC)
vQPC := QPC()
Loop, % vNum2
{
vOutput := ""
VarSetCapacity(vOutput, 0)
Loop, % vNum
vOutput .= A_Index
}
oQPC.Push(QPC()-vQPC)
if !(SubStr(Clipboard, 1, 16) = ";benchmark tests")
Clipboard := ";benchmark tests (ms)`r`n;CATEG 1`t" "CATEG 2"
Clipboard .= "`r`n;" oQPC.1 "`t" oQPC.2
oArray := ""
MsgBox, % Clipboard
return
;benchmark tests (ms)
;prepare don't prepare
;234.838192 1797.717545
;240.902701 1824.915678
;229.700828 1807.288787
;250.686058 1815.534740
;213.140070 1812.087451
;==================================================