Avaliação do Usuário

Estrela ativaEstrela ativaEstrela ativaEstrela ativaEstrela ativa
 

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.

 

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:

{code}

#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;
}

{/code} 

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.