array vs vector



  • was wären denn die richten Stellen
    bzw wo muss ich aufpassen bei geschwindigkeit?
    was sollte man tun und was nicht?
    könnt ihr mir da paar tipps geben



  • wenn dein Array >1.000.000 Elemente hat und du es sortieren willst. Idealerweise keine Zahlen, sondern benutzerdefinierte Objekte



  • Skym0sh0 schrieb:

    ein normales c array ist schneller

    wieso sollte das so sein?

    mit vectoren wird der aktuelle index direkt mitgespeichert, man kann sie erweitern und verkleienrn wie man will, elemente rauslöschen usw.
    und alles in allem ist es nur minimal langsamer

    aber die laenge muss ich mir bei einem c array genauso merken...



  • Shade Of Mine schrieb:

    Skym0sh0 schrieb:

    ein normales c array ist schneller

    wieso sollte das so sein?

    beim zugriff mit [] wars glaub ich eine Operation mehr im Assemblercode



  • mit vectoren wird der aktuelle index direkt mitgespeichert, man kann sie erweitern und verkleienrn wie man will, elemente rauslöschen usw.
    und alles in allem ist es nur minimal langsamer

    aber die laenge muss ich mir bei einem c array genauso merken...[/quote]

    nein ich meine die aktuelle grösse, nicht den index

    und das hat halt den vorteil dass man einen vector an eine funktio übergeben kann ohne noch dazu die grösse...



  • Ich denke man sollte erstmal gar nicht auf Geschwindigkeit optimieren, wenn man nicht in einem speziellen Bereich programmiert wo das nötig ist. Das kann man später meist immer noch, wenns irgendwo an einer Stelle tatsächlich einen Flaschenhals gibt.

    MfG



  • also damit er noch ne regel hat:
    Verwende immer Vector wo möglich ( statt array)



  • asmcode schrieb:

    Shade Of Mine schrieb:

    Skym0sh0 schrieb:

    ein normales c array ist schneller

    wieso sollte das so sein?

    beim zugriff mit [] wars glaub ich eine Operation mehr im Assemblercode

    Begruendung?



  • Shade Of Mine schrieb:

    asmcode schrieb:

    Shade Of Mine schrieb:

    Skym0sh0 schrieb:

    ein normales c array ist schneller

    wieso sollte das so sein?

    beim zugriff mit [] wars glaub ich eine Operation mehr im Assemblercode

    Begruendung?

    Das ist das " inline " 😃 🤡



  • asmcode schrieb:

    Shade Of Mine schrieb:

    Skym0sh0 schrieb:

    ein normales c array ist schneller

    wieso sollte das so sein?

    beim zugriff mit [] wars glaub ich eine Operation mehr im Assemblercode

    Zugriffe mit Zeigersyntax sind übrigens, für den Compilierer, wesentlich schwerer zu optimieren...



  • David_pb schrieb:

    Zugriffe mit Zeigersyntax sind übrigens, für den Compilierer, wesentlich schwerer zu optimieren...

    Begruendung?



  • Shade Of Mine schrieb:

    David_pb schrieb:

    Zugriffe mit Zeigersyntax sind übrigens, für den Compilierer, wesentlich schwerer zu optimieren...

    Begruendung?

    Weil der Compiler, ohne aufwendige Analyse, nicht genau weiß wohin durch den Zeiger geschrieben wird. Das schließt dann z.B. aliasing oder unbeschreibbaren Speicher ein. Damit ist es dann ziemlich schwer für den Optimierer, zu entscheiden an welcher Stelle optimiert werden soll.
    Beim []-Operator gibts diese Annahmen nicht, da ist klar wohin geschrieben wird und aliasing kann ausgeschlossen werden.

    Ist aber natürlich nicht zu verallgemeinern. Es kann Fälle geben bei denen die Zeigersyntax besser ist.



  • David_pb schrieb:

    Beim []-Operator gibts diese Annahmen nicht, da ist klar wohin geschrieben wird und aliasing kann ausgeschlossen werden.

    😮



  • David_pb schrieb:

    Shade Of Mine schrieb:

    David_pb schrieb:

    Zugriffe mit Zeigersyntax sind übrigens, für den Compilierer, wesentlich schwerer zu optimieren...

    Begruendung?

    Weil der Compiler, ohne aufwendige Analyse, nicht genau weiß wohin durch den Zeiger geschrieben wird. Das schließt dann z.B. aliasing oder unbeschreibbaren Speicher ein. Damit ist es dann ziemlich schwer für den Optimierer, zu entscheiden an welcher Stelle optimiert werden soll.
    Beim []-Operator gibts diese Annahmen nicht, da ist klar wohin geschrieben wird und aliasing kann ausgeschlossen werden.

    Ist aber natürlich nicht zu verallgemeinern. Es kann Fälle geben bei denen die Zeigersyntax besser ist.

    Hmm, wird hinter dem operator[] nicht auch nur ein Zeiger dereferenziert? Also beim Vektor meine ich.



  • Beim vector kann das sein. Weiß nicht in wie weit der Standard vorschreibt wie genau auf die internen Daten zugegriffen wird.



  • David_pb schrieb:

    Weil der Compiler, ohne aufwendige Analyse, nicht genau weiß wohin durch den Zeiger geschrieben wird. Das schließt dann z.B. aliasing oder unbeschreibbaren Speicher ein. Damit ist es dann ziemlich schwer für den Optimierer, zu entscheiden an welcher Stelle optimiert werden soll.
    Beim []-Operator gibts diese Annahmen nicht, da ist klar wohin geschrieben wird und aliasing kann ausgeschlossen werden.

    Ist aber natürlich nicht zu verallgemeinern. Es kann Fälle geben bei denen die Zeigersyntax besser ist.

    Und wer hat dir den quark erzählt?

    a[b] == *(a+b) == *(b+a) == b[a]

    fuer alle diese Ausdrücke wird jeder intelligente Compiler exakt den selben Code generieren.



  • Shade Of Mine schrieb:

    Und wer hat dir den quark erzählt?

    Steht in diversen Papers von AMD.

    Shade Of Mine schrieb:

    a[b] == *(a+b) == *(b+a) == b[a]

    fuer alle diese Ausdrücke wird jeder intelligente Compiler exakt den selben Code generieren.

    Jaja, Theorie und Praxis liegen z.T. schon weit auseinander... 🙄



  • Ich glaube du verwechselst da was.



  • Tim schrieb:

    Ich glaube du verwechselst da was.

    Ja? Dann klär mich mal auf.



  • David_pb schrieb:

    Tim schrieb:

    Ich glaube du verwechselst da was.

    Ja? Dann klär mich mal auf.

    zeig uns was in den AMD Papieren steht und wir erklären dir was du falsch verstanden hast.

    Was ich gepostet habe ist Prozessor unabhaengig.

    ein compiler kann manchmal mit laufenden zeigern besser optimieren als mit index zugriffen oder umgekehrt, aber das liegt daran wie gut er den code versteht. und manchmal versteht er den code mit der einen syntax besser.

    aber wenn ich auf p[5] zugreifen will, dann mach ich in asm ein

    mov ecx, p
    add ecx, 5
    mov eax, [ecx]

    die cpu sieht nie ob ich *(p+5) oder p[5] geschrieben habe. selbes bei laufenden zeigern versus index...


Anmelden zum Antworten