L
-O3:
gcc -O3 main.c -o main
main.c: Assembler messages:
main.c:83: Error: symbol `.loop_start' is already defined
main.c:114: Error: symbol `.loop_increment' is already defined
main.c:117: Error: symbol `.loop_check' is already defined
main.c:83: Error: symbol `.loop_start' is already defined
main.c:114: Error: symbol `.loop_increment' is already defined
main.c:117: Error: symbol `.loop_check' is already defined
Ich vermute, er versucht dann auch, meine Inline-Asm-Optimierung zu optimieren (obwohl er das ja nicht soll), also er versucht, den Funktionsaufruf aufzulösen? Möglicherweise habe ich auch falsche Labelbezeichner, die intern schon reserviert sind.
Lässt man -O... ganz weg, sollte es klappen.
@wob sagte in Funktion optimieren:
Was mir unbedingt fehlt: was sind die vielen Zahlen in deinem Code? Also -40, -8, -16 - wo kommen die her? Da wäre Kommentare sehr hilfreich.
(und ich finde intel-Style assembler auch deutlich leichter lesbar - bei den vielen %-Zeichen und Klammern schaltet mein Gehirn immer ab)
An sich nicht kompliziert:
%[n] ist n (andere Schreibweise für n(%rip))
-8(%%rbp) müsste i sein
-16(%%rbp) müsste j sein
-24(%%rbp) sollte a oder b sein
-32(%%rbp) sollte a oder b sein
-40(%%rbp) Pointer aufs Array
Habe den Code auch noch nicht wirklich optimiert, bin mir nicht sicher, aber er nicht schon minimal wäre.
Vielleicht gibt es deshalb auch keinen Unterschied zwischen sort_a und sort_a_optimized.
Vielleicht wäre es auch sinnvoll, statt sort_a, mit C's qsort zu vergleichen... Asymptotisch betrachtet kann man Quick-, Merge- oder Heapsort natürlich nicht schlagen, aber hier geht es um genau 100 Elemente... das sollte eine Schranke sein.
@Finnegan sagte in Funktion optimieren:
Die Idee von mir war auch nicht, das fill rauszunehmen, sondern das Zufalls-Array für jeden Test mit dem gleichen Anfangs-Seed zu generieren, damit jeder Test mit den gleichen Zufallszahlen im Array durchgeführt wird.
Es geht ja nicht darum (wie bereits richtig erwähnt), das "fill" zu optimieren, sondern nur das "sort". Und mir gefällt das bisher eigentlich schon ganz gut...
Bin mir nicht sicher, ob man bei immer gleichen Eingabe-Arrays nicht in die Gefahr läuft, dass der Prozessor Optimierungen des "Mikrocodes" noch vornimmt... Angeblich soll ja nämlich zwischen Maschinencode und dem, was der Prozessor "macht", noch mal eine Abstraktionsschicht seien... Aber das ist nur eine Vermutung.