[ Última atualização: programa de benchmark e resultados preliminares disponíveis, veja abaixo]
Então, eu quero testar a relação velocidade / complexidade com um aplicativo clássico: classificação.
Escreva uma função ANSI C que classifique uma matriz de números de ponto flutuante em ordem crescente .
Você não pode usar nenhuma biblioteca, chamada de sistema, multithreading ou ASM embutido.
Entradas julgadas em dois componentes: comprimento e desempenho do código . Com a seguinte pontuação: as entradas serão classificadas por tamanho (log de # caracteres sem espaço em branco, para que você possa manter alguma formatação) e desempenho (log de # segundos sobre uma referência) e cada intervalo [melhor, pior] normalizado linearmente para [ 0,1] A pontuação total de um programa será a média das duas pontuações normalizadas. Menor pontuação ganha. Uma entrada por usuário.
A classificação precisará (eventualmente) estar em vigor (ou seja, a matriz de entrada deverá conter valores classificados no tempo de retorno) e você deverá usar a seguinte assinatura, incluindo nomes:
void sort(float* v, int n) {
}
Caracteres a serem contados: aqueles na sort
função, assinatura incluída, além de funções adicionais chamadas por ela (mas não incluindo o código de teste).
O programa deve manipular qualquer valor numérico float
e matrizes de comprimento> = 0, até 2 ^ 20.
Vou conectar sort
e suas dependências em um programa de testes e compilar no GCC (sem opções sofisticadas). Vou alimentar várias matrizes, verificar a exatidão dos resultados e o tempo total de execução. Os testes serão executados em um Intel Core i7 740QM (Clarksfield) no Ubuntu 13. Os
comprimentos dos arrays abrangerão todo o intervalo permitido, com uma densidade mais alta de arrays curtos. Os valores serão aleatórios, com uma distribuição de cauda gorda (tanto na faixa positiva quanto na negativa). Elementos duplicados serão incluídos em alguns testes.
O programa de teste está disponível aqui: https://gist.github.com/anonymous/82386fa028f6534af263
Ele importa o envio como user.c
. O número de casos de teste ( TEST_COUNT
) no benchmark real será 3000. Por favor, forneça algum feedback nos comentários da pergunta.
Prazo: 3 semanas (7 de abril de 2014, 16:00 GMT). Vou postar o benchmark em 2 semanas.
Pode ser aconselhável postar perto do prazo, para evitar que seu código seja entregue aos concorrentes.
Resultados preliminares, a partir da publicação do benchmark:
Aqui estão alguns resultados. A última coluna mostra a pontuação como porcentagem, quanto maior, melhor, colocando Johnny Cage em primeiro lugar. Algoritmos com ordens de magnitude mais lentas que o restante foram executados em um subconjunto de testes e o tempo extrapolado. O próprio C qsort
está incluído para comparação (o Johnny é mais rápido!). Vou fazer uma comparação final na hora do fechamento.