Geschwidigkeit



  • Es ist gut möglich, dass der Compiler aus Nr. 1 dann intern ein Nr. 2 macht. Also wirst du messen müssen, um auf herauszufinden, was schneller ist.



  • Hey!

    Funktion1(pST[i].Datas[j].Elements[0]); //Ein Aufruf 2mal per . zugreifen
    

    Das hat doch nichts mit der Laufzeit zu tun, oder? Es könnte da auch stehen:

    Funktion1(pST[i].Datas[j].Blablas.Extras.Irgendwas.Lalala.Elements[0]);
    

    Im Maschinencode findet man dann doch nur den endgültigen Wert eben von Elements[0], oder?

    MfG



  • im prinzip nicht, aber wenn ein sprung bei der speicherstelle dazukommt dauerts auch länger aber dieser zeitunterschied ist vernachlässigbar

    dennoch ändert es nichts an der sache dass nr1 schneller sein müsste
    da es nur 2 zuweisen beinhaltet

    Edit:
    Funktion1(pST[i].Datas[j].Blablas.Extras.Irgendwas.Lalala.Elements[0]);

    ich glaub die auswärtung würde länger dauern



  • Ja danke,
    aber ganz schlau bin ich immer noch nicht, gibt es einen Geschwidigkeitsunterschied bei Zuweisungen, wenn man über viele Objekte auf etwas zugreift?:

    BigClass Class;
    BigClass *pClass = new BigClass;
    int a;
    
    //1
    Class.Object.Data.Element = 0;
    //2
    *pClass->Object->Data->Element = 0;
    //3
    a = 0;
    

    Müsste doch alles gleich schnell sein, weil es im Maschinencode keine Klassen gibt.



  • wenn du das so genau wissen willst dann probier es doch einfach

    #include <ctime>
    ...
    clock_t a = clock();
    
    Class.Object.Data.Element = 0;
    
    clock_t b = clock();
    
    dauer = b-a;
    
    cout << dauer<<endl;
    


  • Das nenn ich mal n schlecht gewähltes Beispiel:

    //1
    Class.Object.Data.Element = 0;
    //2
    *pClass->Object->Data->Element = 0;
    

    Seit wann werden, wenn man ein Object auf dem Heap anlegt, aus den Membern auch Pointer?
    Und wenn pClass schon n Zeiger ist was soll dann das Dereferenzieren (*).

    Meiner Meinung nach ist die Arraynotation in manchen Fällen schneller, da der Compiler Zuriffe per Zeiger nicht so gut optimieren kann. Ein Zeiger kann quasi überall hin zeigen. Bei Zugriff über [] in einer Schleife kann der Compiler annehmen, dass es sich um im Speicher zusammenhängende Blöcke handelt und dementsprechend optimieren.

    Am besten man testet in jedem Fall was die schnellste Methode ist.

    Verge



  • Stelfer schrieb:

    Edit:
    Funktion1(pST[i].Datas[j].Blablas.Extras.Irgendwas.Lalala.Elements[0]);

    ich glaub die auswärtung würde länger dauern

    nein, würde sie nicht. aus ".Blablas.Extras.Irgendwas.Lalala.Elements" wird der compiler eine relative addresse berechnen können. am ende bleibt dann sowas stehen wie:

    *(&(pST[i].Datas[j])+Offset)

    und dann ist es egal, wielang diese Kette ist. sobald allerdings zeiger ins spiel kommen, wirds komplizierter.

    @stelfer du weist schon, dass du clock() vergessen kannst, sobald das betriebssystem nebenbei noch irgendnen andren thread laufen lässt? mal davon ab, dass der compiler das einfach rausoptimieren würde, so wie es jetzt da steht.



  • [quote="otze"]

    Stelfer schrieb:

    @stelfer du weist schon, dass du clock() vergessen kannst, sobald das betriebssystem nebenbei noch irgendnen andren thread laufen lässt? mal davon ab, dass der compiler das einfach rausoptimieren würde, so wie es jetzt da steht.

    Falsch. Clock misst die Zeit die der Prozess verbraucht hat. Wenn der Prozess z.B. 5 sekunden arbeitet und zwischendrin 20sekunden vom Betriebssystem suspended wurde, zeigt clock tatsächlich nur 5 Sekunden an.

    Anders ist das mit time() weil hier die absolute Zeit zwischen zwei Messungen angegeben wird.



  • ja gut dann schreib ich es noch rein bevor es andere machen -.- du musst den bereich zwischen deinen messungen öfters durchführenlassen damit du diese zeit auch messen kannst ...

    hoffe es beschwert sich nun niemand



  • [quote="otzes V"]

    otze schrieb:

    Stelfer schrieb:

    @stelfer du weist schon, dass du clock() vergessen kannst, sobald das betriebssystem nebenbei noch irgendnen andren thread laufen lässt? mal davon ab, dass der compiler das einfach rausoptimieren würde, so wie es jetzt da steht.

    Falsch. Clock misst die Zeit die der Prozess verbraucht hat. Wenn der Prozess z.B. 5 sekunden arbeitet und zwischendrin 20sekunden vom Betriebssystem suspended wurde, zeigt clock tatsächlich nur 5 Sekunden an.

    Anders ist das mit time() weil hier die absolute Zeit zwischen zwei Messungen angegeben wird.

    Ja, laut Doku/Standard ist das so. Laut Realität ist das zumindest auf Windows anders.


Anmelden zum Antworten