Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > фиксация времени работы программы


Автор: Sasisa 8.4.2007, 20:40
Всех с праздничком!

1) Подскажите, пожалуйста, есть ли в C++ возможность зафиксировать время работы программы от момента её запуска, например? С помощью какой функции это возможно сделать? (имеется в виду с точностью хотя бы до десятых секунды)

2)Зависит ли время обработки программы при одинаковых исходных данных от чего либо, кроме загрузки процессора?

Автор: Mayk 8.4.2007, 20:55
Цитата(Sasisa @  9.4.2007,  00:40 Найти цитируемый пост)


1) Подскажите, пожалуйста, есть ли в C++ возможность зафиксировать время работы программы от момента её запуска, например? С помощью какой функции это возможно сделать? (имеется в виду с точностью хотя бы до десятых секунды)

да хотя бы через clock().
Код

void sth(){
  clock_t start_time = clock();
  do{something}
  double secs = double(clock()-start_time)/CLOCKS_PER_SEC;
  cout << "time elapsed: " << secs << endl;
}

Автор: ama_kid 8.4.2007, 21:03
Мне кажется такое решается с помощью отдельного потока (если, конечно, среда не DOS). Запускаешь поток, делаешь ему Sleep("Время работы в секундах") и перед завершением потока - завершаешь основной процесс...

Автор: bsa 8.4.2007, 21:08
Цитата(Sasisa @ 8.4.2007,  20:40)
2)Зависит ли время обработки программы при одинаковых исходных данных от чего либо, кроме загрузки процессора?

Да. Например, от загруженности дисковой подсистемы, если данные берутся с диска.

Автор: Sasisa 8.4.2007, 23:50
Среда как раз Dos...

попробовал использовать Clock(), но в результате время обработки программы оказывается 0.00000

К примеру, при таком варианте время обработки так же выдается 0.00000
Код

int main(void)
{
   clock_t start, end;
   start = clock();

   delay(20);

   end = clock();
   printf("The time was: %f\n", (end - start) / CLK_TCK);
   getch();

   return 0;
}


если же поставить delay(200), то время будет примерно таким 0.164352
Хоть программный код подопытной проги не очень большой, но все таки хотелось бы видеть хоть какие доли секунды, а не нули...как быть? может есть еще какие варианты или нюансы?

Автор: Rickert 9.4.2007, 05:53
Код

   printf("The time was: %d\n", (end - start) / CLK_TCK);

А так?

Автор: Dov 9.4.2007, 09:09
Цитата(Rickert @  9.4.2007,  05:53 Найти цитируемый пост)
А так?

Скорее так
Код

printf("The time was: %f\n", (double)(end - start) / CLK_TCK);



Автор: vinter 9.4.2007, 09:54
скорее так smile 
Код

printf("The time was: %d\n", (end - start));

время в миллисекундах

Автор: Sasisa 9.4.2007, 11:15
Лучше всего работает вариант, предложенный Dov

Код

printf("The time was: %f\n", (double)(end - start) / CLK_TCK);


но все равно не достаточно точно :( например, при задержке delay(10) уже показывает нули.
может стоит запускать прогу на Pentim I или вообще на 486? smile

Автор: FiMa1 9.4.2007, 11:35
А может лучше профайлером таки замерить.. и наглядно и действенно.. Могу отсоветовать vTune.

Автор: Daevaorn 9.4.2007, 12:07
Цитата(FiMa1 @  9.4.2007,  12:35 Найти цитируемый пост)
Могу отсоветовать vTune.

Вот правильно, vTune можно только отсоветовать. http://www.automatedqa.com/products/aqtime/index.asp - реальный инструмент

Автор: Rickert 9.4.2007, 12:38
Короче юзайте GetTickCount(), а не какой-то гонимый clock()

Автор: Sasisa 9.4.2007, 13:15
Всем спасибо!
буду искать варианты из вышепредложенного smile

Автор: aldari 9.4.2007, 13:26
Если clock показывает 0.0000 значит прошло очень мало времени. 
Цитата

(имеется в виду с точностью хотя бы до десятых секунды)

так что тебе хаватит

А при замере времени выполнения алгоритма обычно его помещают в цикл while (i < 10000) ....

Я  показывал преподавателю результаты замера с помощью профайлера, он объяснял на примере с ниткой: размер нитки трудно измерить,
 измерить толщину мотка уже проще. Да.. давно уже было....

Автор: Daevaorn 9.4.2007, 13:40
Цитата(Rickert @  9.4.2007,  13:38 Найти цитируемый пост)
Короче юзайте GetTickCount(), а не какой-то гонимый clock()

А мой компилятор не понимает GetTickCount() :(

Автор: JackYF 10.4.2007, 00:48
Rickertsmile

<imho>
Я тоже не понимаю, зачем юзать непереносимый GetTickCount() там, где нужна точность до десятых секунды.
Кстати! smile
Это только в Виндах clock() такой неточный.
В Линухах им можно сотнитысячные доли секунды замерять.

И кто там гонимый? smile Может, все же Винда, которая стандартам не следует, а все свой АПИ раздувает? smile
</imho>

Автор: Rickert 10.4.2007, 03:50
GetTickCount() есть в vs это точно.
Ну раз уж на то пошло, то надо юзать time(0).
Он точно есть и в gcc и в vs.

Автор: fantast 10.4.2007, 10:46
 а по мне лучше всего timeGetTime. Это времы которое прошло с начала старта системы (ОС). Оно кажется ваще считается самой виндой в своих потоках и точность там огого. измеряется в милисекундах.
мне кажется лучший вариант

Автор: JackYF 10.4.2007, 14:24
Цитата(Rickert @  10.4.2007,  03:50 Найти цитируемый пост)
time(0).


оно в секундах время выдает. Маловато может быть.



Цитата(fantast @  10.4.2007,  10:46 Найти цитируемый пост)
timeGetTime. Это времы которое прошло с начала старта системы (ОС). Оно кажется ваще считается самой виндой


Вот... опять все виндовые АПИ. ИМХО, конечно )

Автор: Mayk 10.4.2007, 17:55
Цитата(Rickert @  10.4.2007,  07:50 Найти цитируемый пост)
GetTickCount() есть в vs это точно.

Цитата(fantast @  10.4.2007,  14:46 Найти цитируемый пост)
Оно кажется ваще считается самой виндой в своих потоках и точность там огого. измеряется в милисекундах.
мне кажется лучший вариант 

 smile 

Замечано, что WinApi очень плохо работает в
Цитата(Sasisa @  9.4.2007,  03:50 Найти цитируемый пост)
Среда как раз Dos...
.

хотя бы в силу своего отсутствия.

Автор: fantast 10.4.2007, 22:08
ггг ну да ступил немножко, недосмотрел   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)