[ Ultimo aggiornamento: programma di riferimento e risultati preliminari disponibili, vedi sotto]
Quindi voglio testare il compromesso di velocità / complessità con un'applicazione classica: l'ordinamento.
Scrivi una funzione ANSI C che ordina una matrice di numeri in virgola mobile in ordine crescente .
Non è possibile utilizzare qualsiasi librerie, chiamate di sistema, il multithreading o ASM in linea.
Voci giudicate su due componenti: lunghezza del codice e prestazioni. Punteggio come segue: le voci verranno ordinate per lunghezza (registro di # caratteri senza spazi bianchi, quindi è possibile mantenere un po 'di formattazione) e per prestazioni (registro di # secondi su un benchmark), e ogni intervallo [migliore, peggiore] normalizzato linearmente su [ 0,1]. Il punteggio totale di un programma sarà la media dei due punteggi normalizzati. Il punteggio più basso vince. Una voce per utente.
L'ordinamento dovrà (eventualmente) essere in atto (ovvero l'array di input dovrà contenere valori ordinati al momento del ritorno), ed è necessario utilizzare la seguente firma, inclusi i nomi:
void sort(float* v, int n) {
}
Caratteri da contare: quelli nella sort
funzione, inclusa la firma, oltre a funzioni aggiuntive richiamate da esso (ma non incluso il codice di test).
Il programma deve gestire qualsiasi valore numerico di float
e matrici di lunghezza> = 0, fino a 2 ^ 20.
Inserirò le sort
sue dipendenze in un programma di test e compilerò su GCC (nessuna opzione di fantasia). Fornirò un mucchio di array, verificherò la correttezza dei risultati e il tempo di esecuzione totale. I test verranno eseguiti su un Intel Core i7 740QM (Clarksfield) con Ubuntu 13. Le
lunghezze di array copriranno l'intero intervallo consentito, con una maggiore densità di array corti. I valori saranno casuali, con una distribuzione adiposa (sia nell'intervallo positivo che negativo). Gli elementi duplicati saranno inclusi in alcuni test.
Il programma di test è disponibile qui: https://gist.github.com/anonymous/82386fa028f6534af263
Importa l'invio come user.c
. Il numero di casi di test ( TEST_COUNT
) nel benchmark effettivo sarà 3000. Fornire feedback nei commenti alle domande.
Scadenza: 3 settimane (7 aprile 2014, 16:00 GMT). Pubblicherò il benchmark tra 2 settimane.
Potrebbe essere consigliabile pubblicare post vicino alla scadenza per evitare di distribuire il codice ai concorrenti.
Risultati preliminari, a partire dalla pubblicazione di riferimento:
ecco alcuni risultati. L'ultima colonna mostra il punteggio in percentuale, maggiore è il migliore, mettendo Johnny Cage al primo posto. Gli algoritmi che erano ordini di grandezza più lenti degli altri venivano eseguiti su un sottoinsieme di test e il tempo estrapolato. Il C qsort
è incluso per il confronto (quello di Johnny è più veloce!). Eseguirò un confronto finale all'ora di chiusura.