Página 1 de 1

Calculando tempos de funções em C

MensagemEnviado: 17 Mar 2007 13:13
por gabriel_paz
Oi pessoal.

Estou muito acostumado com o assembly, onde temos um controle relativamente maior do tempo em ciclos de máquina gasto em cada instrução e rotina criada, mas quando programamos em C, existe alguma forma de se calcular mesmo que não seja muito exato o tempo gasto por cada comando ou função? Ou só mesmo analisando o Assembly gerado pelo compilador?

A outra perguntinha aí pra vocês que são especialistas, como podemos criar em C rotinas de leitura de teclas (teclado simples) que evitem o boucing? Em assembly eu gerava um pequeno delay, e ás veze se fosse preciso verificava se a tecla havia sido solta ou não.

Obrigado e um abraço a todos.

Gabriel

MensagemEnviado: 17 Mar 2007 13:22
por Maurício
Fala, Gabriel! Tudo em riba??

ow!! Me liga, zé!! :shock:

Difícil de calcular. Basta mudar um parâmetro ou uma vírgula que o compilador muda o código todo.
Uma solução meio tosca é disparar um timer na entrada da função ou procedimento, e recolher o valor no final. Faz a conta da diferença... Taí!!!

No Keil, vc tb pode fazer a conta dos ciclos de máquina. Anota o valor na entrada do procedimento, pega o valor na saída e faz os cálculos.

Pra teclas, cria uma rotina temporizada. Ao invés de ficar lendo a cada ciclo de máquina, programa um timer pra gerar uma interrupção a cada 60ms, por exemplo, e só faz a leitura do teclado quando este flag tiver sido ativado, belê?? :wink:
Vc aumenta ou diminui esse tempo em função da resposta do seu hardware.

[]'s

RETI.

MensagemEnviado: 19 Mar 2007 10:24
por andre_luis
Existem compiladores que fazem isso no modo 'simulação'.
O IAR por exemplo, faz isso; É um recurso muito útil em determinadas situações, como por exemplo quando criei minha função de dívisão long Div(long Dividendo, long divisor), 3 vezes mais rápida que a divisao float "/" intrínseca do C.

+++

MensagemEnviado: 19 Mar 2007 11:09
por Fábio Pereira
Pô André,

Mas é sacanagem comparar um divisão inteira com uma divisão float né ?

Claro que a divisão float será sempre mais lenta.

Agora tem uma coisa: o operador / não é operador de divisão float não hein ... Só vai ser se um dos parâmetros for um float, caso contrário a divisão é inteira.

Sobre o cálculo que Gabriel perguntou, realmente é como já foi comentado. Eu particularmente utilizo os contadores de ciclos disponíveis em quase todos os simuladores para medir estes tempos.

Uma outra alternativa é utilizar um osciloscópio: você seta um pino na entrada de uma função e o apaga na saída da mesma. Assim é possível medir o tempo de execução da mesma.

Aliás este tipo de procedimento é muito útil na depuração de aplicações com muitas fontes de interrupção, pois você pode medir o tempo de execução das ISRs e também a utilização da CPU.

Até +

MensagemEnviado: 20 Mar 2007 00:56
por gabriel_paz
Obrigado pessoal, valeu pela ajuda!

Abraços.

Gabriel

MensagemEnviado: 20 Mar 2007 09:08
por andre_luis
Olá Fábio,

Eu tinha esquecido de mencionar uma coisa: Na verdade, eu fiz a simulação utilizando em ambos os casos, operadores long, porém o detalhe da função que eu fiz, é que a precisao dela era de 1%, um erro alto, mas que atendia à minha necessidade.

Fábio Pereira escreveu:Agora tem uma coisa: o operador / não é operador de divisão float não hein ... Só vai ser se um dos parâmetros for um float, caso contrário a divisão é inteira.


Interessante isso. Eu achava que essa propriedade de seleção automática da rotina em tempo de execução - em função do tipo de variável - fosse recurso exclusivo do C++.

+++

MensagemEnviado: 20 Mar 2007 13:30
por Fábio Pereira
Chama-se promoção de tipo e é feito em tempo de compilação.

O compilador vai analisar os tipos de dados envolvidos na operação e promover os operandos para o tipo de maior capacidade envolvido na operação.

Até +