Seu Curso

  • Full Screen
  • Wide Screen
  • Narrow Screen
  • Increase font size
  • Default font size
  • Decrease font size

Cronometrar a execução de programas

Imprimir
Avaliação do Usuário: / 6
PiorMelhor 

Quer cronometrar o tempo de execução de algum programa?

Isso pode ser útil de várias maneiras como comparar dois algoritmos ou o mesmo algoritmo em várias linguagens, por exemplo.

No Linux é muito fácil:

Use o comando time com a sintaxe time programa/comando

Por exemplo, listar todos os arquivos e diretórios do diretório raiz: time ls /




O tempo real é o tempo desde a criação do processo até sua destruição, o tempo user é o tempo em que o processo ficou no estado de usuário do Sistema Operacional e o tempo sys é o tempo em que o processo ficou no estado de sistema do SO.

Para o Windows a tarefa já não é tão trivial:

Não existe um comando similar ao time no Linux, então temos que construir nosso próprio cronômetro de processos.

Use um compilados C, como o DevC++, por exemplo, digite e compile o seguinte código (adaptado de http://paginas.fe.up.pt/~jmcruz/etc/unix/Win32.pdf – leitura recomendada). Um bom nome para o programa é timer.cpp:

#include <windows.h>
#include <stdio.h>
char *skip_arg(char *line)
{
 while (*line != '\0' && *line != ' ' && *line != '\t')
 line++;
 while (*line == ' ' || *line == '\t')
 line++;
 return line;
}
int main(void)
{
 STARTUPINFO stup;
 PROCESS_INFORMATION pinfo;
 LONGLONG ct, et, kt, ut, elapse;
 SYSTEMTIME sct, set;
 char *call;
 call = GetCommandLine(); // string com a linha de comando
 call = skip_arg(call); // salta o 1.o argumento
 GetStartupInfo(&stup); // necessário para a criação de um novo processo
 CreateProcess(NULL, call, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL,&stup, &pinfo); // cria novo processo com parâmetros de chamada
 WaitForSingleObject(pinfo.hProcess, INFINITE); // espera que termine
 GetProcessTimes(pinfo.hProcess, (FILETIME *)&ct, (FILETIME *)&et,(FILETIME *)&kt, (FILETIME *)&ut);
 CloseHandle(pinfo.hProcess); // fecha handle do processo terminado
 CloseHandle(pinfo.hThread); // fecha handle do thread terminado
 elapse = et - ct;
 FileTimeToSystemTime((FILETIME *)&ct, &sct);
 FileTimeToSystemTime((FILETIME *)&et, &set);
 printf("\n\nStart time: %02d:%02d:%02d.%03d\n", sct.wHour, sct.wMinute,sct.wSecond, sct.wMilliseconds);
 printf("End time: %02d:%02d:%02d.%03d\n", set.wHour, set.wMinute,set.wSecond, set.wMilliseconds);
 printf("Elapsed: %.3f ms\n", (double)elapse/10000);
 printf("Kernel: %.3f ms\n", (double)kt/10000);
 printf("User: %.3f ms\n", (double)ut/10000);
 return 0;
}
 

Compile-o e use-o da seguinte maneira: timer programa

No Windows não podemos cronometrar comandos internos, como o dir (similar ao ls em Linux), podemos apenas contar o tempo de comandos externos ou programas.

Por exemplo, compactar um arquivo install.exe usando o programa RAR, todos no diretório raiz: timer rar a inst.rar install.exe



O tempo elapsed é o tempo desde a criação do processo até sua destruição, o tempo user é o tempo em que o processo ficou no estado de usuário do Sistema Operacional e o tempo kernel é o tempo em que o processo ficou no estado de sistema do SO.

Adicionar comentário


Código de segurança
Atualizar

You are here: