Получите местное время в наносекундах
Возможный дубликат:
C++ Функция таймера для обеспечения времени в секундах nano
Мне нужно измерить продолжительность выполнения функции в разрешении наносекунд. Является ли это возможным? Наше обычное компьютерное оборудование и программное обеспечение способны дать такую точность во времени? Если да, то как это сделать с C++? Возможно ли это с помощью библиотеки Boost?
Ответы
Ответ 1
Да, сегодня большинство аппаратных средств поддерживает такое разрешение, а стандартная библиотека 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>
в lib C++ для 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
}
Ответ 2
Я не уверен, что вы ищете часы или difftime, но один из них должен быть тем, что вы ищете:
http://www.cplusplus.com/reference/clibrary/ctime/clock/
http://www.cplusplus.com/reference/clibrary/ctime/difftime/
Вы можете использовать это до и после функций и сравнить различия времени выполнения, чтобы увидеть общее время выполнения функции.
Ответ 3
О лучшем, что вы можете сделать с Windows API, является QueryPerformanceCounter. Вы можете получить его разрешение с помощью QueryPerformanceFrequency. В зависимости от ситуации, это может быть использование команды CPU RDTSC, и в этом случае частота в основном является тактовой частотой CPU. В других случаях он использует отдельные часы с частотой 1,024 МГц, поэтому разрешение составляет в основном одну микросекунду.
С++ 11 добавляет класс chrono
который также может быть полезен - если вы используете компилятор, который уже имеет его. Если ваш компилятор не обеспечивает реализацию, Boost Chrono является разумной заменой, которая работает с большинством существующих компиляторов/библиотек. Опять же, нет гарантии, что она обеспечит наносекундное разрешение, но я ожидаю, что в Windows это, вероятно, будет переносной оболочкой вокруг QPC/QPF, поэтому, вероятно, это будет то же самое, что и у них, просто более портативно.
Ответ 4
И, конечно, есть и старый добрый Boost :: date_time:
#include <boost/date_time/posix_time/posix_time.hpp>
boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time();
только microsec.