ich habe versucht, "strlen" nachzubauen.
Habe in groben den Code von http://www.int80h.org/strlen/ genommen, das ist im Prinzip dieser:
Assembler Code:
subecx, ecx subal, al notecx cld repnescasb notecx dececx
Assembler Code:
subecx, ecx subal, al notecx cld repnescasb notecx dececx
Assembler Code:
subecx, ecx subal, al notecx cld repnescasb notecx dececx
Dann habe ich meine Funktion, sowie die "Standard"-strlen-Funktion 100000000 mal aufgerufen um die Geschwindigkeit zu vergleichen.
Dabei ist meine Funktion sehr viel langsamer, warum ist das so?
Wie ist strlen implementiert, dass es so viel schneller ist?
Benutze Windows 7 64bit (ist aber eine 32bit Anwendung), Visual Studio.
Außerdem sieht man auch nicht wirklich, wie deine Wiederholungsschleifen aufgebaut sind, welche Registerabhängigkeiten da sind, welche Parallelisierungsfallen usw., das dürfte auch eine Rolle spielen, und natürlich, dass man auf Alignment achten muß usw. Ein typisches Beispiel dafür, das gewisse Kenntnisse nicht ausreichen, um performant in Assembler zu programmieren. Außerdem kann man sich noch die Frage stellen, ob man wirklich Bytweise durchsteppen muß. Speicherzugriffe sind eben langsam...
Probier auch mal aus, was passiert, wenn du die scas Funktion nachbaust, um gleich mehrere Bytes auf einmal aus dem Speicher zu lesen (nach RAX) um dann mit logischen Operationen in RAX weiterzumachen und Flags testen usw.
Ein typisches Beispiel dafür, das gewisse Kenntnisse nicht ausreichen, um performant in Assembler zu programmieren
Wenn es nicht so wäre, würde ich die Frage nicht stellen
Ich weiß, dass meine Assembler-Kenntnisse noch am Anfang sind, deshalb interessiert es mich ja, wie man solche Probleme bestmöglichst löst.
Danke euch auf jedenfall schon einmal für die Links, werde mir das mal anschauen!
So, wunderbar, ist jetzt ca. gleich schnell wie die originale Funktion.
Aber jetzt das nächste Problem, wollte dafür keinen neuen Thread aufmachen:
So sieht mein Code für x86 / Ansi aus:
bin mir leider gerade nicht sicher, ob test auch ein register als rechten Operanden annimmt...
aber wenn, dann würde das in dem Stil sicher auch mit RAX und RBX klappen...
dann meckert zumindest ml64 nicht wegen zu großer Literale ;-)
@DrakoXP:
Ja, test REGISTER, REGISTER ist möglich.
Das wäre natürlich eine Lösung, wenn auch keine "saubere"
@masm:
Hm...das ist natürlich lästig...woran liegt die 32bit Grenze?
jWasm werde ich mir bei gelegenheit mal anschauen, bin bis jetzt aber mit masm ganz zufrieden, wahrscheinlich da es so schön in Visual Studio integriert ist
SSE2... hab ich dran gedacht, allerdings bin ich da noch ungefähr bei 0...außerdem dachte ich, dass SSE in diesem Fall nicht unbedingt viel bringen würde, da die berechnung doch meistens aufgrund der Stringlänge relativ kurz ist...
Aber ich werde es auf jedenfall mal ausprobieren, da ich SSE sowieso mal näher kommen wollte.
@DrakoXP:
Ja, test REGISTER, REGISTER ist möglich.
Das wäre natürlich eine Lösung, wenn auch keine "saubere"
Es wäre die Beste Lösung, wenn da nicht noch das SHL wäre.
strlen schrieb:
Hm...das ist natürlich lästig...woran liegt die 32bit Grenze?
Um die Befehlsgröße klein zu halten. Außerdem braucht man 64Bit Werte nur sehr selten – da tut es dann auch ein Speicher-Operand.
Ansonsten mal bei AMD anrufen und nachfragen ;-)
strlen schrieb:
außerdem dachte ich, dass SSE in diesem Fall nicht unbedingt viel bringen würde, da die berechnung doch meistens aufgrund der Stringlänge relativ kurz ist
Da ist was dran – eine einfache, abgerollte Schleife die BYTE für BYTE arbeitet, ist für kurze Strings absolut ausreichend. Mal davon abgesehen, muss man sich bei BYTE-Scannern keine Gedanken um das algiment und mögliche Seitenfehler machen (!).
Das wäre natürlich eine Lösung, wenn auch keine "saubere"
Mein Fehler, das bezog sich auf das SHL...
Okay, werde mir SSE aber trotzdem mal ansehen, nur zum testen.
Was hat es eigentlich mit dem "algiment" auf sich. Ich lese immer nur, dass darauf zu achten sei, aber nicht wieso und nach welchen Kriterien...?
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.