Moin,
wegen Alinas Beitrag habe ich probiert, die darin enthaltene Sortierfunktion _Sort() von Dictionary auf Map() (_SortMap()) umzustellen. Das ist auch gelungen und die Laufzeitunterschiede sind beträchtlich. Während das Dictionary hier um die 50 ms läuft, braucht die Map() nur rund 10 ms.
Wenn nur eine der Funktionen aufgerufenb wird, sind diese Ergebnisse stabil. Rufe ich aber _Sort und _SortMap mit identischen Eingaben nacheinander auf, wird für die zweite Routine eine vile zu lange Laufzeit gemessen. Erst ein zwischengeschobener Sleep() von 512 ms oder besser mehr bringt wieder halbwegs glaubhafte Ergebnisse. Kann mir jemand sagen, warum das so ist?
#include <Array.au3>
#include <Timers.au3>
$aString = StringSplit(FileRead(@ScriptDir & "\Test.txt"), " ", 2)
$iStart1 = _Timer_Init()
$aSort1 = _Sort($aString, 1)
$iTime1 = _Timer_Diff($iStart1)
_ArrayDisplay($aSort1, $iTime1 & " ms")
; Sleep(1000)
$iStart2 = _Timer_Init()
$aSort2 = _SortMap($aString, 1)
$iTime2 = _Timer_Diff($iStart2)
_ArrayDisplay($aSort2, $iTime2 & " ms")
Func _SortMap(Const ByRef $aArray, $iDescending = 0)
Local $mMap[]
Local $iMap = 0
For $V In $aArray
$V = String($V)
If MapExists($mMap, $V) Then
$mMap[$V] += 1
Else
$mMap[$V] = 1
$iMap += 1
EndIf
Next
Local $aRes[$iMap][2]
Local $iRes = 0
For $V In MapKeys($mMap)
$aRes[$iRes][0] = $V
$aRes[$iRes][1] = $mMap[$V]
$iRes += 1
Next
_ArraySort($aRes, $iDescending, 0, 0, 1)
Return $aRes
EndFunc
Func _Sort(Const ByRef $aArray, $iDescending = 0)
Local $oCompareList = ObjCreate("Scripting.Dictionary")
For $iI = 0 To UBound($aArray)-1
If $oCompareList.Exists($aArray[$iI]) Then
$oCompareList.Item($aArray[$iI]) = $oCompareList.Item($aArray[$iI]) + 1
Else
$oCompareList.Add($aArray[$iI], 1)
EndIf
Next
Dim $aCompare[$oCompareList.Count][2], $aKeys = $oCompareList.Keys
$iCount = 0
For $sKey In $oCompareList.Keys
$aCompare[$iCount][0] = $sKey
$aCompare[$iCount][1] = $oCompareList.Item($sKey)
$iCount += 1
Next
_ArraySort($aCompare, $iDescending, 0, 0, 1)
Return $aCompare
EndFunc
Alles anzeigen
Für den Test habe ich Alinas String in eine Textdatei ausgelagert. Sie ist beigefügt => Test.txt