#cppbuilder #cpp
Есть код. Как узнать его время выполнения в м.секундах или ещё меньше? Не могу нигде найти( Помогите, пожалуйста. Код короткий, обычные функции с получением времени или простые таймеры не реагируют. (начало отсчета времени) // код (Конец отсчета времени) Спасибо за внимание!
Ответы
Ответ 1
Первый ответ самый простой для выполнения, его можно еще упростить clock() находиться в библиотеке "time.h" int t=clock(); код { } cout<Ответ 2
#includeint main() { LARGE_INTEGER t1, t2, f; QueryPerformanceCounter(&t1); //program QueryPerformanceCounter(&t2); QueryPerformanceFrequency(&f); double sec = double(t2.QuadPart - t1.QuadPart) / f.QuadPart; cout << "\ntime " << sec; } Ответ 3
Я для таких целей использовал GetTickCount. Это не миллисекунды, это тики процессора. На каждой отдельно взятой машине можно написать простенькую программку, которая будет замерять количество тиков в секунду.Ответ 4
Использовать GetTickCount следующим образом DWORD t = GetTickCount(); // Ващ код t = GetTickCount - t; cout << t << "ms" << endl; Но нужно помнить, что реальная точность - 10-50 мс (зависит от точности таймера). Если нужно ещё точнее - тогда RdtscОтвет 5
Могу посоветовать несколько вариантов: Стандартные c-таймеры, но для оч. быстрого кода придется сделать его (т.е. код) циклическим, чтобы время работы можно было измерить, а затем разделить на количество циклов. Использовать точные OS-специфик таймеры, например, QueryPerformanceFrequency. Использовать стороннюю библиотеку. Как пример могу привести библиотеку FFTW, в которой есть функции для вычисления коротких промежутков времени (тиков). Я бы выбрал первый вариант. UPD. Ну как-то так: #include... const size_t cycles_max = 10000; clock_t t0 = clock(); for(size_t i=0; i < cycles_max; ++i) { //измеряемый код } clock_t t1 = clock(); //Среднее время выполнения одного цикла, в сек. double time_seconds = (t1-t0)*CLOCKS_PER_SEC/cycles_max; Ответ 6
Напиши метод, который возвращает текущие время, поставить его в начале программы, а в конце вызвать еще раз и это время отнять от начального - будет разница. Или использовать профайлер.Ответ 7
Один из вариантов на крайний случай. Можно создать второй низкоприоритетный поток, и в нем зациклиться, например, выполнять int flag=1; ///////////////// это лучше сделать глобальной переменной register int i=0; // i пишем в регистре проца, для ускорения, но это сильно //нагружает систему while(true){ Sleep(1); i++; if(0==flag) break;} этот вариант не самый лучший, но рабочий. Заодно, в функции закрытия потока изменить значение переменной flag на 0. Значение i будет ответом в миллисекундах. Код работы с потоками есть в гугле=)...
Комментариев нет:
Отправить комментарий