Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Castiblanco en 16 Febrero 2013, 03:50 am



Título: Tiempo de ejecución en Milisegundos, Linux
Publicado por: Castiblanco en 16 Febrero 2013, 03:50 am
Hola...

Tengo un par de algoritmos y necesito saber su tiempo de ejecución, pero necesito ese tiempo en milisegundos y no se puede en segundos y dividirlos en 1000 porque se ejecutan rápido y no llegan a 1 segundo así que tienden a cero y no me sirve... Lo pude encontrar para Windows:

Código
  1. using namespace std;
  2.  
  3. double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b){
  4.  LARGE_INTEGER freq;
  5.  QueryPerformanceFrequency(&freq);
  6.  return (double)(a->QuadPart - b->QuadPart) / (double)freq.QuadPart;
  7. }  
  8. main(){
  9.  
  10.  
  11.  LARGE_INTEGER t_inicio, t_final;
  12.  double sec;
  13.  
  14. int x=0, may=0;
  15.  
  16.    cout << "Ingrese X" << endl;
  17.    cin >>x;
  18.  
  19.    int dato[x];
  20.  
  21.    for(int k=0;k<x;k++){
  22. cout << "Ingrese dato "<<k+1<<endl;
  23.        cin >> dato[k];
  24.    }    
  25.  
  26.  QueryPerformanceCounter(&t_inicio);
  27.  
  28.    for(int k=0;k<x;k++){
  29.        if (dato[k]>may){
  30.            may = dato[k];
  31.        }
  32.    }
  33.  
  34.  QueryPerformanceCounter(&t_final);
  35.  
  36.  sec = performancecounter_diff(&t_final, &t_inicio);
  37.  
  38.  cout << "El mayor es: "<< endl << may << endl;
  39.  
  40.  printf("%.16g millisegudos\n", sec * 1000.0);
  41.  
  42.   system("pause");
  43.  
  44. }

Pero no me sirve en Linux que es donde lo necesito ya que utilizo la librería windows.h

Alguien le ha funcionado alguno, porque veo varios a través de Google pero no alguno que sirva de verdad.

Gracias!


Título: Re: Tiempo de ejecución en Milisegundos, Linux
Publicado por: capsulasinformaticas en 16 Febrero 2013, 05:38 am
Aun que hasta ahora solo he programado C y practicamente nada en C++ igual me tome el trabajo de limpiar un poco el codigo, espero haberlo hecho bien. Yo te digo que por lo que se, usar sintaxis de C y C++ no es buena practica de programacion, y ademas usas System("PAUSE"); y para linux creo que ni existe ni es bueno usarlo por varias razones. Bueno, lo otro, borre lo que creo era codigo para intentar tomar el tiempo, lo cual me generaba errores en la compilacion, y puse otra forma de tomarlo que por lo menos a mi me funciona en Windows, abajo de dejo el codigo.

Código
  1. #include <iostream>
  2. #include <ctime>
  3.  
  4. int main() {
  5.    int i;
  6.    int x = 0, mayor = 0;
  7.    clock_t j,t;
  8.  
  9.    std::cout << "Ingrese X: ";
  10.    std::cin >> x;
  11.  
  12.    int dato[x];
  13.  
  14.    j = clock();
  15.  
  16.    for(i=0; i<x; i++) {
  17. std::cout << "Ingrese dato "<< i + 1 << ": ";
  18. std::cin >> dato[i];
  19. }
  20.  
  21. j = clock() - j;
  22. t = clock();
  23.  
  24. for(i=0; i<x; i++)
  25. if (dato[i] > mayor)
  26. mayor = dato[i];
  27.  
  28. t = clock() - t;
  29.  
  30. std::cout << "\nEl Mayor es: " << mayor << "\n\n";
  31. std::cout << "Se demoro: " << ((float)j)/CLOCKS_PER_SEC << " Segundos en ingresar los datos...\n";
  32. std::cout << "Algoritmo para encontrar al mayor dato se demoro: " << ((float)t)/CLOCKS_PER_SEC << " Segundos\n\n";
  33.  
  34. std::cin.get();
  35. }

Cualquier cosa avisas.

Saludos.


Título: Re: Tiempo de ejecución en Milisegundos, Linux
Publicado por: Castiblanco en 16 Febrero 2013, 13:44 pm
Gracias por la intención pero esa forma tampoco me funciona :/

Me da que t vale 0, y CLOCKS_PER_SEC algo como 100000 entonces el resultado da 0 también, a mi también me funcionó algo parecido en Windows pero en Linux nada!!!

Saludos capsulasinformaticas.


Título: Re: Tiempo de ejecución en Milisegundos, Linux
Publicado por: 0xDani en 16 Febrero 2013, 14:34 pm
http://www.kernel.org/doc/man-pages/online/pages/man2/getrusage.2.html


Título: Re: Tiempo de ejecución en Milisegundos, Linux
Publicado por: BatchianoISpyxolo en 16 Febrero 2013, 15:06 pm
Para recoger la hora actual del sistema en microsegundos en C...

Código
  1. double microsegundos() {
  2. struct timeval t;
  3. if (gettimeofday(&t, NULL) < 0 )
  4. return 0.0;
  5. return (t.tv_usec + t.tv_sec * 1000000.0);
  6. }

Ya sabrás tú medir los tiempos :P