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

Возможный дубликат:
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.