Meu PC tem dois processadores e sei que cada um deles roda a 1,86 GHz. Acabei de ler sobre ciclos de clock e eu só tenho um entendimento (muito) difícil, então peço desculpas antecipadamente se a minha pergunta for tão estúpida.
Como eu disse, eu quero medir o pulso de clock do processador do meu PC manualmente, e minha ideia é apenas calcular o quociente entre o número de linhas de assembler que um programa tem, e o tempo que meu computador gasta para executá-lo , então eu tenho o número de instruções de montagem por tempo processado pela CPU (isso é o que eu entendi um 'ciclo de clock' é). Eu pensei em fazer da seguinte maneira:
- Eu escrevo um programa em C e o converto em código assembly.
- Eu faço:
$gcc -S my_program.c
, que diz ao compilador gcc para fazer todo o processo de compilação, exceto a última etapa: transformar my_program.c em um objeto binário. Assim, eu tenho um arquivo chamado my_program.s que contém a origem do meu programa C traduzido em código assembler.
-
Eu conto as linhas do meu programa (vamos chamar esse número N). Eu fiz: $ nl -l my_program.s | tail -n 1
e obtive o seguinte:
1000015 .section .note.GNU-stack,"",@progbits
É para dizer que o programa tem um milhão de linhas de código.
- eu faço:
$gcc my_program.c
para que eu possa executá-lo.
-
Eu faço: $time ./a.out
("a.out" é o nome do objeto binário de my_program.c) para obter o tempo (vamos chamá-lo de T) é gasto para executar o programa e eu obtenho:
real 0m0.059s
user 0m0.000s
sys 0m0.004s
Supõe-se que o tempo que estou procurando é o primeiro representado na lista: o "real", porque os outros se referem a outros recursos que estão sendo executados no meu sistema no mesmo momento exato em que executo ./a.out
.
Então eu tenho que N = 1000015 linhas e T = 0,059 segundos. Se eu executar a divisão N / T, obtenho que a frequência está próxima de 17 MHz, o que obviamente não está correto.
Depois pensei que talvez o fato de haver outros programas rodando em meu computador e consumindo recursos de hardware (sem ir mais longe, o próprio sistema operacional) faça com que o processador "divida" seu "poder de processamento" e faça pulso de clock vai mais lento, mas não tenho certeza.
Mas eu pensei que se isso fosse certo, eu também deveria encontrar a porcentagem de recursos da CPU (ou memória) que meu programa consome, porque então eu realmente poderia aspirar a obter um resultado (bem) aproximado sobre a minha velocidade real da CPU.
E isso me leva à questão de como descobrir esse 'valor de consumo de recursos' do meu programa. Eu pensei sobre o comando $ top
, mas ele é imediatamente descartado devido ao pouco tempo que meu programa gasta para ser executado (0.059 segundos); Não é possível distinguir por simples visão qualquer pico no uso de memória durante este pequeno período de tempo.
Então o que você acha disso? Ou o que você me recomenda para fazer? Estou apenas aprendendo e, como você pode ver, estou muito longe de ser um especialista nessas questões. E eu sei que existem programas que fazem este trabalho que eu tento fazer, mas eu prefiro fazê-lo usando o bash raw porque estou interessado em fazê-lo da maneira mais "universal" possível (parece mais confiável).