1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. UEZ

Beiträge von UEZ

  • Assemblercode - Noch optimierbar?

    • UEZ
    • 23. November 2016 um 20:23

    Top :thumbup:

    Code
    : $pi Leibnitz = 3.14159255358581
    : Time [ms] = 28.442786194246

    Hier die kompilierten Versionen von VS2015 C++ und FreeBasic als Anhang.


    [Blockierte Grafik: http://www.hannover.de/var/storage/images/media/01-data-neu/bilder/redaktion-hannover.de/2016/2016_04/leibniz-butterkeks/13439944-1-ger-DE/Leibniz-Butterkeks_image_full.jpg]

    Dateien

    Leibniz.zip 26,76 kB – 467 Downloads
  • Assemblercode - Noch optimierbar?

    • UEZ
    • 23. November 2016 um 11:28
    Zitat von Mars

    Einen Grund kann ich dir sagen: das pow(-1, k) frisst. Selbst wenn das intern effektiv gehandelt wird hast du damit mehr Rechenaufwand als wenn du eine Vorzeichenvariable einführst.

    Stimmt! =O
    Bezgl. FB: hätte nicht gedacht, dass die Laufzeit von 1136ms auf 136ms sinkt, wenn ich das so mache wie du es gemacht hast.


    Edit: mit VS2015 habe ich 56ms hinbekommen.

    C
    // Leibniz-PI.cpp : Defines the entry point for the console application.
    //
    
    
    #include "stdafx.h"
    #include <iostream>
    #include <limits>
    #include <chrono>
    
    
    using namespace std;
    typedef std::numeric_limits< double > dbl;
    
    
    void main()
    {
    
    
    	auto start = std::chrono::high_resolution_clock::now();
    
    
    
    
    	unsigned int k, n = 10000000;
    	double fPI = 0.0, fSign = 1.0;
    	for (k = 0; k < n; k++) {
    		fPI += fSign / ((k << 1) + 1);
    		fSign = -fSign;
    	}
    	fPI *= 4.0;
    
    
    
    
    	auto end = std::chrono::high_resolution_clock::now();
    
    
    	std::chrono::duration<double> elapsed = end - start;
    
    
    	cout.precision(dbl::max_digits10);
    	cout << "Pi: " << fPI << '\t' << elapsed.count() * 1000 << " ms for " << n << " iterations." << endl;
    
    
    	cin.get();
    }
    Alles anzeigen
  • Assemblercode - Noch optimierbar?

    • UEZ
    • 23. November 2016 um 00:07

    Komisch, dass ich mit FB so bescheiden abschneide.

    Mit VS2015 bekomme ich immerhin 328ms.

    Ich habe absolut keinen Plan, wie ich den C++ Code optimieren kann geschweige denn, wie ich VS optimal einstellen kann.

    Hier der C++ Code:

    C
    // Leibniz-PI.cpp : Defines the entry point for the console application.
    //
    
    
    #include "stdafx.h"
    #include <iostream>
    #include <limits>
    #include <ctime>
    
    
    using namespace std;
    typedef std::numeric_limits< double > dbl;
    
    
    double Leibniz_PI(int n)
    {
    	double fPI;
    	int k;
    	fPI = 0.0;
    	for (k = 0; k < n; k++) {
    		fPI += (pow(-1, k)) / (2 * k + 1);
    	}
        return 4 * fPI;
    }
    
    
    void main()
    {
    	clock_t begin = clock();
    	double fResult = Leibniz_PI(10000000);
    	clock_t end = clock();
    	double elapsed_msecs = double(end - begin) / CLOCKS_PER_SEC * 1000.0;
    
    
    	cout.precision(dbl::max_digits10);
    	cout << "Pi: " << fResult << '\t' << elapsed_msecs << " ms" << endl;
    
    
    	cin.get();
    }
    Alles anzeigen


    Keine Ahnung, wie ich die Zeit als x64 messen kann...

    Wenn interesse besteht, kann ich die kompilierte EXE hochladen.


    @Andy: auf meinem Schleppi -> Intel i5 @2,5 GHz

    Code
    : $pi Leibnitz = 3.14159255358979
    : Time [ms] = 71.4103606789976
  • Assemblercode - Noch optimierbar?

    • UEZ
    • 22. November 2016 um 14:13

    Mit FreeBasic komme ich auf 1136.025325860828 ms für 10.000.000 Iterationen -> Intel i5-4300U @ 2594 MHz

    Der generierte Assembler Code:

    Code
    .globl _LEIBNIZ_PI@4
    _LEIBNIZ_PI@4:
    push ebp
    mov ebp, esp
    sub esp, 24
    mov dword ptr [ebp-8], 0
    mov dword ptr [ebp-4], 0
    .Lt_0004:
    mov dword ptr [ebp-12], 0
    movlpd xmm7, [_Lt_000B]
    movlpd [ebp-20], xmm7
    mov dword ptr [ebp-12], 0
    mov eax, dword ptr [ebp+8]
    add eax, 4294967295
    mov dword ptr [ebp-24], eax
    jmp .Lt_0007
    .Lt_000A:
    mov eax, dword ptr [ebp-12]
    and eax, 0xFFFF
    cvtsi2sd xmm6, eax
    mov eax, dword ptr [ebp-12]
    shr eax, 16
    cvtsi2sd xmm7, eax
    mulsd xmm7, qword ptr [_Lt_000E]
    addsd xmm6, xmm7
    sub esp, 8
    movlpd [esp], xmm6
    push dword ptr [_Lt_000C+4]
    push dword ptr [_Lt_000C]
    call _pow
    add esp, 16
    mov eax, dword ptr [ebp-12]
    shl eax, 1
    inc eax
    mov ecx, eax
    and ecx, 0xFFFF
    cvtsi2sd xmm6, ecx
    mov ecx, eax
    shr ecx, 16
    cvtsi2sd xmm7, ecx
    mulsd xmm7, qword ptr [_Lt_000E]
    addsd xmm6, xmm7
    sub esp, 8
    fstp qword ptr [esp]
    movlpd xmm0, qword ptr [esp]
    add esp, 8
    divsd xmm0, xmm6
    addsd xmm0, qword ptr [ebp-20]
    movlpd [ebp-20], xmm0
    .Lt_0008:
    inc dword ptr [ebp-12]
    .Lt_0007:
    mov eax, dword ptr [ebp-24]
    cmp dword ptr [ebp-12], eax
    jbe .Lt_000A
    .Lt_0009:
    movlpd xmm0, [_Lt_000D]
    mulsd xmm0, qword ptr [ebp-20]
    movlpd [ebp-8], xmm0
    .Lt_0005:
    fld qword ptr [ebp-8]
    mov esp, ebp
    pop ebp
    ret 4
    .balign 16
    Alles anzeigen


    FB Code:

    Code
    Function Leibniz_PI(n As UInteger) As Double
    	Dim As Double fPI = 0.0
    	For k As UInteger = 0 To n - 1
    		fPI += (-1)^k / (2 * k + 1)
    	Next
    	Return 4 * fPI
    End Function
    
    
    Dim As UInteger iterations = 10000000
    Dim As Double fTimer = Timer
    Print Leibniz_PI(iterations), 1000 * (Timer - fTimer) & " ms for " & iterations & " iterations."
    
    
    Sleep
    Alles anzeigen
  • WINAPI GetLogicalProcessorInformation

    • UEZ
    • 12. November 2016 um 21:39

    https://www.autoitscript.com/forum/topic/90…i_getsysteminfo

  • Neulich in der Kneipe..."Compiler sind die besseren Programmierer"?!

    • UEZ
    • 30. Oktober 2016 um 21:05
    Zitat von Bitnugger

    Falls der "AMIGA" hier für jemand ein Begriff ist

    Da sage ich doch nur: "AAAAAAAAAAAAMMMMMMMMMMMMMIIIIIIIIIIIIIIIIIGGGGGGGGGGGGGAAAAAAAAAAAAAA" :rock:

  • CSV-Datei (Trennzeichen Semikolon) enthält in den Feldern auch Semikolons

    • UEZ
    • 28. Oktober 2016 um 13:59

    Sorry @AspirinJunkie - ich hatte deine Version nicht getestet und mir auch nicht näher angeschaut.

  • CSV-Datei (Trennzeichen Semikolon) enthält in den Feldern auch Semikolons

    • UEZ
    • 28. Oktober 2016 um 13:46

    Das hier sollte helfen: https://www.autoitscript.com/forum/topic/153659-stringsplit-using-comma-but-with-additional-options/?do=findComment&comment=1107168

    Musst nur das Komma durch Semikolon ersetzen.

  • _GDIPlus_ImageLoadFromFile sperrt Bilddatei nach einladen, wie freigeben ?

    • UEZ
    • 28. Oktober 2016 um 13:05

    Nach einem _GDIPlus_ImageDispose($hImage) kannst du natürlich nicht mehr das Bild benutzen. Warum willst du das Bild freigeben, bevor das Skript beendet wird?

    Als Workaround könntest du das geladen Bild klonen und anschließend freigeben -> siehe dir dazu die Funktion _GDIPlus_BitmapCloneArea an.

  • _GDIPlus_ImageLoadFromFile sperrt Bilddatei nach einladen, wie freigeben ?

    • UEZ
    • 27. Oktober 2016 um 14:12
    AutoIt
    _GDIPlus_ImageDispose($hImage)

    gibt die Datei wieder frei.

  • Neulich in der Kneipe..."Compiler sind die besseren Programmierer"?!

    • UEZ
    • 24. Oktober 2016 um 22:10

    Meine Meinung ist, dass ein Compiler nur so gut ist, wie sein Programmierer und somit schließt sich der Kreis wieder.

    Wenn ich ein Programm schreibe und die Exe "schnell" genug arbeitet, dann hat der Compiler seine Arbeit ordentlich erledigt. Für die meisten Fälle trifft das auch zu.
    Begibt man sich z.B. in die "brotlose Kunst" (grafische Datenverarbeitung), so ist noch potential vorhanden den Code mit eigenen Assembler Routinen zu optimieren. Das habe ich gemerkt, wie ich in FreeBasic einiges gebastelt und einige Funktionen direkt in Inline ASM hinzugefügt habe -> mit relativ wenig Aufwand einiges an Performance herausgeholt.

    Ich weiß nicht, ob man den optimalen Compiler bauen kann, der je nach Anwendung den effizientesten Code produziert, aber wird auch nur für spezielle Anwendungen eher nötig sein. Ich kenne mich kaum in Compilerbau aus...

    Abgesehen davon gilt noch das Mooresche Gesetz und warum soll man da noch den Code optimieren denkt sich der eine oder andere Coder!?!

    Wenn ich z.B. mit einer Interpreter Sprache wie AutoIt Applikationen schreiben, die relativ "schnell" arbeiten, dann benötige ich nicht zwingend einen hoch optimierten Code, der einige Millisekunden schneller arbeitet.

  • "Lesbarkeit auf dem Bildschirm erleichtern" zerstört meine GUI

    • UEZ
    • 20. Oktober 2016 um 19:20

    Du solltest die Größen der GUI Elemente / Schriftgrößen entsprechend anpassen. -> https://www.autoitscript.com/forum/topic/16…app-workaround/

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 12. Oktober 2016 um 10:39

    Und noch'ne Spielerei -> GDI Particle Repulsion Grid (einfach die Maus über das Bild bewegen...)

    Mit AutoIt nicht in dieser Geschwindigkeit realisierbar.

    Edit: jetzt noch mit Scroller und Tracker Sound
    GDI Particle Repulsion Grid v1 + sound build 2016-10-13.png

    Dateien

    GDI Particle Repulsion Grid.zip 139,91 kB – 335 Downloads GDI Particle Repulsion Grid v1 + sound build 2016-10-13.7z 297,61 kB – 349 Downloads
  • Icons als Datei in exe einbinden und mit Code wieder abrufen

    • UEZ
    • 11. Oktober 2016 um 16:31

    Hast du es mal mit _Resource_GetAsIcon() probiert?

    Da du kein Beispiel hochgeladen hast, kann ich selbst nicht testen.

  • Icons als Datei in exe einbinden und mit Code wieder abrufen

    • UEZ
    • 11. Oktober 2016 um 10:14

    Schaue mal hier rein -> https://www.autoitscript.com/forum/topic/162499-resourcesex-udf

  • Herzlichen Glückwunsch water

    • UEZ
    • 8. Oktober 2016 um 23:04

    Auch von mir ein "Happy Birthday" und alles Gute für die Zukunft.

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 8. Oktober 2016 um 22:52
    Zitat von Andy

    OpenGL in FB hat "nur" 7 FPS, allerdings bei 130000 Rechtecken/Sekunde und ca. 1 Million Recursions-Calls


    Meine Werte:
    PT.png


    Bei der gleichen Rekursionstiefe wie bei GDI, komme ich auf ca. 70 FPS, ca. 300.000 Rekursionsaufrufe pro Sekunde und 4095 Rechtecken pro Funktionsaufruf.

    ^^

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 8. Oktober 2016 um 16:27

    Und noch ein Beispiel in GDI / GDI+ / OpenGL in Au3 und FB: Animated Pythagoras Tree

    Dateien

    Animated Pythagoras Tree.zip 1,74 MB – 362 Downloads
  • Größte/Kleinste Elemente aus einem Array wählen

    • UEZ
    • 25. September 2016 um 19:08

    Das habe ich bei mir noch gefunden:

    AutoIt
    #include <Array.au3>
    
    
    $numbers = "40,3,-2.5,-10,1000,-20202.188, +50,-1.937462,3.14"
    ConsoleWrite("Fünftkleinste Zahl: " & nNumber($numbers, 5, 0) & @CRLF) ; fünftkleinste Zahl
    ConsoleWrite("Drittgrößte Zahl: " & nNumber($numbers, 3, 1) & @CRLF) ; drittgrößte Zahl
    
    
    ; #FUNCTION# =====================================================================================================================
    ; Name...........: 		nthNumber
    ; Description ...:	 	Returns the nth biggest or smallest number
    ; Syntax.........: 		nNumber($numbers, $n, $dir = 0)
    ; Parameters ....: 		$numbers - the numbers either from a string or from an array
    ;                  				$n - search for n biggest or smallest number where n is an integer
    ;                 				$dir - 0 search for smallest number, 1 for biggest number
    ; Return values .: 	Success - Returns the appropriate number and set @error to 0
    ;                  				Failure - Returns error code:
    ;                  				1 - Wrong delimiter in string! Valid is comma (,) only!
    ;                  				2 - No numbers found!
    ;                 				3 - n is not an integer
    ;                  				4 - n is not in boundary of amount of numbers
    ; Remarks .......: 		Needs the function CompSort() for sorting the internal array
    ; Author ........: 		UEZ
    ; Version .......: 		0.90 Build 2010-11-11 Beta
    ; ================================================================================================================================
    Func nNumber($numbers, $n, $dir = 0)
    	If IsArray($numbers) Then
    		$num = _ArrayToString($numbers, ",")
    		If @error Then Return SetError(1, 0, "Error! Wrong delimiter in string! Valide is comma (,) only!")
    		$numbers = $num
    	EndIf
    	Local $aNum = StringRegExp($numbers, "(-\d+\.\d+|\d+\.\d+|\d+)", 3)
    	If Not IsArray($aNum) Then Return SetError(2, 0, "Error! No numbers found!")
    	If Not IsInt($n) Then Return SetError(3, 0, "Error! n is not an integer")
    	If $n < 1 Or $n > UBound($aNum) - 1 Then Return SetError(4, 0, "Error! n is not in boundary of amount of numbers")
    	CompSort($aNum)
    	If Not $dir Then Return $aNum[$n - 1] ;n smallest number
    	Return $aNum[UBound($aNum) - $n] ;n biggest number
    EndFunc
    
    
    ;Die Komplexität liegt je nach Ausgangssituation zwischen O(n^2) (Worst-Case) und O(n*log(n)) (Best-Case).
    ;Im Best-Case ist die Liste der zu sortierenden Elemente geordnet, sobald die Schrittlänge 1 beträgt.
    ;Im Worst-Case müssen alle benachbarten Elemente nochmals getauscht werden (mehrere Durchgänge mit Schrittlänge 1).
    ;In diesem Fall ist Combsort nicht schneller als Bubblesort.
    ;Speicherverbrauch: O(c)
    ;Shrink-Faktor: 1/(1-1/e^phi) = 1.247330950103979, phi = 1.61803398874994
    Func CompSort(ByRef $aArray)
    	Local $gap = UBound($aArray)
    	Local $swaps, $i, $tmp
    	Do
    		$gap = Int($gap / 1.247330950103979)
    		If $gap < 1 Then $gap = 1
    		$i = 0
    		$swaps = 0
    		Do
    			If Number($aArray[$i]) > Number($aArray[$i + $gap]) Then
    				$tmp= Number($aArray[$i])
    				$aArray[$i] = Number($aArray[$i + $gap])
    				$aArray[$i + $gap] = $tmp
    				$swaps = 1
    			EndIf
    			$i += 1
    		Until $i + $gap > UBound($aArray) - 1
    	Until $gap = 1 And $swaps = 0
    EndFunc
    Alles anzeigen
  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 22. September 2016 um 10:53
    Zitat von Andy

    Ich bin ziemlich sicher, dass mindestens noch ein Faktor 5-10 in der Geschwindigkeit der Berechnung machbar wäre, würde man die FPU-Sequenz in Assembler handcoden....von SSE mit 4 gleichzeitig berechenbaren Arrayinhalten garnicht zu reden. Die Compilereinstellung zur Verwendung von SSE bringt übrigens keinen Vorteil, die "schnelleren" Befehle werden gänzlich von unproduktiven Zugriffen auf den Speicher ausgebremst

    Ich habe auch mal die schnelleren Sin/Cos Funktionen von Eukalyptus benutzt, aber das sehe ich kein Geschwindigkeitsgewinn. D.h. ich kann das nur bestätigen, was du geschrieben hast.

    Zitat von kaesereibe

    Habt ihr das mal mit Direct2D probiert?

    Ich kann dir nicht sagen, warum ich und einige andere immer auf GDI/GDI+ herumreiten, obwohl es bessere Gfx Libs gibt, wie z.B. die Direct2D UDF.
    Vielleicht "Macht der Gewohnheit" oder weil's leichter fällt oder einfach nur Sturheit...

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™