Deutsch
Assembler Forum

Tempovergleich: Profan / Profan2Cpp / Assembler

 

Frank
Abbing
Hi,

Hab ein paar Tests gemacht mit Schleifen.
Eine leere Schleife, die 100 Millionen mal aufgerufen wird, dauert über 120 Sekunden (P4/1800) mit Profan.
Das ganze in Assembler dauert 78 Millisekunden, also ca. 1600 mal schneller.
Interessant noch die Messung, wenn der Code mit Sebastians Profan2Cpp ausgeführt wird. C++ benötigt 250 Millisekunden für die Schleife, ist also nur  500 mal schneller als Profan.
Assembler ist hier also über 3 mal schneller als C++, was einiges über native Compilate in einer Hochsprache aussagt...

Achtung !
Bitte unbedingt speichern unter Schleifen.prf, weil sonst die generierte Dll-Funktion nicht gefunden wird.
Nach Generierung der fertigen Exe ist der Name des Programms natürlich egal und kann beliebig umgenannt werden.
KompilierenMarkierenSeparieren
 
11.07.2004  
 



Nene Frank, da muß ich dich leider ein wenig korrigieren.

Das Prf2CPP nutzt OBJs von XProfan, eine pure-CPP schleife, mit richtig-gesetzem Compilerschalter ist im Geschwindigkeitsvergleich nur leicht langsamer als pure-ASM. Das Problem ist höchstens, wenn der CPP-Compiler nicht richtig erkennt, das es sich um eine simple Addition handelt, und in seinen ASM noch großartige Range-Checks einbaut etc.

Also ein Vergleich von ASM und CPP, unter Benutzung von Prf2CPP ist aus meiner sicht leicht unzulässig.

Bis denne, iF
 
11.07.2004  
 




Frank
Abbing
Hi,

nur ist die Schleife ja komplett leer...
Wie Profan2Cpp genau arbeitet weiss ich nicht.
KompilierenMarkierenSeparieren
Der Code wurde generiert und ich denke, den hat der Dev-C++ auch nativ übersetzt.
Vielleicht sagt Sebastian noch was dazu, wenn er hier mal vorbeikommt
 
12.07.2004  
 



Hmmm irgendwas stimmt nicht Frank, kannst Du dir mal den aktuellen XPSE runterziehen und schauen ob es an mir liegt?

ich habe c:p00x, und xpia liegt in c:p00xxpia

Alles arbeitet wohl anscheinend korrekt, auch xpia beendet sich erfolgeich, und das prog wird auch gestartet, aber kommt dann mit einer meldung das die DLL nicht gefunden wurde. Ich selbst kann die dll auch nicht ausfindig machen.

Ich habe den o.g. Source versucht zu starten.

Das Ergebnis ist:
KompilierenMarkierenSeparieren
Erstellt mit XProfan Inline Assembler / XPIA, (C) Frank Abbing
Assemblierte Datei: C:p00xXPIAAssemblertest.enh
Declare xpia#,xpia$,xpia&
Dim xpia#,3076
Clear xpia#
Long xpia#,0=9460301,3,4,65535,184,0,64,0,0,0,0,0,0,0,0,176,247078670,-855002112,1275181089,1750344141,1881174889,1919381362,1663069537,1869508193,1700929652,1853190688,544106784,542330692,1701080941,168627502,36,0,-642185571
Long xpia#,132=-1965594663,-1965594663,-1965594663,-1966782683,-1965594664,-1966835625,-1965594660,1751345490,-1965594663,0,0,17744,262476,1088455093,0,0,554565856,201654539,512,1536,0,4096,4096,8192,268435456,4096,512,4,0,4
Long xpia#,252=0,20480,1024,0,2,1048576,4096,1048576,4096,0,16,8224,88,8192,20,0,0,0,0,0,0,16384,40,0,0,0,0,0,0,0,0,0,0,0,0,8192,0,0,0,0,0,0,0,2019914798,116,167,4096,512,1024,0,0,0,-536870880,1633972782,24948,120,8192,512,1536
Long xpia#,488=0,0,0,1073741888,1952539694,97,60,12288,512,2048,0,0,0,-1073741760,1818587694,25455,62,16384,512,2560,0,0,0,1107296320,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Long xpia#,768=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1192457387,1,836297,-1559738997,268447744,-1559476853,268447748,-1559214709,268447752
Long xpia#,1060=-1558952565,268447756,-1558690421,268447760,-1558428277,268447764,-1558166133,268447768,-1557903989,268447772,-1557641845,268447776,-1557379701,268447780,-1557117557,268447784,-1556855413,268447788,-1556593269
Long xpia#,1136=268447792,-1556331125,268447796,-1556068981,268447800,-326412861,-32792,47359,1569390592,1111537928,65732623,189383427,1576629705,1218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Long xpia#,1340=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1919251317,1680749107,27756,0,1088455093,0,8274,1,1,1,8264,8268,8272,4229,8297,1096744960,1835365235
Long xpia#,1624=1919249506,1953719668,1752065375,1819042862,1314211328,1330205771,1095652174,3229005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Long xpia#,1904=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Long xpia#,2324=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4096,40,806891536,807940128,808988720,810037312,811085904,812134496,813183088,12416,0,0,0,0
Long xpia#,2616=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Long xpia#,3036=0,0,0,0,0,0,0,0,0
xpia$=$SysPath+\_Assemblertest_enh.dll
FileMode 1
Assign #1,xpia$
OpenRW #1
BlockWrite #1,xpia#,0,3072
CloseRW #1
Dispose xpia#
~~~~~~~~~~
DECLARE X&,Y&,Z&
CLS
X&=37
Z&=External(_Assemblertest_enh.dll,FUNKTIONSNAME1,X&)
PRINT Addiere eine Millionen mal 37 = +STR$(Z&)
WAITINPUT
END

Das Programm kommt aber mit der Meldung DLL nicht gefunden: _schleifen_enh

Bis denne, iF
 
12.07.2004  
 




Frank
Abbing
Hi iF,

du arbeitest wohl mit einer älteren XPIA Version, weil die Dll noch im Systempfad generiert wird. Ab letzter Version habe ich aber den Temppfad gewählt, weil es sonst zu Problemen bei Nicht-Admin-Usern kam. Update doch mal.

Und hast du das auch beachtet ?


Achtung !
Bitte unbedingt speichern unter Schleifen.prf, weil sonst die generierte Dll-Funktion nicht gefunden wird.
Nach Generierung der fertigen Exe ist der Name des Programms natürlich egal und kann beliebig umgenannt werden.


Hast dus hinbekommen ?

P.S.: Läuft auch mit der neuen XPSE Version von heute wunderbar.
 
12.07.2004  
 




Sebastian
König
Hallo iF,

iF (!ReGeXiT)
Nene Frank, da muß ich dich leider ein wenig korrigieren.


Und ich jetzt Dich ...

iF (!ReGeXiT)

Das Prf2CPP nutzt OBJs von XProfan, eine pure-CPP schleife, mit richtig-gesetzem Compilerschalter ist im Geschwindigkeitsvergleich nur leicht langsamer als pure-ASM. Das Problem ist höchstens, wenn der CPP-Compiler nicht richtig erkennt, das es sich um eine simple Addition handelt, und in seinen ASM noch großartige Range-Checks einbaut etc.


Profan2Cpp benutzt keine OBJs von XProfan! Die (X)Profan-Codes werden richtig nach C++ übersetzt und dann, genau wie Frank geschrieben hat, nativ kompiliert. Die Funktionen, die nicht direkt in der Windows-API vorhanden sind, werden aus den Profan2Cpp-Bibliotheken zur erstellten EXE-Datei gelinkt.

iF (!ReGeXiT)

Also ein Vergleich von ASM und CPP, unter Benutzung von Prf2CPP ist aus meiner sicht leicht unzulässig.


Jain . In einem Punkt hast Du recht: Wenn man die von Frank gepostete Schleife direkt in C++ implementieren würde, fiele der Unterschied zu Assembler sicher deutlich geringer aus.

Das hat verschiedene Gründe: Wenn Du Dir den von Frank geposteten C++-Code-Schnipsel ansiehst, stellst Du fest, dass die for-Konstruktion etwas kompliziert ist und theoretisch einfacher gestaltet werden könnte. Profan2Cpp muss aber die komplizierte Variante benutzen um zu allen whileloop-Varianten kompatibel zu sein und damit alles genau wie in Profan selbst funktioniert.

Außerdem verwendet Profan2Cpp für die übersetzen Programme ein Multithread-Konzept, sodass auch dadurch noch etwas mehr Zeit für die Schleife benötigt wird.

Ich denke aber, dass es Frank bei seinem Vergleich um den Bezug zu Profan geht (Frank, bitte korrigiere mich, falls ich mich irre ). Und dabei finde ich es ok, die Geschwindigkeitssteigerungen, die man mit Inline-ASM und Profan2Cpp erreichen kann, zu vergleichen. Man kann doch mit dem XPSE auch beides kombinieren, oder?

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
12.07.2004  
 



Hmmm Sebastian, eigendlich genau meine Rede.
Ein optimierterer Cpp-Code ist kaum merklich langsamer als eine ASM-Routine, besonders bei diesem Beispiel. Das wollte ich auch nur aussagen.

Sebastian König
Hallo iF,

... Man kann doch mit dem XPSE auch beides kombinieren, oder?

MfG

Sebastian


Jepp, ich bin grad am cpp-compilerschalter.


Frank, der Fehler lag bei mir, ich nannte die Datei nicht Schleifen.prf. Jetzt funktioniert alles Primö!

Bis denne, iF
 
12.07.2004  
 




Frank
Abbing
Hi.

@Sebastian: Du irrst dich nicht, ich meinte es so.
Ein Hochsprachencompiler erzeugt halt Code, der variabel gestaltet ist, um alle Eventualitäten einzukalkulieren.
Die Assemblerroutine degegen ist sehr undividuel.

@iF: Dachte ich es doch .
Wer lesen kann ist klar im Vorteil
 
12.07.2004  
 



Sebastian König
Die (X)Profan-Codes werden richtig nach C++ übersetzt und dann, genau wie Frank geschrieben hat, nativ kompiliert.

Habe nie was Anderes behauptet.

Frank Abbing
Wer lesen kann ist klar im Vorteil

Ich kann es ebend nicht. Also etwas bessere Zuarbeit büdde.
Am Ende bleibt doch aber übrig, was ich zum Anfang schon meinte: Ein optimierter CPP-Code ist in der Geschwindigkeit kaum zu unterscheiden vom ASM. Das mit den OBJs hatte ich doch nur aufgeführt, um zu symbolisieren das dort halt deutlich mehr als nur ein dec ecx durchgeführt wird, was den Speedunterschied stark ausmacht. Ich meinte auch das der Vergleich zwischen prf2cpp-Code und asm-code etwas unfair ist, weil halt das prf2cpp, genau wie du ja auch selbst sagst, nicht den optimiertesten code auswirft. Ist ja auch logisch, muß ja auf die verschiedensten Profanen Bedingungen passen.

Bis denne, iF
 
12.07.2004  
 




Frank
Abbing
Hi.


Ich meinte auch das der Vergleich zwischen prf2cpp-Code und asm-code etwas unfair ist, weil halt das prf2cpp, genau wie
du ja auch selbst sagst, nicht den optimiertesten code auswirft. Ist ja auch logisch, muß ja auf die verschiedensten Profanen
Bedingungen passen.


...dafür muß Profan die Assemblerfunktionen aber auch als Dll-Funktionen starten. Womöglich sogar noch mit External, was alleine schon 16 ms für seine Ausführung benötigt .
Also gleicht sich das aus.
 
12.07.2004  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.041 Betrachtungen

Unbenanntvor 0 min.
Sven Bader22.10.2021
Rschnett15.08.2017
p.specht03.05.2017
dieter02.07.2016
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie