Funktion zur Optimierung von au3-Programmen.
Anwendung am besten nach einem Durchlauf durch den Obfuscator, damit alle Include-Dateien und Konstanten
ebenfalls berücksichtigt werden.
Dabei die Option /om des Obfuscators mit anwenden, damit alle Variablen/Funktionsnamen usw. auf ein Minimum reduziert werden.
1) #define
Definition von Makros und Konstanten.
2) Inline Funktionen
Ähnlich wie inline-Funktionen in C, Java ...
Zusätzlich werden die zu ersetzenden Funktionen optimiert:
- Mathematische Funktionen werden berechnet
ABER:
Kann nur Funktionen ersetzen die wie folgt aufgebaut sind:
3) Optimierung:
- Globale Konstanten werden durch ihre Werte ersetzt.
- Mathematische Ausdrücke werden durch das Ergebnis ersetzt.
(für bessere Ergebnisse Variablen möglichst an den Anfang oder das Ende setzen)
- StringFormat (ohne Variablen) wird aufgelöst
- StringLower/Upper mit konstanten Strings wird ersetzt
- Zuweisungen wie $i = $i +1 werden durch $i += ersetzt
- Anweisungen wie
If $a = True Then
;werden durch
If $a Then
;ersetzt, bzw.
If $a = False Then
;durch
If Not $a Then
If @error = 0
; durch
If Not @error
- Strings werden zusammengefaßt
"test" & " test"
; wird zu
"test test"
- Statements die über mehrere Zeilen gehen werden zu einer Zeile vereint.
- Einzeilige If-Blöcke werden zusammengefasst:
If $a Then
; machwas
EndIf
; wird zu
If $a Then ;wachwas
If $a Then
If $b Then ; machwas
EndIf
; wird zu
If ($a) And ($b) Then ; machwas
Sinn des Ganzen:
- Mehr Übersicht beim Programmieren durch "Auslagern" von häufig verwendeten Ausdrücken in Funktionen,
Durch das Ersetzen mit dieser Funktion spart man dem Interpreter später den Aufruf der eigentlichen Funktionen.
- Kompakter Programm-Code
- Höhere Ausführungsgeschwindigkeit
Test-Programm (input):
Spoiler anzeigen
; Test.au3 fuer _Au3Optim
[/autoit] [autoit][/autoit] [autoit]#define @InetGetActive InetGetInfo()
[/autoit] [autoit][/autoit] [autoit]Global const $test=2 ; Test 1
global Const $test2 =4
global const $test3= 8
Global Const $test4 = "das ist ein Test" ; Test 4
global Const $test5 = 'das ist ein anderer Test'
$bla1 = $test+ $test2 + $test3
$bla2 = $test4
$bla3 = $test5
DllStructCreate( _
"dword dwsize;" & _
"dword cntUsage;" & _
"dword th32ProcessID;" & _
"uint th32DefaultHeapID;" & _
"dword th32ModuleID;" & _
"dword cntThreads;" & _
"dword th32ParentProcessID;" & _
"long pcPriClassBase;" & _
"dword dwFlags;" & _
"char szExeFile[260]" _
)
$s = @InetGetActive
[/autoit] [autoit][/autoit] [autoit]$a7j = _k_()
[/autoit] [autoit][/autoit] [autoit]$ms = $s34 *1000*60*$min
$t = (3 + 32) * 45
$ms = "1000*60*34"
$ms = '1000*60*34'
If _Bla() = 0 And $t = 0 or($t = 0) Then $bla = True
If $a[0] = False Then $bla = True
If @error = 0 Then
If $a = 1 Or $t6575 = True Then $bla = True
If $a = True Then $bla = True
If @error = 1 Then
$variable = $variable + 1
$i = $i *10
$s = StringFormat("%s %.2f %s", "test", 4.56345345 , "test")
$s = StringFormat("%s %.2f", "test", 4.56345345 * $test2)
$s = StringFormat("%s %.2f %s", "Das ist eine Zahl", 4.56345345 , $test20)
Msg("Hallo Welt")
[/autoit] [autoit][/autoit] [autoit]$c = _F2C($F, 2)
$c = _F2C(128, 2)
$b1 = _Test0(1, 2)
$b2 = _Test0(3, 4)
$b3 = Abs(_Test0(5, 6) + 100)
$a = 1
_Test1($a, 2)
_Test2("Hallo ", "das ist ein ", "Test") ; Test 2
[/autoit] [autoit][/autoit] [autoit]$b = _Test3("text")
[/autoit] [autoit][/autoit] [autoit]$c = _Test4(5)
[/autoit] [autoit][/autoit] [autoit]; EndFunc
; ==============================================================================
Func _fg($t = 0, $2 = 1)
Local $t
Return
EndFunc
Func _k_()
Return(@YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC)
EndFunc
Func _1_()
Return "test"
EndFunc
Func _F2C($F, $iP)
Return Round(($F - 32) * 5 / 9, $iP)
EndFunc ;==>_F2C
Func _Test0($a, $z)
Return $z * 3 * $a + 100
EndFunc ;==>_Test0
Func _Test1(ByRef $a, $b)
Return ConsoleWrite($a + $b)
EndFunc ;==>_Test1
Func _Test2($a, $b, $c)
Return ConsoleWrite($a & $b & $c & @CRLF)
EndFunc ;==>_Test2
Func _Test3($u)
Return $u
EndFunc ;==>_Test3
Func _Test4($s)
Local $r = $s * 2
Return $r
EndFunc ;==>_Test4
Func Msg($s)
Return MsgBox(0, "Message:", $s)
EndFunc ;==>Msg
ergibt:
Spoiler anzeigen
; Test.au3 fuer _Au3Optim
[/autoit] [autoit][/autoit] [autoit]$bla1 = 14
$bla2 = "das ist ein Test"
$bla3 = 'das ist ein anderer Test'
DllStructCreate( "dword dwsize;dword cntUsage;dword th32ProcessID;uint th32DefaultHeapID;dword th32ModuleID;dword cntThreads;dword th32ParentProcessID;long pcPriClassBase;dword dwFlags;char szExeFile[260]" )
[/autoit] [autoit][/autoit] [autoit]$s = InetGetInfo()
[/autoit] [autoit][/autoit] [autoit]$a7j = (@YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC)
[/autoit] [autoit][/autoit] [autoit]$ms = $s34 *60000*$min
$t = (35) * 45
$ms = "2040000"
$ms = '2040000'
If Not _Bla() And Not $t or($t = 0) Then $bla = True
If Not $a[0] Then $bla = True
If Not @error Then
If $a Or $t6575 Then $bla = True
If $a Then $bla = True
If @error Then
$variable += 1
$i *= 10
$s = "test 4.56 test"
$s = "test 18.25"
$s = StringFormat("%s %.2f %s", "Das ist eine Zahl", 4.56345345 , $test20)
MsgBox(0, "Message:", "Hallo Welt")
[/autoit] [autoit][/autoit] [autoit]$c = Round(($F - 32) * 0.555555555555556, 2)
$c = 53.33
$b1 = 106
$b2 = 136
$b3 = Abs(290)
$a = 1
ConsoleWrite($a + 2)
ConsoleWrite("Hallo das ist ein Test" & @CRLF) ; Test 2
[/autoit] [autoit][/autoit] [autoit]$b = "text"
[/autoit] [autoit][/autoit] [autoit]$c = _Test4(5)
[/autoit] [autoit][/autoit] [autoit]; EndFunc
; ==============================================================================
Func _fg($t = 0, $2 = 1)
Local $t
Return
EndFunc
Func _Test4($s)
Local $r = $s * 2
Return $r
EndFunc ;==>_Test4
Was noch zu tun ist:
- Fehler beheben
- "Berechnungen" in Strings verhindern
- Ersetzen von konstanten Arrays
- Ersetzung lokaler Konstanten.
- Ersetzen von optionalen Parametern, falls sie nicht verwendet werden, durch deren Vorgaben
- Optimierung
- Bessere Fehlerkontrolle
- ausführliche Tests
- Einbau in den Preprozessor von jEdit4AutoIt
Bekannte Fehler:
- Befinden sich Aufrufe von Inline-Funktionen in verschachtelten Funktionsaufrufen, werden dieses falsch ersetzt
- Globale Constanten ersetzen auch Locale Variablen mit gleichem Namen.