Array: Pointer oder [idx] schneller?



  • Hallo,

    ich frage mich welches von beiden schneller ist , oder ob beides gleich ist:

    int * arr = NULL;
    for(int i = 0; i < len; i++, arr++)
       *arr = 9;
    
    int * arr = NULL;
    for(int i = 0; i < len; i++)
       arr[i] = 9;
    


  • beides führt gleich schnell zu einem absturz (NULL dereferenziert)

    der code sollte in etwa gleich schnell sein,
    fals du die NULL gegen ein echtes array austauschst



  • Es könnte sein, dass ein Inkrement pro Durchlauf schneller ist als eine Addition. Es könnte auch sein, dass das rausoptimiert wird. Es könnte bei konstantem len auch sein dass die Schleife wegoptimiert wird. Es könnte aber auch...

    Am besten: In der konkreten Situation benchmarken (rein designtechnisch würde ich einen Zeiger bevorzugen, da er sich wie ein Iterator verhält, und wir ja schließlich im C++-Board sind :D)



  • Verwende das was logisch besser passt.
    Wenn du den Umgang mit Iterator Ranges gewohnt bist verwende Zeiger, wenn du den Umgang mit Indizes gewohnt bist verwende einen Index.
    Wenn schon Zeiger würde ich es aber eher so machen:

    int * arr = ...;
    int* end = arr + len;
    for(int* p = arr; p != end; p++)
       *p = 9;
    

    Davon abgesehen: der Compiler wird wie schon erwähnt wurde sowieso *irgendwas* draus machen. Wenn man den schnellstmöglichen Code sucht muss man testen was schneller ist. Ansonsten sollte man sich keine Gedanken darüber machen.



  • testo schrieb:

    int * arr = NULL;
    for(int i = 0; i < len; i++)
       arr[i] = 9;
    

    vermutlich das, weil keine zusatzaddition vorhanden ist, (arr+i)=9; wird als ein befehl auf einem x86 compiliert, sowas wie mov DWORD[eax+EDX4],9



  • testo schrieb:

    Hallo,

    ich frage mich welches von beiden schneller ist , oder ob beides gleich ist:

    int * arr = NULL;
    for(int i = 0; i < len; i++, arr++)
       *arr = 9;
    
    int * arr = NULL;
    for(int i = 0; i < len; i++)
       arr[i] = 9;
    

    Das kommt darauf an, welchen Compiler, welches Betriebssystem, welchen Prozessor, welche Compileswitches und wie die Caches gerade gefüllt sind und ob die Sonne scheint. Und vor allen Dingen solltest Du Dir überlegen, ob das überhaupt relevant ist. Verwende das, was lesbarer ist.


Anmelden zum Antworten