рассчитать тик процессора

Я создаю проект, который сравнивает некоторые методы для синглтона с точки зрения скорости.

Что я пытаюсь сделать, так это попросить пользователей ввести, сколько раз они хотят запускать каждый метод, прокручивать их и подсчитывать такты процессора.

Проблема в том, что толщина процессора равна 0. Что мне делать?

Вот мой код:

int numOfCalls;
cout << "How many calls do you want for each?";
cin >> numOfCalls;
clock_t beg, end;
beg = clock();
for (size_t i = 0; i != numOfCalls; i++)
    Object* p = GofFixed::instance_GofFixed();
end = clock();
cout << (beg-end) / CLOCKS_PER_SEC << endl;
beg = clock();
for (size_t i = 0; i != numOfCalls; i++)
    Boost::instance_Boost();
end = clock();
cout << (beg - end) / CLOCKS_PER_SEC << endl;

person PHG    schedule 28.05.2015    source источник
comment
1) clock() обеспечивает некоторую меру процессорного времени, но, вероятно, не представляет тики процессора 2) тип clock_t и CLOCKS_PER_SECOND могут быть целочисленными типами, поэтому ваше выражение деления, вероятно, усекается 3) ваш тест довольно упрощен, поэтому он может быть предметом оптимизатору, исключающему многие или все итерации цикла.   -  person Michael Burr    schedule 28.05.2015
comment
Такт часов по умолчанию может быть огромным, Windows зациклилась на 1/64 тиках в секунду, поэтому первое, что вам нужно знать, это насколько велик тик вашей системы. Если это 15,625 мс старой Windows, вам, возможно, придется запустить миллионы итераций вашей программы на ПК с тактовой частотой 2 ГГц, чтобы увидеть хотя бы 1 тик. См.: stackoverflow.com/questions/12244153/   -  person user4581301    schedule 28.05.2015
comment
Проверьте получившуюся сборку, возможно, ваш компилятор полностью исключил цикл for, так как вы ничего не делаете ни с ним, ни с результатами.   -  person Alejandro    schedule 28.05.2015
comment
Вот сборка, сгенерированная для gcc 4.9.2 без оптимизации, и Здесь скомпилировано с -O2. Обратите внимание на main: . Оптимизированная сборка даже не доходит до циклов for (я немного изменил функции, так как у меня нет доступа к GofFixed::), но идея та же.   -  person Alejandro    schedule 28.05.2015
comment
То, что я пытаюсь сделать, это подсчитать, сколько времени им потребуется для запуска каждого метода независимо от того, сколько раз пользователь вводит. Итак, есть ли самый простой способ сделать это?   -  person PHG    schedule 28.05.2015


Ответы (1)


Стандарт позволяет clock_t быть целочисленным типом. Если да, то на него распространяются правила целочисленного деления. Похоже, ваш тест, вероятно, будет работать менее чем за секунду. Если это так, то (beg - end) / CLOCKS_PER_SECOND даст результат меньше 1, который затем будет усечен до 0.

Лучшим способом определения времени было бы использование std::chrono::high_resolution_clock. Затем вы можете преобразовать в любую единицу времени, поддерживаемую стандартной библиотекой. Было бы лучше использовать меньшую единицу времени, чтобы сохранялись измерения с точностью до секунды. Использование chrono изменит ваш код на это:

auto beg = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i != numOfCalls; i++)
    Object* p = GofFixed::instance_GofFixed();
auto end = std::chrono::high_resolution_clock::now();
cout << std::chrono::duration_cast<std::chrono::milliseconds>(beg - end).count() << endl;
                                           //   ^^^^^^^^^^^^ Used milliseconds instead
                                           //                for greater accuracy

Что должно работать, если тест не оптимизирован или не занимает меньше миллисекунды.

Вы можете прочитать больше о std::chrono::high_resolution_clock здесь и std::chrono::duration_cast здесь.

person phantom    schedule 28.05.2015