Jump to content

Inline Assembler Snippets


UEZ
 Share

Recommended Posts

In my distant past, 20 years ago, I was programming in assembler for Motorola 68000 Amiga500, even I created a GUI interface with Amiga OS system API.
Some time ago, seeing this your topic, I wanted to recall something about assembler, so I read the tutorials, but in the end I did not have time then to finish my education in this field.

I recently had some problems with StringReverse, but now in principle, can be considered as solved.

However today, when this, your topic appeared again on the surface of the forum, I thought, if it would be better to use ASM, and act directly on the binary data without having to perform additional operations, which so far I had to do when I use StringReverse function.

So that's why I just asked you here.

 

Edited by mLipok

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related:How to get reference to PDF object embeded in IE * IE on Windows 11

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

 

On 6/21/2016 at 10:09 PM, mLipok said:

I recently had some problems with StringReverse, but now in principle, can be considered as solved.

This is not directly ASM related but I created a StringReverse function with FreeBasic which you may test.

$sText = "Hello World"

If Not FileExists("StringReverse.dll") Then _DLL(True)
$aReturn = DllCall("StringReverse.dll", "str", "StringReverse", "str", $sText)

ConsoleWrite($aReturn[0] & @CRLF)

;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2015-09-19

Func _DLL($bSaveBinary = False, $sSavePath = @ScriptDir)
    Local $DLL
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= 'AT0BwWWF23QojXYAFIsDgSfVgAOJxv8A14XAdQyF9nQACItDBIk0JP8A0ItbCIXbdduFpglAYiwEg8QcgkTp4AehZOJldeVl4ZtBmhIMQZsEJOJlyPf/Yv/gicN0QoF9hAmJQgOAASSJQwRjFKFNRBSJYhVlBEMIYw4xQsCiDhhbw7jhfes49In25KviqWEQi1wUJCDgEA+gBDHAW2DDkI20JuEDCyEVA6QM4E4XiwI52HUACutOiwg52XRAKInCi0II4AfxA28d6gmLSAiJSgghIbDa9v//jQXr0UCJ0ItSCIniDOue2eAj4RMBHYF2hH8ACIByHYP4A3UN5CaYD4Wd4YElzsOQ5gLOkyGCgQEgB3XewiPAkigRi1iCD12AD4XbwInYde/HBUEDQh3WBcEFih4ExBKe5iXkC3x0F6MFoQ6nD+AVRgc8kUQH1+ipoHzpWcAuacHa6JuhAWOgAeNNAwBAPIE4UEUAAAR0BUDhZpBmgXgAGAsBD5TAD7YGwOEJ4d9mgThNWhnkA+vOBCnkEVZTiwhUJAyANxADUjwAD7dyBg+3QhQAhfaNRAIYdBsAMcmQi1AMOdoAdwcDUAg503IADIPBAYPAKDlo8XXoYDJe4QvhXTEC9iBei3wkMIk8QCToG/X//zBOd7ALZoE9ATaQBwvwKiSJ8BIrkLgxAehGo/ALQBDnoTzxTJAxARAPt4AUYgBqBo0AXAIYhe11DusAx2aQg8YBg8NgKDnudCZBSmBeAACJfCQEiRwk6NaWMIYAI97BBd7kBfACgMQcMfZbifDiMYHwElMx24PsCLcIsfApCInY9yTzCLZwRH3wCOPQErEvMQHSQfI+2UvAAVEDw3EDMcC3BAPu8/UM8WzwA+/yDJAMAGpGECAG8AdWMfYGA1OxYBYMdA2xCvwHNvMDCuXzEIj4EI1UARgAD7dJBoXJdMcBsAeQ9kInIHQHMcBDFoPrsBiAgyg5IMh16TH2UgVmkEyJ1oIA9zkx2wcLBEsRDBMHxGAkhcCyAA+fcFxwAfND+g3xFOwIAwNSkwIDdCUgEgwuErYBwwESi0Ak99DBTOgf4BL2BOvylG2/YVEAV1Yx/zA5FxmLoHQkGHQJ8RX4IYWVwwYm8wTp8hCLmAB5LfFS2iSDIgJDIwLGgYLDUgjadQvruvAoRIPuIBEUi0owZ3UIB4tCYY8chfZ/EOiLegwwBltegTLH4gL4X/QJQAEx/x+jB/I0kjiBpwQAUVA9ATE9jUwkDHIVgcLpsQCDCQAtcQCCAZB36ynBAAFYWeADWP8lxEA7cQDAdACoVXQAkHQAjHQAhHQAcA9yAFA7FgDwjl3pB90DFmXhVsAUABBAN/ujRfEA0PAAsQAPAA8ADwC/DwAPAA8ADwAPAAEAZHAKBzEKAQBBwE7mQLux+Bm/RJ8CDwAPAA8ADwD/DwAPAA8ADwAPAA8ADwAPAP8PAA8ADwAPAA8ADwAPAA8APw8ADwAPAA8ADwAPAAAAAGxpYmdjai0xADYuZGxsAF9KAHZfUmVnaXN0AGVyQ2xhc3NlAnN0AsB3ABDAdBAAEPArQEBpbmcAdy13NjQgcnUAbnRpbWUgZmEAaWx1cmU6CgAAQWRkcmVzcyAAJXAgaGFzIG4AbyBpbWFnZS0Ac2VjdGlvbgAAICBWaXJ0dWFAbFF1ZXJ5ggNlAGQgZm9yICVkACBieXRlcyBhOHQgYVYEsQc2A1ByDG90cARVA3dpdGgAIGNvZGUgMHgEJXhxAlVua25vAHduIHBzZXVkAG8gcmVsb2NhCXEHIHCgA29jb2wgIHZlcnMBASVkDi7Q4D8DOANiaXQgEHNpemW1AkdDQwA6IChpNjg2LQBwb3NpeC1zagBsai1yZXYwLEAgQnVpbHQADCBhwBFHVy1XwBEgB2oB0AopIDQuOS4zwfsDd2luMzL/A/8DwfEDNS4yLjD/A/8DB/8D/wP8A6SzAGotcmV2MCwgAEJ1aWx0IGJ5ACBNaW5H'
    $DLL &= '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'
    $DLL &= 'DDMlM34AM8gz3zPmM/IAM/kzlTSoNK8ANLw0wzRVNWgANW81fDWDNYYAN5c3njexN8IAN8g33TfsN/QANwk4FTgbOCUAOC44UDhZOHIAOIE4lDibOLYAOMY40jjsOAEAORI5IjkqOTIAOTo5QjlKOVIAOVo5YjlqOXIAOYU5qzm8OfcAOQ86KTpoOoYAOps6rDq0OrwEOssgIPM6GDsoADs5Oz47QztLADtQO1g7YTtrADtxO3o7izv2ADsDPCI8KDw9ADylPMA83TwIAD0WPVc9hT2SAD23PdQ94T32AD39PQs+HT4xAWAmWz58Po4+kwA+mD6vPrw+ygA+zz7cPvE+/gA+BD8xP0k/TwA/Xz9lP3Y/fAQ/g2Aonz/JP+AIP/o/wB8wAAC4AWAABDAlMDcwQwAwXzBoMIwwrAAwxDDaMO4wCgAxEDEWMR8xJQAxWDFeMXExpVAxtDG58CDJ8BX1ADETMhkyHzJEADJKMnEydzKHADKpMsEyzjLYADLzMv0yCDMOADMhMyszQzNJADMNNCE0LzQ1ADQ8NJk0sTTFADTKNOU08TT/ADQGNRY1MTU/ADVFNUw1ljWjADWvNcU11DXoADXtNSs2QTZPAXAjZDZzNqI2/gA2BjcONxY3HgA3JjcuN1Q3WAA3ZDcAQAAADJMxLPALAFCiLAAosCAKMPEA4PMADDAYMAoc8QDw8wAEMAgw+AwwEBEBDwAPAA8ADwD/DwAPAA8ADwAPAA8ADwAPAAcPAA8ABgA='
    $DLL = _WinAPI_Base64Decode($DLL)
    If @error Then Return SetError(1, 0, 0)
    Local $tSource = DllStructCreate('byte[' & BinaryLen($DLL) & ']')
    DllStructSetData($tSource, 1, $DLL)
    Local $tDecompress
    _WinAPI_LZNTDecompress($tSource, $tDecompress, 18944)
    If @error Then Return SetError(3, 0, 0)
    $tSource = 0
    Local Const $bString = Binary(DllStructGetData($tDecompress, 1))
    If $bSaveBinary Then
        Local Const $hFile = FileOpen($sSavePath & "\StringReverse.dll", 18)
        If @error Then Return SetError(2, 0, $bString)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return $bString
EndFunc   ;==>_DLL

Func _WinAPI_Base64Decode($sB64String)
    Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
    Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
    $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($bBuffer, 1)
EndFunc   ;==>_WinAPI_Base64Decode

Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize)
    $tOutput = DllStructCreate("byte[" & $iBufferSize & "]")
    If @error Then Return SetError(1, 0, 0)
    Local $aRet = DllCall("ntdll.dll", "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", $iBufferSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0)
    If @error Then Return SetError(2, 0, 0)
    If $aRet[0] Then Return SetError(3, $aRet[0], 0)
    Return $aRet[6]
EndFunc   ;==>_WinAPI_LZNTDecompress

 

This is the ASM code generated by FreeBasic which is not complete listed:

.intel_syntax noprefix

.section .text
.balign 16

.globl _DllMain@12
_DllMain@12:
push ebp
mov ebp, esp
sub esp, 4
mov dword ptr [ebp-4], 0
.Lt_0004:
mov dword ptr [ebp-4], 1
cmp dword ptr [ebp+12], 1
jne .Lt_0006
push 0
push 0
call _main
add esp, 8
.Lt_0006:
.Lt_0005:
mov eax, dword ptr [ebp-4]
mov esp, ebp
pop ebp
ret 12
.balign 16

.globl _StringReverse
_StringReverse:
push ebp
mov ebp, esp
sub esp, 8
mov dword ptr [ebp-4], 0
.Lt_0007:
push 0
push dword ptr [ebp+8]
call _fb_StrLen@8
mov dword ptr [ebp-8], eax
jmp .Lt_0009
.Lt_000C:
push 0
push -1
push 1
push dword ptr [ebp-8]
push dword ptr [ebp+8]
call _fb_StrAllocTempDescZ@4
push eax
call _fb_StrMid@12
push eax
push -1
push offset _sReverse
call _fb_StrConcatAssign@20
.Lt_000A:
add dword ptr [ebp-8], 4294967295
.Lt_0009:
cmp dword ptr [ebp-8], 1
jae .Lt_000C
.Lt_000B:
mov eax, dword ptr [_sReverse]
mov dword ptr [ebp-4], eax
.Lt_0008:
mov eax, dword ptr [ebp-4]
mov esp, ebp
pop ebp
ret 4
.balign 16
_main:
push ebp
mov ebp, esp
and esp, 0xFFFFFFF0
sub esp, 4
mov dword ptr [ebp-4], 0
call ___main
push 0
push dword ptr [ebp+12]
push dword ptr [ebp+8]
call _fb_Init@12
.Lt_0002:
.Lt_0003:
mov eax, dword ptr [ebp-4]
mov esp, ebp
pop ebp
ret

.section .bss
.balign 4
    .lcomm  _sReverse,12

.section .drectve
    .ascii " -export:StringReverse"

 

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

Here is my modified version:

_Example()
Func _Example()
    Local $sFileFullPath = FileOpenDialog('Choose file',@ScriptDir,'Files (*.*)')
    If @error Then Return -1

    Local $sText = FileRead($sFileFullPath)
    ConsoleWrite("! FileSize=" & FileGetSize( $sFileFullPath) & @CRLF)
;~  Local $sText = "Hello World"

    If Not FileExists("StringReverse.dll") Then _DLL(True)
    Local $hTimer, $fDiff

    $hTimer = TimerInit()
    Local $aReturn = DllCall("StringReverse.dll", "str", "StringReverse", "str", $sText)
    ConsoleWrite("! Time 1=" & TimerDiff($hTimer) & @CRLF)

    $hTimer = TimerInit()
    StringReverse($sText)
    ConsoleWrite("! Time 2=" & TimerDiff($hTimer) & @CRLF)

;~  ConsoleWrite($aReturn[0] & @CRLF)

EndFunc   ;==>_Example

;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2015-09-19
Func _DLL($bSaveBinary = False, $sSavePath = @ScriptDir)
    Local $DLL
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= 'DDMlM34AM8gz3zPmM/IAM/kzlTSoNK8ANLw0wzRVNWgANW81fDWDNYYAN5c3njexN8IAN8g33TfsN/QANwk4FTgbOCUAOC44UDhZOHIAOIE4lDibOLYAOMY40jjsOAEAORI5IjkqOTIAOTo5QjlKOVIAOVo5YjlqOXIAOYU5qzm8OfcAOQ86KTpoOoYAOps6rDq0OrwEOssgIPM6GDsoADs5Oz47QztLADtQO1g7YTtrADtxO3o7izv2ADsDPCI8KDw9ADylPMA83TwIAD0WPVc9hT2SAD23PdQ94T32AD39PQs+HT4xAWAmWz58Po4+kwA+mD6vPrw+ygA+zz7cPvE+/gA+BD8xP0k/TwA/Xz9lP3Y/fAQ/g2Aonz/JP+AIP/o/wB8wAAC4AWAABDAlMDcwQwAwXzBoMIwwrAAwxDDaMO4wCgAxEDEWMR8xJQAxWDFeMXExpVAxtDG58CDJ8BX1ADETMhkyHzJEADJKMnEydzKHADKpMsEyzjLYADLzMv0yCDMOADMhMyszQzNJADMNNCE0LzQ1ADQ8NJk0sTTFADTKNOU08TT/ADQGNRY1MTU/ADVFNUw1ljWjADWvNcU11DXoADXtNSs2QTZPAXAjZDZzNqI2/gA2BjcONxY3HgA3JjcuN1Q3WAA3ZDcAQAAADJMxLPALAFCiLAAosCAKMPEA4PMADDAYMAoc8QDw8wAEMAgw+AwwEBEBDwAPAA8ADwD/DwAPAA8ADwAPAA8ADwAPAAcPAA8ABgA='
    $DLL = _WinAPI_Base64Decode($DLL)
    If @error Then Return SetError(1, 0, 0)
    Local $tSource = DllStructCreate('byte[' & BinaryLen($DLL) & ']')
    DllStructSetData($tSource, 1, $DLL)
    Local $tDecompress
    _WinAPI_LZNTDecompress($tSource, $tDecompress, 18944)
    If @error Then Return SetError(3, 0, 0)
    $tSource = 0
    Local Const $bString = Binary(DllStructGetData($tDecompress, 1))
    If $bSaveBinary Then
        Local Const $hFile = FileOpen($sSavePath & "\StringReverse.dll", 18)
        If @error Then Return SetError(2, 0, $bString)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return $bString
EndFunc   ;==>_DLL

Func _WinAPI_Base64Decode($sB64String)
    Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
    Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
    $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($bBuffer, 1)
EndFunc   ;==>_WinAPI_Base64Decode

Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize)
    $tOutput = DllStructCreate("byte[" & $iBufferSize & "]")
    If @error Then Return SetError(1, 0, 0)
    Local $aRet = DllCall("ntdll.dll", "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", $iBufferSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0)
    If @error Then Return SetError(2, 0, 0)
    If $aRet[0] Then Return SetError(3, $aRet[0], 0)
    Return $aRet[6]
EndFunc   ;==>_WinAPI_LZNTDecompress

 

And the results are:

Quote

! FileSize=57963
! Time 1=1397.37528764505
! Time 2=68.8263892860164

Why ASM is so slow ?
Is this mean FreeBasic/ASM is not well optimized in comparision to AutoIt/C++ ?

 

Edited by mLipok

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related:How to get reference to PDF object embeded in IE * IE on Windows 11

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

8 minutes ago, mLipok said:

Why ASM is so slow ?
Is this mean FreeBasic is not well optimized in comparision to C++ ?

 

This is the result of the compiled version which "has been rated close in speed with mainstream tools, such as GCC". Maybe I used the wrong compiler settings.

 

I will do also some tests and reply later again.

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

14 minutes ago, UEZ said:

I will do also some tests and reply later again.

Promises to be interesting.

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related:How to get reference to PDF object embeded in IE * IE on Windows 11

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

I assume that StrPtr is causing that huge difference.

Global $sText

For $i = 0 to 222222
    $sText &= Chr(33 + Mod($i, 94))
Next

If Not FileExists("StringReverse.dll") Then _DLL(True)
$hDLL = DllOpen("StringReverse.dll")

$fTimer = TimerInit()
$aReturn = DllCall($hDll, "str", "StringReverse", "str", $sText)
$fEnd1 = TimerDiff($fTimer)

$fTimer = TimerInit()
$sResult = StringReverse($sText)
$fEnd2 = TimerDiff($fTimer)

ConsoleWrite(@CRLF)
ConsoleWrite("FreeBasic: " & Round($fEnd1, 2) & " ms" & @CRLF)
ConsoleWrite("AutoIt: " & Round($fEnd2, 2) & " ms" & @CRLF)
ConsoleWrite("Factor: " & Round($fEnd1 / $fEnd2, 2) & @CRLF)

DllClose($hDLL)


;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2015-09-19

Func _DLL($bSaveBinary = False, $sSavePath = @ScriptDir)
    Local $DLL
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= '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'
    $DLL &= 'AakWBAABgABhEAyuBHMCcLB3dGYAvQRzUHRybGVwGsCRAG4AY21wAOEEdmYP5AHAQz8AMQB2tBAA8AAAaTBLRVIATkVMMzIuZGwybAAiABQAE1UDbXNwdmNydAVp/wAeABCDQAAEALBFABBgwAD/PxU/AD8APwA/AD8APwDVfQgBEBxgAIyYABD4GAABfz4fAB8AHwAfAP8fAB8AHwAfAB8AHwAfAB8AEx8AcX4AoMAAHTAiADBPMGIwZzCHADCQMNcw+jAFADETMSAxNjFcADGBMZQxwjHMADHYMeIxAjIUADIbMiEySDJPADJaMoEyiDK5ADIVNFc0YjRoADR8NIU0lTSeADRrNaA1tzUBADZRNlw2eTaLADaiNsc21zbgADYFNw43FzckADekN8c38Tc/ADhUOHc4kjhzADufOwM8NzyVADygPNE87Tz0ADwcPSM9MD13AD9+P5c/ACAABAC84BMzMXgxvwAx2zEHMiwyRAAylTKrMrgyxgAy0zLdMvMyBgAzEDMWM0MzTAAzYTOdM+Ez8gAzBjQQNBo0KQA0LTSoNMU04QA0gzexN/Q3oQA4qzi0ONI46wA4oznOOfE5AwA6MTpROnU6egA6pzrROgU7DAA7FTscO5Q7zAA77zwEPSc9QgA9bj1/PYo9mAA9oz3MPdI94gA97D0CPgw+IQA+Jz5BPmE+ggA+lD65Ptw+5gA+7j74Pgw/JQEgFsg/3z/mP/IIP/k/gBYwAACAAcAAlTCoMK8wvAAwwzBVMWgxbwAxfDGDMckz4wAzRDXWNec17gEgJRI2GDYtNjwANkQ2WTZlNmsANnU2fjagNqkANsI2djdtONwAOAA5tDm7OchAOc85KzpJYBUWADvDOx08PDwMED1yPcEgE+E99wA9CD4VPjQ+RQA+Tj5kPpI+NAHhD0AAAGABAAAAGDBkMUEyVDIAWzJ2MoYykjIArDLBMtIy4jIA6jLyMvoyAjMACjMSMxozIjMAKjMyMzozRTMAazN8M7czzzMA6TMoNEY0WzQIbDR0sB2LNK40ALM02DToNPk0AP40AzULNRA1ABg1ITUrNTE1ADo1SzW2NcM1AOI16DX9NWU2AIA2nTbINtY2ABc3RTdSN3c3AJQ3oTe2N703CMs33ZAfATgbOAA8OE44UzhYOABvOHw4ijiPOACcOLE4vjjEOADxOAk5DzkfOQAlOTY5PDlDOQBVOV85iTmgOYC6OcQ55Tn3MBsAHzooOkw6bDoAhDqaOq46yjoA0DrWOt865ToAGDseOzE7ZTsAdDt5O4I7iTsAkju1O9M72TuA3zsEPAo8MRAmAEc8aTyBPI48AJg8szy9PMg8AM484TzrPAM9CAk9zRAU7z31PQD8PVk+cT6FPgCKPqU+sT6/PgDGPtY+8T7/PgAFPww/Vj9jPwBvP4U/lD+oPwitP+vxFVAAACgBYAABMA8wFTAkBDAz8DOSMJowogAwqjCyMLowwgAw5DDoMPQwADBgAAAM4SDwIABwCAAAHGAATDBQMABUMFgwXDBgMIBkMHAwdDB40AGCAQJ3DDAYMByxAgIQ8wAEMAgwDDB+EBEBDwAPAA8ADwAGAA=='
    $DLL = _WinAPI_Base64Decode($DLL)
    If @error Then Return SetError(1, 0, 0)
    Local $tSource = DllStructCreate('byte[' & BinaryLen($DLL) & ']')
    DllStructSetData($tSource, 1, $DLL)
    Local $tDecompress
    _WinAPI_LZNTDecompress($tSource, $tDecompress, 27136)
    If @error Then Return SetError(3, 0, 0)
    $tSource = 0
    Local Const $bString = Binary(DllStructGetData($tDecompress, 1))
    If $bSaveBinary Then
        Local Const $hFile = FileOpen($sSavePath & "\StringReverse.dll", 18)
        If @error Then Return SetError(2, 0, $bString)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return $bString
EndFunc   ;==>_DLL

Func _WinAPI_Base64Decode($sB64String)
    Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
    Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
    $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($bBuffer, 1)
EndFunc   ;==>_WinAPI_Base64Decode

Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize)
    $tOutput = DllStructCreate("byte[" & $iBufferSize & "]")
    If @error Then Return SetError(1, 0, 0)
    Local $aRet = DllCall("ntdll.dll", "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", $iBufferSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0)
    If @error Then Return SetError(2, 0, 0)
    If $aRet[0] Then Return SetError(3, $aRet[0], 0)
    Return $aRet[6]
EndFunc   ;==>_WinAPI_LZNTDecompress

 

Delete the old DLL.

 

My result:

FreeBasic internal benchmark: 9.416275106559624 ms.

FreeBasic: 9419.97 ms
AutoIt: 144.37 ms
Factor: 65.25

 

FreeBasic code:

Extern "Windows-MS"

Dim Shared As String sReverse

Function StringReverse(sString As ZString Ptr) As ZString Ptr Export
    Dim As Double fStart, fEnd
    fStart = Timer
    For i As Uinteger = Len(*sString) To 1 Step - 1
        sReverse &= Mid(*sString, i, 1)
    Next
    fEnd = Timer - fStart
    Print "FreeBasic internal benchmark: " & fEnd & " ms."
    Return StrPtr(sReverse)
End Function


End Extern

 

Compiler options: fbc -s gui -dll -export -RR -fpu SSE -vec 2

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

1 hour ago, UEZ said:

Print "FreeBasic internal benchmark: " & fEnd & " ms."

 

Quote

Returns a Double precision result with the time, in seconds, since a static reference point.

little mistake ?


So I se there is not always so fast using outside feature/functions/dll.
Sometimes internal AutoIt solutions are better/faster.

 

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related:How to get reference to PDF object embeded in IE * IE on Windows 11

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

I assume that my FB code is shit and thus the worse performance and it can be coded much better which I don't know yet.

 

Or you can try to implement StringReverse completely in ASM which seems not to be a simple task because of unicode support at least for me.

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

30 minutes ago, UEZ said:

I assume that my FB code is shit and thus the worse performance and it can be coded much better which I don't know yet.

You are making self critic?

Or you are trying to tell me that I was using "wrong wording"?

I'm little confused. 

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related:How to get reference to PDF object embeded in IE * IE on Windows 11

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

8 minutes ago, mLipok said:

You are making self critic?

Yep. I'm new to FB and talked about my FB code. :rolleyes:

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

Hi,

@mLipok, long time ago I tried to beat the AutoIt-String-Functions with ASM-Scripts, and fortunately ( ! ) it´s not worth the work....i worked with strings up to 100MB size, the shorter the string, the (relative) bigger the overhead of the DllCallAddress().....the shorter the string, the faster the internal (string!-)functions!

The stringfunctions in AutoIt are VERY fast, thanks to all the programmers in the last 30 years to optimize their code and (used by AutoIt) C-librarys!

 

If you have an ANSI-String (one Byte=one Letter), you should absolutely use the StringReverse()-function with flag=1!

 

But some hints if you want to play with ASM or other compiler-languages or dlls. 

We could call the ASM-code within 2 scenarios:

(1)       DllCallAddress("str:cdecl", $codestructptr, "str*", $ansistring)

where $codestructptr is the address of the ASM-code, $ansistring is the string to reverse and $ansistringlen is.....the stringlen. This forces the Assemblercode to work with a pointer to the pointer of the string. Remember that, if you ever want to play with AutoIt, Assembler and strings. By the "str*" you get the pointer to the pointer....Btw. "str:cdecl" returns the processed string back to Autoit! 

Because of AutoIt´s internal structure, this is the worst way to call a string-related function, because $ansistring got copied before we can work with it. The internal functions first have to reserve memory and copy the string into the memory, this is very "expensive" (in terms of Assembler). But it looks very professional to work with pointers to a string....Only to mention, time to "copy" the 100MB-string takes 1000ms while exchange the letters (reversestring) with ASM-code takes 150ms (on my machine)

But we could do the "stringcopy" by hand, reserve memory with dllstructcreate()  and copy the string into this memory with dllstructsetdata(). And we call our code like this

(2)       DllCallAddress("none:cdecl", $codestructptr, "ptr", $ansistringptr)

This function returns "nothing" because the processed string is in the memory (dllstruct) and can be get by dllstructgetdata()

This makes sense, if we want to work with string(s) in a way that is not supported by native AutoIt-Stringfunctions....

 

Here a simple code which demonstrates the difference of the mentioned above...

$string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"               ;make a 109MB long string
For $i = 1 To 22
    $string &= $string
Next
$stringlen = StringLen($string)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $stringlen = ' & $stringlen & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console


$ptr2string = 123456                                 ;a "pointer", doesn't matter anything...only for example

$struct = DllStructCreate("Byte")                    ;reserve memory
$ptr = DllStructGetPtr($struct)                      ;pointer to memory
DllStructSetData($struct, 1, 0xC3)                   ;write RET(urn) assembler opcode


;now we test a call with pointer(to anything) vs call of string
$t = TimerInit()
DllCallAddress("none:cdecl", $ptr, "str", $ptr2string) ;pointer
$m = TimerDiff($t)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console


$t = TimerInit()
DllCallAddress("none:cdecl", $ptr, "str*", $string)  ;string
$m2 = TimerDiff($t)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m2 = ' & $m2 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

The time of running a whichever function doing something with a string is wasted if "str*" is used...

If you want do do anything with a string with AutoIt ( HLL/ASM/DLL...), try to get a pointer to that string!

 

 

 

Edited by AndyG
Link to comment
Share on other sites

I'm really a novice when it comes to DllCall feature in AutoIt, as I never used it more then with help others.
But reading your lecture I understand what you stated. The more seeing results.
I just wonder whether it will increased UEZ knowledge , in a way, that as a result he will be able to create something wonderful with his example ;)

I have a great hope.

mLipok

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related:How to get reference to PDF object embeded in IE * IE on Windows 11

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

Hello. I think is not so hard to make a fast string reverse. @UEZ you FB function internally does a lot of thing for just reverse a string. I think would be faster do something like:

Create a empty buffer with the needed string size.

then simply  mov byte if is ansi or word if is unicode to my buffer from the source string.

another alternative could be using swapping to reduce loops.

Regards

 

Link to comment
Share on other sites

Here enclosed an example of ASM-Code, very simple, shows the difference between the "external" functions and the advantage of "internal" AutoIt function. The reasons of the different execution speed are mentioned above.

But, if supposed (no, i am really sure ^^) that the AutoIt internal function is able to use the pointer to the string, the execution time is directly dependent to the compiled (I suppose C(++)-) Code. And shown with the attached script, the simplest ASM-code is 50% faster than the "compiled" one (related to reverse the string, no memory-related stuff!). Which is not a wonder, because EVERY M$-(API)Function is overloaded by jumps and calls to other functions, errormanagement, and so on.

If the socalled "Programmer" knows that and is looking for "fast(er) code", M$ provides "intrinsics"-Function which are nothing else than inlined native ASM-opcodes. So you can speedup code 200-300% if only one little piece of code is replaced....

If you have a loop which, for example, calculates trigonometric functions (sin/cos/tan) many many times, replace the C(++)-function  sinf by the corresponding "Intrinsic function" and you can half/third the execution time! Not to mention what the programmer could reach with SSE/AVX....

Ultimately all this does no matter if AutoIt is your preferred language.  In the most cases AutoIt is fast enough, if you really want to speed up your code, profile it, find the "inner loop" and replace the whole loop with a "compiled" function....

 

Script, 32bit-code asm, comparison between call of "str" and "str*"

#AutoIt3Wrapper_UseX64=n
;#include "assembleit2_64.au3"           ;AssembleIt assembler with debugger and much more features at autoit.de


#cs _StringReverse2
    use32                               ;32 bit

    mov esi,[esp+4]                     ;address string adress first letter
    mov ecx,[esp+8]                     ;number of letters

    lea edi,[ecx+esi]                   ;address of last letter
    sub edi,1
    shr ecx,1                           ; = /2 only half the letters to xchg

    _loop:
    mov bl,[edi]                        ;save last letter to change
    mov bh,[esi]                        ;save first letter to change
    mov [edi],bh                        ;change letters
    mov [esi],bl                        ;as usual
    add esi,1                           ;adress second letter...
    sub edi,1                           ;adress penultimate letter...

    sub ecx,1                           ;half the string reached?
    jnz _loop                           ;no, then loop again

    ret

#ce


#cs _StringReverse
    use32                               ;32 bit

    mov esi,[esp+4]                     ;address string adress first letter
    mov esi,[esi]                       ;strings have pointer to a pointer....
    mov ecx,[esp+8]                     ;number of letters

    lea edi,[ecx+esi]                   ;address of last letter
    sub edi,1
    shr ecx,1                           ; = /2 only half the letters to xchg

    _loop:
    mov bl,[edi]                        ;save last letter to change
    mov bh,[esi]                        ;save first letter to change
    mov [edi],bh                        ;change letters
    mov [esi],bl                        ;as usual
    add esi,1                           ;adress second letter...
    sub edi,1                           ;adress penultimate letter...

    sub ecx,1                           ;half the string reached?
    jnz _loop                           ;no, then loop again

    ret

#ce


;make a 100MB string
$string = "ABCD"
For $i = 1 To 44
    $string = $string & Chr($i + 40)    ;String erstellen )*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRST
Next

For $i = 1 To 21                        ;pump it up...
    $string &= $string
Next
$string &= "ENDE"
$stringlen = StringLen($string)
ConsoleWrite('$stringlen = ' & $stringlen & " Bytes" & @CRLF & @CRLF) ;### Debug Console


Global $filestructptr, $asm_only

;~ $asmcode = _AssembleIt2("retbinary", "_StringReverse") ;erstellt den asmcode
;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $asmcode = ' & $asmcode & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

$asmcode = "0x8B7424048B3689F08B4C24088D3C3183EF01D1E98A1F8A3E883F881E83C60183EF0183E90175EDC3" ;by AssembleIt
$codestruct = DllStructCreate("byte[" & StringLen($asmcode) / 2 - 1 & "]") ;speicher für asmcode...
DllStructSetData($codestruct, 1, $asmcode) ;...mit code füllen


;~ $asmcode2 = _AssembleIt2("retbinary", "_StringReverse2") ;erstellt den asmcode
;~  ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $asmcode2 = ' & $asmcode2 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$asmcode2 = "0x8B7424048B4C24088D3C3183EF01D1E98A1F8A3E883F881E83C60183EF0183E90175EDC3" ;by AssembleIt
Global $codestruct2 = DllStructCreate("byte[" & StringLen($asmcode2) / 2 - 1 & "]") ;speicher für asmcode...
DllStructSetData($codestruct2, 1, $asmcode2) ;...mit code füllen


;string into memory, we get a pointer
$stringstruct = DllStructCreate("char[" & $stringlen & "]")
$stringptr = DllStructGetPtr($stringstruct)
DllStructSetData($stringstruct, 1, $string)


;~ $t = TimerInit()
;~ $ret = _AssembleIt2("str", "_StringReverse", "str*", $string, "uint", $stringlen)
;~ $m = TimerDiff($t)
;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : time _StringReverse= ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

;~ $t = TimerInit()
;~ $ret = _AssembleIt2("none", "_StringReverse2", "ptr", $stringptr, "uint", $stringlen)
;~ $m = TimerDiff($t)
;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : time _StringReverse2 = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console



$t = TimerInit()
$string1 = _StringReverse_ASM($string)
$stringreverseasm = Int(TimerDiff($t))
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $stringreverseasm = ' & $stringreverseasm & "ms   str* - version copies the string internal" & @CRLF & @CRLF) ;### Debug Console

$t = TimerInit()
$string2 = _StringReverse_ASM2($string)
$stringreverseasm2 = Int(TimerDiff($t))
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $stringreverseasm2 = ' & $stringreverseasm2 & "ms    ptr - version needs read/write of dllstruct" & @CRLF & @CRLF) ;### Debug Console

$t = TimerInit()
$string3 = StringReverse($string, 1)
$stringreverseAutoIt = Int(TimerDiff($t))
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $stringreverseAutoIt = ' & $stringreverseAutoIt & "ms  native AutoIt (rulez!!!)" & @CRLF & @CRLF) ;### Debug Console


ConsoleWrite(StringLeft($string1, 50) & @CRLF & StringLeft($string2, 50) & @CRLF & StringLeft($string3, 50) & @CRLF & @CRLF)



Func _StringReverse_ASM($ansistring)    ;str* - version
    $ret = DllCallAddress("str:cdecl", DllStructGetPtr($codestruct), "str*", $ansistring, "uint", StringLen($ansistring))
    Return $ret[0]
EndFunc                                 ;==>_StringReverse_ASM


Func _StringReverse_ASM2($ansistring)   ;ptr - version
    $stringstruct = DllStructCreate("char[" & StringLen($ansistring) & "]")
    $stringptr = DllStructGetPtr($stringstruct)
    DllStructSetData($stringstruct, 1, $string)
    $r = TimerInit()
    $ret = DllCallAddress("int:cdecl", DllStructGetPtr($codestruct2), "ptr", $stringptr, "uint", StringLen($ansistring))
    $asm_only = Int(TimerDiff($r))
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $asm_only = ' & $asm_only & "ms   without memory related stuff like read/write of dllstruct" & @CRLF & @CRLF) ;### Debug Console
    $ret = DllStructGetData($stringstruct, 1)
    Return $ret
EndFunc                                 ;==>_StringReverse_ASM2

 

Simple example of AssembleIt(), possibility for everyone to improve the asm-code ;) . Feel free to write a really "fast" one, SSE/SIMD is recommended, challenge anyone? 1.9clockticks per reversed char atm...

#AutoIt3Wrapper_UseX64=n
#include "assembleit2_64.au3"             ;AssembleIt assembler with debugger and much more features at autoit.de


#cs _StringReverse2
    use32                                 ;32 bit

    mov esi,[esp+4]                       ;address string adress first letter
    mov ecx,[esp+8]                       ;number of letters

    lea edi,[ecx+esi]                     ;address of last letter
    sub edi,1
    shr ecx,1                             ; = /2 only half the letters to xchg

    _loop:
    mov bl,[edi]                          ;save last letter to change
    mov bh,[esi]                          ;save first letter to change
    mov [edi],bh                          ;change letters
    mov [esi],bl                          ;as usual
    add esi,1                             ;adress second letter...
    sub edi,1                             ;adress penultimate letter...

    sub ecx,1                             ;half the string reached?
    jnz _loop                             ;no, then loop again

    ret

#ce



;make a 100MB string
$string = ""
For $i = 1 To 21                          ;pump it up...
    $string &= $string & ")*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Next
$stringlen = StringLen($string);len
ConsoleWrite('$stringlen = ' & $stringlen & " Bytes" & @CRLF & @CRLF) ;### Debug Console

;put string into memory, so we can get a pointer
$stringstruct = DllStructCreate("char[" & $stringlen & "]")
$stringptr = DllStructGetPtr($stringstruct)
DllStructSetData($stringstruct, 1, $string) ;string into memory

;lets have a look, how fast the code is (assembling is only 2-3ms)
$t = TimerInit()
$ret = _AssembleIt2("none", "_StringReverse2", "ptr", $stringptr, "uint", $stringlen)
$m = TimerDiff($t)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : time _StringReverse = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console


$stringreverse = DllStructGetData($stringstruct, 1)
ConsoleWrite("First 50 characters of " & Int($stringlen / 1e6) & "MB string and reversestring" & @CRLF & StringLeft($string, 50) & @CRLF & StringLeft($stringreverse, 50) & @CRLF & @CRLF)

AssembleIt2_64.zip

Edited by AndyG
Link to comment
Share on other sites

Hello. Very fast @AndyG I did my own rutine. (is not so fast) but it work good.

I was thinking I create one a little faster than this but I have a lot of time without touch this kind of stuff. 

I think is possible to do some a little faster than you without using SSE/SIMD. maybe using bswap to reduce loops. (I don't have time for check.)

 

Well. this is my small rutine.

#AutoIt3Wrapper_UseX64=n
#include "assembleit2_64.au3" ;AssembleIt assembler with debugger and much more features at autoit.de


#cs _StringReverse2
    use32                                 ;32 bit

    push ebp                                      ;save stack
    mov ebp,esp                                   ;save stack
    mov ecx,[ebp+16]                              ;set ecx String
    mov ebx,[ebp+12]                              ;set ebx Buffer
    mov edx,[ebp+8]                               ;set edx Base String
    xor edi,edi                                   ;clear edi
    _loop:                                        ;label
    mov al,byte[edx+ecx-1]                        ;get char
    mov byte[ebx+edi],al                          ;copy to new buffer
    inc edi                                       ;increment edi
    dec ecx                                       ;decrement ecx
    cmp ecx,0                                     ;compare
    jnz _loop                                     ;jump if !=0
    mov esp, ebp                                  ;release stack
    pop ebp                                       ;release stack
    ret                                           ;bye ret

#ce


;makea 100M Bstring
Local $sString = ""
For $i = 1 To 21
    $sString &= $sString & ")*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Next

$iStringLen = StringLen($sString);len
ConsoleWrite('$iStringLen= ' & $iStringLen & " Bytes" & @CRLF & @CRLF);###DebugConsole


Local $tStringBase = DllStructCreate("char[" & $iStringLen & "]")
Local $pStringBase = DllStructGetPtr($tStringBase)
DllStructSetData($tStringBase, 1, $sString)
Local $tOutString = DllStructCreate("char[" & $iStringLen & "]")

Local $hTimer = TimerInit()
Local $aRet = _AssembleIt2("none", "_StringReverse2", "ptr", $pStringBase, "ptr", DllStructGetPtr($tOutString), "uint", $iStringLen)
Local $iDiff = TimerDiff($hTimer)

ConsoleWrite("!Elapsed Time: " & $iDiff & @CRLF)

Local $sStringReverse = DllStructGetData($tOutString, 1)
ConsoleWrite("First 50 characters of: " & Int($iStringLen / 1e6) & "MB string and reverse string" & @CRLF)
ConsoleWrite(StringLeft($sString, 50) & @CRLF)
ConsoleWrite(StringLeft($sStringReverse, 50) & @CRLF)

Saludos

 

 

Link to comment
Share on other sites

@Danyfirex, very nice:thumbsup:

Challenge opened?:lmao:

I prefer to measure the clockticks of the running code, so it is possible to optimize with "little steps".

Last weekend i tried the SSE-version, unfortunately my (AMD)Processor doesn´t supports the "pshufb"-command, which is SSSE3 (yes, 3 times "S"). With the "older" SSE2/3 commands, it took a bunch of lines to shuffle the 16 bytes...grmblfxx...but in the end, the code was faster than before. 

Btw. "pshufb" is able to shuffle 16 bytes. With a corresponding mask, 16 bytes in 1 clocktick are reversed...

Same as "bswap" (swap 4 byte in a 32bit-register, you mentioned it), shown here... much faster than before. 

#AutoIt3Wrapper_UseX64=n
#include "assembleit2_64.au3"                      ;AssembleIt assembler with debugger and much more features at autoit.de

#cs _StringReverse2
    use32                                          ;32 bit

    mov ecx,[esp+12]                               ;set ecx Stringlen+padding
    mov edi,[esp+8]                                ;set ebx Buffer = destination
    mov ebx,[esp+4]                                ;set edx Base String = source

    rdtsc                                          ;ReaDTimeStampCounter, measure clockticks
    push eax                                       ;edx:eax=timerinit()

    sub ebx,4                                      ;get the last 4 chars first
    align 16                                       ;code aligning makes loop 10% faster
    _loop:                                         ;label

    mov eax,[ebx+ecx]                              ;get 4 chars ABCD
    bswap eax                                      ;thats what we want to do...
    mov [edi], eax                                 ;write 4 chars DCBA
    add edi,4                                      ;this is stosd btw...
    sub ecx,4                                      ;last 4 chars

    ja _loop                                       ;jump if >0

    rdtsc                                          ;clockticks in eax
    pop ebx                                        ;get clockticks saved before
    sub eax,ebx                                    ;timerdiff()

    ret                                            ;bye ret

#ce



;makea 100M Bstring
Local $sString = ""
For $i = 1 To 21
    $sString &= $sString & ")*+,-./0123456789:     ;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Next

Local $iStringLen = StringLen($sString)            ;len
ConsoleWrite('$iStringLen= ' & $iStringLen & " Bytes" & @CRLF & @CRLF) ;###DebugConsole

Local $padding = 4 - Mod($iStringLen, 4)           ;Register = 4 bytes
If $padding = 4 Then $padding = 0


Local $tStringBase = DllStructCreate("char[" & $iStringLen & "]")
Local $pStringBase = DllStructGetPtr($tStringBase)
DllStructSetData($tStringBase, 1, $sString)
Local $padding_struct = DllStructCreate("char[" & $iStringLen + $padding & "]")
$Outstring_ptr = DllStructGetPtr($padding_struct) + $padding
Local $tOutString = DllStructCreate("char[" & $iStringLen & "]", $Outstring_ptr)


Local $t = TimerInit()
Local $aRet = _AssembleIt2("uint", "_StringReverse2", "ptr", $pStringBase, "ptr", DllStructGetPtr($padding_struct), "uint", $iStringLen + $padding)
Local $iDiff = TimerDiff($t)


ConsoleWrite("!Elapsed Time   : " & $iDiff & @CRLF)
ConsoleWrite("!Clockticks     : " & $aRet & @CRLF)
ConsoleWrite("!Clockticks/Byte: " & Int($aRet / $iStringLen * 100) / 100 & @CRLF & @CRLF)


Local $sStringReverse = DllStructGetData($tOutString, 1)

ConsoleWrite("First 50 characters of: " & Int($iStringLen / 1e6) & "MB string and reverse string" & @CRLF)
ConsoleWrite(StringLeft($sString, 50) & @CRLF)
ConsoleWrite(StringLeft($sStringReverse, 50) & @CRLF)
ConsoleWrite("!$sStringReverse checked by AutoIt: " & ($sStringReverse = StringReverse($sString, 1)) & @CRLF & @CRLF)

 

Link to comment
Share on other sites

Hello @AndyG this new rutine in my machine is slower than before, even the one mine. about 20 times slower than your old rutine. I have a  Intel Processor.

Saludos

 

 

Link to comment
Share on other sites

7 hours ago, Danyfirex said:

 

Hello @AndyG this new rutine in my machine is slower than before, even the one mine. about 20 times slower than your old rutine. I have a  Intel Processor.

 

No, the code is faster, but AssembleIt2 is slower...but only with this AutoIt-sourcecode! 

I detected a "bug"(!?) in AssembleIt2 yesterday with this code. It costs me some hours to find out how. 

One of my used RegEx-pattern to eliminate the comments out of the code runs in a socalled "catastrophic backtracking". If you write a semicolon ; at the end of the AutoIt-Script, the "catastrophic backtracking" of the RegEx will be prevented!

 

This is one of the reasons to measure the clockticks within the asm-code...

 

Link to comment
Share on other sites

  • 3 years later...

I don't know how I missed this thread until now, here are some good stuffs. I will try these snippets soon but at first glance functions using MMX might not work well since I saw that pixel processing is done in loops like below

_loop1:
...
sub ecx, 4
ja _loop1

I have a guess that this might not be enough for bitmaps where number of pixels modulo 4 is not zero.

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

×
×
  • Create New...