Получить местное время в наносекундах

Возможный дубликат:
Функция таймера C ++ для предоставления времени в нано секундах

Мне нужно измерить продолжительность выполнения функции в наносекундах. Является ли это возможным? Наше обычное компьютерное оборудование и программное обеспечение способны дать такую ​​точность по времени? Если да, как это сделать с C ++? Возможно ли это с помощью библиотеки Boost?

12

Решение

Да, сегодня большинство аппаратных средств поддерживает такое разрешение, и стандартная библиотека C ++ имеет API, который также может поддерживать его. К сожалению, не все реализации C ++ действительно обеспечивают это.

API является <chrono> библиотека, представленная в C ++ 11:

#include <iostream>
#include <chrono>

int main() {
auto start = std::chrono::high_resolution_clock::now();

// operation to be timed ...

auto finish = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count() << "ns\n";
}

<chrono> Реализация в libc ++ для Darwin обеспечивает наносекундное разрешение, но, похоже, реализация в VS2012 длится всего лишь десятые доли миллисекунды. Приведенный выше код по-прежнему даст время в виде наносекунд, но время менее 100 микросекунд в итоге составит ноль наносекунд.

Boost также предоставляет реализацию boost :: chrono, которая, похоже, использует наносекунды в Windows. Это также можно использовать с C ++ 03.

#include <boost/chrono.hpp>

int main() {
boost::chrono::high_resolution_clock::time_point t1 =
boost::chrono::high_resolution_clock::now();

boost::chrono::high_resolution_clock::time_point t2 =
boost::chrono::high_resolution_clock::now();

std::cout << boost::chrono::duration_cast<boost::chrono::nanoseconds>(t2-t1) << "\n";
// boost chrono has more advanced output, .count() isn't needed, nor is manually writing out the units
}
39

Другие решения

Я не уверен, что вы ищете часы или другое время, но один из них должен быть тем, что вы ищете:

http://www.cplusplus.com/reference/clibrary/ctime/clock/

http://www.cplusplus.com/reference/clibrary/ctime/difftime/

Вы можете использовать это до и после функций и сравнивать различия времени выполнения, чтобы увидеть общее время выполнения функции.

2

Самое лучшее, что вы можете сделать с Windows API, это QueryPerformanceCounter. Вы можете получить его разрешение с QueryPerformanceFrequency. В зависимости от ситуации, это может быть команда RDTSC ЦПУ, в этом случае частота в основном равна тактовой частоте ЦП. В других случаях используются отдельные часы с частотой 1,024 МГц, поэтому разрешение в основном составляет одну микросекунду.

C ++ 11 добавляет chrono класс, который также может быть полезен — при условии, что вы используете компилятор, который уже имеет его. Если ваш компилятор не предоставляет реализацию, Boost Chrono является разумной заменой, которая работает с большинством существующих компиляторов / библиотек. Опять же, нет гарантии, что он обеспечит разрешение в наносекундах, но я ожидаю, что в Windows это, вероятно, будет переносная оболочка вокруг QPC / QPF, так что, вероятно, оно даст то же разрешение, что и у них, только более переносимо.

2

И, конечно же, есть старый добрый Повысьте :: DATE_TIME :

#include <boost/date_time/posix_time/posix_time.hpp>

boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time();

только микросекунд.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector