Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2012, 12:57   #1
WizarD.89
Форумчанин
 
Аватар для WizarD.89
 
Регистрация: 02.12.2010
Сообщений: 160
По умолчанию Время вычисления функции.

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

Код:
#include "time.h" // заголовочный файл для измерения времени.

void CP7Dlg::OnBnClickedButton2()
{	
           UpdateData(1);

	time_t t0,t1; // объявляем нужные типы.
	time (&t0);  // вычисляем начальное время выполнения программы.
	
	int q=BM(edit1.GetBufferSetLength(edit1.GetLength()), edit2.GetBufferSetLength(edit2.GetLength()));

	
	time (&t1); // вычисляем конечное время.
	CString fg;

	if (q!=0)
             //показываем разницу  (double)difftime(t1,t0) 

	{fg.Format("Найдено. Номер первого входящего элемента %i. Время поиска: %f sec", q, (double)difftime(t1,t0)); 


MessageBox(fg, "Информация", MB_ICONINFORMATION);

}
	else		
	MessageBox("Не найдено", "Информация", MB_ICONINFORMATION);
}
пробовали через clock(); эффект тот же самый. то есть моя программа мега опупительная вычисляет за ноль секунд.
WizarD.89 вне форума Ответить с цитированием
Старый 14.01.2012, 13:09   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от WizarD.89 Посмотреть сообщение
пробовали через clock(); эффект тот же самый. то есть моя программа мега опупительная вычисляет за ноль секунд.
Возможно, твоя мега-опупительная программа работает в мега-опупительной многозадачной системе, аля Windows, где время невозможно засечь точнее, чем 15 миллисекунд. А если, ещё в добавок, у тебя мега-опепутительный много-ядерный процессор, тогда и вовсе твои шансы таким образом замерять время исполнения задачи стремительно падают к нулю.
_Bers вне форума Ответить с цитированием
Старый 14.01.2012, 14:58   #3
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

можешь сделать цикл в котором запустишь функцию много раз измерить время и разделить на количество вызовов функции
pinkiller вне форума Ответить с цитированием
Старый 14.01.2012, 16:30   #4
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Я когда-то подобную задачу решала с помощью функции GetTickCount()
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 14.01.2012, 17:11   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Этот код измеряет в тиках процессора, вне зависимости от потоков и количества процессоров.
Код:
// Инициализация таймера замера времени выполнения алгоритма
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
LARGE_INTEGER time1;
QueryPerformanceCounter(&time1);

// Измеряемая функция

// Снятие показаний таймера
LARGE_INTEGER time2;
QueryPerformanceCounter(&time2);
time2.QuadPart -= time1.QuadPart;
double span = (double) time2.QuadPart / freq.QuadPart;
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 14.01.2012, 17:18   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Этот код измеряет в тиках процессора, вне зависимости от потоков и количества процессоров.
Ну да, только каждый раз разные данные возвращает. Очень независимые данные от потоков и количества процессоров.
_Bers вне форума Ответить с цитированием
Старый 14.01.2012, 17:27   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Ну да, только каждый раз разные данные возвращает. Очень независимые данные от потоков и количества процессоров.
Лучшего способа всё равно нет. Разный результат, это из-за прерываний, а не из-за потоков. Прогоните её в консоли с выключенными прерываниями и результат будет всегда один и тот-же.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 14.01.2012, 17:30   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Лучшего способа всё равно нет. Разный результат, это из-за прерываний, а не из-за потоков. Прогоните её в консоли с выключенными прерываниями и результат будет всегда один и тот-же.
Не понял про прерывания. А как их выключить то?
_Bers вне форума Ответить с цитированием
Старый 14.01.2012, 17:39   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Прогоните её в консоли с выключенными прерываниями и результат будет всегда один и тот-же.
только под чистой ОС разве что.(своей всмысле)
а так вы в вытесняемой многозадачности работаете.
ну точнее да, нет метода.

и ОС без прерываний помрет, ибо не будет ни таймера, ни оборудования.
прерывания это ресурс самой системы, а не приложений.

и когда люди научаться отличать тики/такты проца от времени?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.01.2012, 18:12   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Не понял про прерывания. А как их выключить то?
Вот Пепел Феникса правильно сказал - никак. Правда можно вставить асмовские вставки и на время замера времени работы функции отключит прерывания. Но это геморройно. К тому-же неточность получается, для процессора с частотой 1ГГц, в пределах 10%.
Если нам нужно получит время в микросекундах (здесь мы имеем дело с пикосекундами) нам нужно разделить полученное число на 1000 и точность будет за пределами ошибки измерения.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа вычисления функции arshavin Паскаль, Turbo Pascal, PascalABC.NET 2 16.04.2011 18:47
Вычисления в функции Ислам Помощь студентам 2 28.02.2011 02:43
Составить прогу вычисления функции Lion8990 Помощь студентам 6 17.12.2010 00:18
Алгоритм вычисления значения функции vzr Свободное общение 9 30.03.2010 20:14