[ Letztes Update: Benchmark-Programm und vorläufige Ergebnisse verfügbar, siehe unten]
Daher möchte ich den Kompromiss zwischen Geschwindigkeit und Komplexität mit einer klassischen Anwendung testen: dem Sortieren.
Schreiben Sie eine ANSI C-Funktion, die ein Array von Gleitkommazahlen in aufsteigender Reihenfolge sortiert.
Sie können keine Bibliotheken, Systemaufrufe, Multithreading oder Inline-ASM verwenden.
Einträge werden anhand von zwei Komponenten beurteilt: Codelänge und Leistung. Bewertung wie folgt: Einträge werden nach Länge (Protokoll von #Zeichen ohne Leerzeichen, damit Sie die Formatierung beibehalten können) und nach Leistung (Protokoll von #Sekunden über einem Benchmark) sortiert und jedes Intervall [am besten, am schlechtesten] linear auf [normalisiert] 0,1]. Die Gesamtpunktzahl eines Programms ist der Durchschnitt der beiden normalisierten Punktzahlen. Die niedrigste Punktzahl gewinnt. Ein Eintrag pro Benutzer.
Die Sortierung muss (eventuell) vorhanden sein (dh das Eingabearray muss bei der Rückgabe sortierte Werte enthalten), und Sie müssen die folgende Signatur einschließlich der Namen verwenden:
void sort(float* v, int n) {
}
Zu zählende Zeichen: diejenigen in der sort
Funktion, einschließlich Signatur, plus zusätzliche Funktionen, die von ihr aufgerufen werden (jedoch ohne Testcode).
Das Programm muss alle numerischen Werte float
und Arrays mit einer Länge von> = 0 bis zu 2 ^ 20 verarbeiten.
Ich werde sort
und seine Abhängigkeiten in ein Testprogramm einbinden und auf GCC kompilieren (keine ausgefallenen Optionen). Ich werde eine Reihe von Arrays einspeisen, die Richtigkeit der Ergebnisse und die Gesamtlaufzeit überprüfen. Die Tests werden auf einem Intel Core i7 740QM (Clarksfield) unter Ubuntu 13 ausgeführt. Die
Array-Längen erstrecken sich über den gesamten zulässigen Bereich mit einer höheren Dichte an kurzen Arrays. Die Werte sind zufällig mit einer Fettschwanzverteilung (sowohl im positiven als auch im negativen Bereich). Doppelte Elemente werden in einigen Tests enthalten sein.
Das Testprogramm ist hier verfügbar: https://gist.github.com/anonymous/82386fa028f6534af263
Es importiert die Einreichung als user.c
. Die Anzahl der Testfälle ( TEST_COUNT
) im aktuellen Benchmark beträgt 3000. Bitte geben Sie in den Fragenkommentaren Feedback.
Frist: 3 Wochen (7. April 2014, 16:00 GMT). Ich werde den Benchmark in 2 Wochen veröffentlichen.
Es kann ratsam sein, kurz vor Ablauf der Frist zu posten, um zu vermeiden, dass Ihr Code an Mitbewerber weitergegeben wird.
Vorläufige Ergebnisse zum Zeitpunkt der Veröffentlichung der Benchmark:
Hier einige Ergebnisse. In der letzten Spalte wird die Punktzahl als Prozentsatz angezeigt. Je höher desto besser, wobei Johnny Cage an erster Stelle steht. Algorithmen, die um Größenordnungen langsamer waren als die anderen, wurden in einer Teilmenge von Tests ausgeführt und die Zeit extrapoliert. Cs eigene qsort
ist zum Vergleich enthalten (Johnny's ist schneller!). Ich werde zum Abschluss einen abschließenden Vergleich durchführen.