strlen ist schneller



  • Hi
    Ich hab noch ned allzuviel erfahrung mit asm und wollt ne schnellere routine als strlen schreiben aber habs irgendwie ned geschafft! Außerdem check ich die strlen ned ganz. Ich hoffe inline asm passt hier auch rein...
    Dann wollt ich noch fragen obs da ein tool gibt dass mir wenn ich ne zeile asm schreib gleich den opcode anzeigt.

    Geh ich eigentlich recht in der annahme das je weniger bytes und instructions eine funktion hat umso schneller wird sie (ungefähr) oder haben die bytes nichts oder wenig damit zutun und nur die instructions zählen??? 😕

    Gibts auch bei den Registern operationen die auf den einen schneller und besser gehen als auf anderen??
    oder warum sagt man das man ecx für schleifen verwenden soll? Gibts da irgendwelche Geschwindigkeitsvorteile???

    Wär nett wenn mich da jemand aufklären könnte.

    (Zu sagen wär noch das ich unter WIN32 mit VC++ schreib und jetzt vorhab verstärkt inline asm an kritischen stellen zu verwenden. Ich find asm muss ma einfach können 👍 )

    MFG Manuelh87



  • Manuelh87 schrieb:

    Geh ich eigentlich recht in der annahme das je weniger bytes und instructions eine funktion hat umso schneller wird sie (ungefähr) oder haben die bytes nichts oder wenig damit zutun und nur die instructions zählen??? 😕

    Nicht direkt.
    Erstens brauchen manche Operationen länger als andere.
    Auch abhängig davon, ob z.B. die Daten an DWord grenzen ausgerichtet sind.

    Was du als Erstes brauchst, ist ein gutes Assemblerbuch.
    Z.B. das von Addison-Weslay. Da steht genau drin, welcher Befehl wieviele Takte braucht.
    Aber das gilt nur für die CPU, nicht für die Zeit zum hin und herschicken üben den Bus. Außerdem ist es entscheidend, den Cache gut auszunützen.

    Was aber noch viel, viel wichtiger ist: Du musst einen vernünftigen Algorithmus für deine für deine Probleme finden.
    Da holst du am meisten raus.
    Z.B. ist ein in QBasic geschriebener Shell-Sort einen in Assembler gehackten BubbleSort ab einer gewissen Anzahl trotzdem haushoch überlegen.

    EDIT: Auch sehr zu empfehlen, aber leider eher für ältere x86.
    http://webster.cs.ucr.edu/AoA/DOS/AoADosIndex.html


  • Mod

    es gibt verschiedene möglichkeiten, strlen zu optimieren (besser ist nat. gleich null-terminierte strings zu vermeiden, wo möglich 🙂 )
    interessant hierzu z.b. http://www.masmforum.com/simple/index.php?topic=170.0
    (assemblergrundlagen solltest du aber beherrschen, bevor du dir das antust)

    leider sind die schnellsten algorithmen etwas unsicher, da sie i.d.R einige bytes über das stringende hinweglesen (wirklich nur lesen, also kein undef. verhalten), und daher ein seg-fault auslösen können, wenn man pech hat. ansonsten bleibt nur loop-unrolling um die byte-weise methode zu beschleunigen.

    Geh ich eigentlich recht in der annahme das je weniger bytes und instructions eine funktion hat umso schneller wird sie (ungefähr) oder haben die bytes nichts oder wenig damit zutun und nur die instructions zählen??? 😕

    die instruktionslänge spielt in der regel nur eine untergeordnete reihe. lange instruktionen werden evtl. langsamer dekodiert, in schleifen spielt das aber keine rolle, solange die schleife klein genug ist.

    Gibts auch bei den Registern operationen die auf den einen schneller und besser gehen als auf anderen??
    oder warum sagt man das man ecx für schleifen verwenden soll? Gibts da irgendwelche Geschwindigkeitsvorteile???

    die wahl der register ist, wenn es um geschwindigkeit geht, so gut wie beliebig. man muss nat. beachten, dass bestimmte instruktionen nur mit bestimmten registern zusammenarbeiten. ecx wird zum beispiel implizit von der loop instruktion verwendet. diese ist allerdings auf den meisten prozessoren langsamer als ein nachbau mit dec ecx, jnz ... und dahei zu vermeiden. dann ist man nat. auch nicht mehr an ecx zum zählen gebunden.



  • Ich denke doch, dass ein aligned read gemacht wird. Damit kann man keinen pagefault auslösen - wenn ein Byte davon gelesen werden kann, dann können's alle.


  • Mod

    Ringding schrieb:

    Ich denke doch, dass ein aligned read gemacht wird. Damit kann man keinen pagefault auslösen - wenn ein Byte davon gelesen werden kann, dann können's alle.

    schon richtig. trotzdem keine saubere methode. andererseits toleriert man das bei assembly code ja häufig. 🙂



  • Hey Danke für das alles!!!! 👍 Ich dachte ich werd da vielleicht niedergemacht weil ich es wage in ein asm forum mit inline asm anzufangen... :)!

    Nein im ernst danke an alle. Ich werd mich mal umsehen wegen Buch und so (falls ichs find) Bin jetzt wild entschlossen endlich mal alle instructions zu lernen (gleich nach der Theoretischen Führerscheinprüfung) damit ich wenigstens mal den vollen umfang nutzten kann.

    Website ist echt gut aber halt sehr lang und ausführlich. Aber ich schätzt mal wenn ichs wirklich mal können will dann muss ich da wohl durch. Und es ist ja ned uninteressant!

    Darf ich da auch code posten wenn ich ein paar verbesserungsvorschläge haben will und n bissal feedback brauche oder daarf ich das irgendwem von euch schicken....

    Danke noch mal an alle
    cu Manuelh87


  • Mod

    Darf ich da auch code posten wenn ich ein paar verbesserungsvorschläge haben will und n bissal feedback brauche oder daarf ich das irgendwem von euch schicken....

    jede intelligente frage ist willkommen 🙂


Anmelden zum Antworten