Определяющая функция для получения истекшего времени в миллисекундах - PullRequest
0 голосов
/ 29 июня 2010

Я пытался clock_gettime(CLOCK_REALTIME) и gettimeofday() без удачи - и самое основное, как clock(), что возвращает мне 0 (?).

Но никто из них не считает время во сне.Мне не нужен таймер с высоким разрешением, но мне нужно что-то для получения истекшего времени в мс.

РЕДАКТИРОВАТЬ: Окончательная программа:

#include <iostream>
#include <string>
#include <time.h>
#include <sys/time.h>
#include <sys/resource.h>

using namespace std;

// Non-system sleep (wasting cpu)
void wait ( int seconds )
{
  clock_t endwait;
  endwait = clock () + seconds * CLOCKS_PER_SEC ;
  while (clock() < endwait) {}
}

int show_time() {
    timeval tv;
    gettimeofday(&tv, 0);
    time_t t = tv.tv_sec;
    long sub_sec = tv.tv_usec;

    cout<<"t value: "<<t<<endl;
    cout<<"sub_sec value: "<<sub_sec<<endl;
}

int main() {
    cout<<show_time()<<endl;
    sleep(2);
    cout<<show_time()<<endl;
    wait(2);
    cout<<show_time()<<endl;
}

Ответы [ 3 ]

4 голосов
/ 29 июня 2010

Вам нужно повторить попытку gettimeofday(), это определенно посчитает время настенных часов, поэтому оно подсчитывает, когда процесс также спит.

long long getmsofday()
{
   struct timeval tv;
   gettimeofday(&tv);
   return (long long)tv.tv_sec*1000 + tv.tv_usec/1000;
}


...

long long start = getmsofday();
do_something();
long long end = getmsofday();

printf("do_something took %lld ms\n",end - start);
2 голосов
/ 29 июня 2010

Ваша проблема, вероятно, связана с интегральным делением.Вам необходимо привести один из операндов деления к числу с плавающей / двойной, чтобы избежать усечения десятичных значений менее секунды.

clock_t start = clock();
// do stuff

// Can cast either operand for the division result to a double.
// I chose the right-hand operand, CLOCKS_PER_SEC.
double time_passed = clock() / static_cast<double>(CLOCKS_PER_SEC);

[Edit] Как указано, clock () измеряет время процессора (тактовые тикициклы) и не подходит хорошо подходит для испытаний настенного таймера.Если вам нужно портативное решение для этого, @see Boost.Timer как возможное решение

1 голос
/ 29 июня 2010

Вы действительно хотите clock_gettime(CLOCK_MONOTONIC, ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...