Pergunta

Agora eu estou carregando um arquivo em seguida, usando gettimeofday e rastrear o tempo de CPU com tv_usec

Meus resultados varia, eu recebo 250 da 280S, mas às vezes a 300 ou 500 da de. Eu escrevi usleep e dormir (0) e (1), sem sucesso. O tempo ainda varia muito. Pensei sono (1) (segundos em Linux, e não o sono janelas em ms) teria resolvido isso. Como posso acompanhar o tempo de uma forma mais consistente para testar? Talvez eu deveria esperar até que eu tenho um conjunto de dados de teste muito maiores e código mais complexo antes de iniciar medições?

Foi útil?

Solução

A interface actualmente recomendado para o tempo de alta rez no Linux (e POSIX em geral) é clock_gettime. Veja a página man.


clock_gettime(CLOCK_REALTIME, struct timespec *tp) //  for wall-clock time
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec *tp) //  for CPU time

Mas leia a página do manual. Note que você precisa vínculo com -lrt, porque POSIX diz isso, eu acho. Talvez para evitar conflitos símbolo em lc, para programas antigos que definiram a sua própria clock_gettime? Mas bibliotecas dinâmicas usar símbolos fracos ...

A melhor função do sono é nanosleep. Ele não brinca com sinais ou qualquer porcaria como usleep. É definido para apenas sono, e não ter quaisquer outros efeitos secundários. E ele diz que se você acordou cedo (por exemplo, a partir de sinais), para que você não necessariamente tem que chamar outra função do tempo.

De qualquer forma, você vai ter um tempo difícil testar uma repetição de algo que curto que envolve uma chamada de sistema. Há uma enorme quantidade de oportunidade para variação. por exemplo. o programador pode decidir que algumas outras necessidades de trabalho a fazer (improvável se o processo apenas começou, você não vai ter usado a sua fatia de tempo ainda). cache da CPU (L2 e TLB) são facilmente possível.

Se você tem uma máquina multi-core e uma referência single-threaded para o código que você está otimizando, você pode dar-lhe realtime prioridade preso a um de seus núcleos. Certifique-se de escolher o núcleo que não está a lidar com interrupções, ou o teclado (e tudo mais) será bloqueado até que seja feito. Use taskset (para fixar a um CPU) e chrt (para a criação em tempo real prio). Veja este e-mail que enviei ao gmp-devel com este truque: http://gmplib.org/list-archives/gmp- devel / 2008-março / 000789.html

Oh yeah, para o calendário mais preciso, você pode usar rdtsc-se (em x86 / amd64). Se você não tem quaisquer outros syscalls em que você está bancadas, não é uma má idéia. Pegue um quadro de benchmarking para colocar a sua função em. GMP tem um bastante decente. É talvez não está bem configurado para aferir funções que não estão em GMP e chamou mpn_whatever, no entanto. Eu não me lembro, e vale a pena uma olhada.

Outras dicas

Você está tentando medir quanto tempo leva para carregar um arquivo? Normalmente, se você estiver desempenho testando algumas pouco de código que já é bastante rápido (sub-segundo), então você vai querer repetir o mesmo código várias vezes (digamos mil ou um milhão), o tempo todo o lote, em seguida, dividir o tempo total pelo número de iterações.

Dito isto, eu não tenho certeza do que você está usando sleep () para. Você pode postar um exemplo do que você pretende fazer?

Eu recomendo colocar esse código em um loop. Executá-lo sobre 1000 ou 10000 iterações. Não há problemas com isso, se você está fazendo apenas algumas instruções, mas deve ajudar.

maiores conjuntos de dados também ajudam, claro.

sono vai deschedule seu segmento a partir da CPU. Não contar com precisão o tempo com precisão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top