• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

maeDaSol

temporizar para uma função

7 mensagens neste tópico

olá

tenho estado às voltas  com um programa que tem que medir o tempo que demora a multiplicar matrizes.

mas dá-me sempre 0 segundos.

Alguém sabe como é que meço  o tempo em milissegundos ou outra unidade mais pequena que os segundos?

o meu código é mais ou menos este:

time_t tempo1, tempo2;

time(&tempo1);
matrizR = multiplicar(d, matrizA, matrizB, matrizR);   
time(&tempo2);

printf("tempo de execução: %.2d \n", (difftime(tempo2, tempo1)));  

brigada  :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é porque a função time só conta em segundos. A tua operação sobre as matrizes deve demorar menos que 1 segundo.

Já estou um pouco ferrujado de C, mas acho que o que querias era a função clock que te dá o tempo em termos de processador usado. O valor retornado pela função é em ciclos/segundo que varia de sistema para sistema, ou seja, terias que ver o valor de CLOCK_PER_SECOND para saber o valor dele. E depois era uma questão de fazer contas...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu costumo usar:

clock_t start = clock();

matrizR = multiplicar(d, matrizA, matrizB, matrizR);   

clock_t ends = clock();
printf("Tempo de execucao: %.5f seg\n\n",(double) (ends - start) / CLOCKS_PER_SEC);

:P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a muito custo o meu prof lá falou dessa função timeofday.

vou exper essa e tb vou exp o clock.

brigada ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

oi, consegiu por isto a funcionar

aqui vai o código final

struct timeval t1,t2;

( ...)

gettimeofday(&t1, NULL); 
matrizR = multiplicar(d, matrizA, matrizB, matrizR);   
gettimeofday(&t2, NULL); 


printf("%.2f segundos\n", (float)(t2.tv_usec-t1.tv_usec)/1000);  //calcular a diferença de tempo (em miliseg) e converter para float

obrigada pela ajuda, deu mt jeito

:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

oi, consegiu por isto a funcionar

aqui vai o código final

struct timeval t1,t2;

( ...)

gettimeofday(&t1, NULL); 
matrizR = multiplicar(d, matrizA, matrizB, matrizR);   
gettimeofday(&t2, NULL); 


printf("%.2f segundos\n", (float)(t2.tv_usec-t1.tv_usec)/1000);  //calcular a diferença de tempo (em miliseg) e converter para float

obrigada pela ajuda, deu mt jeito

;)

Atenção que assim só funciona as vezes. O membro usec guarda o numero de micro-segundos entre dada segundo não o tempo todo

tipo se a primeira chamada à funções gettimeofday devolver  1001 para o tv_sec e 599999 para o tv_usec quer dizer que está quase a passar o segundo, se o calculo da matrix demorar 10 mili-segundos a segunda chamada devovel tv_sec=1002 e tv_usec = 009999, e se tentares fazer a conta como tens vai dar negativo.

deves fazer algo do género


(double)((t2_sec+(t2.tv_usec/1000000))-(t1_sec+(t1.tv_usec/1000000)))

Assim dá-te os segundos com precisão de micro-segundos (nas casas decimais)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora