gpt4 book ai didi

c++ - C++ 11中头文件的几个问题

转载 作者:可可西里 更新时间:2023-11-01 15:41:28 30 4
gpt4 key购买 nike

我有几个关于新 <chrono> 的问题C++ 11 中的 header 。使用 Windows 7、Visual Studio 2012。

看例子http://en.cppreference.com/w/cpp/chrono

#include <iostream>
#include <chrono>
#include <ctime>

int fibonacci(int n)
{
if (n < 3) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}

int main()
{
std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();
int result = fibonacci(42);
end = std::chrono::system_clock::now();

int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
(end-start).count();
std::time_t end_time = std::chrono::system_clock::to_time_t(end);

std::cout << "finished computation at " << std::ctime(&end_time)
<< "elapsed time: " << elapsed_seconds << "s\n";
}

可能的输出

finished computation at Sat Jun 16 20:42:57 2012
elapsed time: 3s
  1. 我注意到示例使用了 std::chrono::system_clock::now();这是否意味着它只能用于测量耗时而不是 CPU 时间???如果我想测量 CPU 时间,我应该使用什么时钟?
  2. 注意 elapsed time: 3s输出四舍五入为整数。有没有办法让它更颗粒化?

最佳答案

  1. 正确

    根据标准:

    system_clock represent[s] wall clock time from the system-wide realtime clock.

    <chrono>库不提供测量 CPU 时间的机制,所以如果你想要,你将不得不回到旧的 <ctime>库和使用 std::clock() .

    (如果您的目标是 Windows,您将不得不退回到 Windows 提供的用于获取 CPU 时间的任何特定于平台的 API,因为正如您指出的那样,它们的 std::clock() 无法正常工作。)

    system_clock更像是 std::time() 的对应物比 std::clock() . (例如,请注意 system_clock 提供 system_clock::time_pointtime_t 之间的转换。)我想 <chrono> 中缺少时钟用于测量 CPU 时间的原因是由于标准委员会的时间限制以及该功能比系统的挂钟和实时时钟更少使用的事实。

    如果您想要 CPU 时间,但也想要 <chrono> 的好处提供,您应该实现符合标准中概述的时钟概念并提供 CPU 时间的时钟类型,可能在内部使用 std::clock() 实现.

  2. 这行说

    int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
    (end-start).count();

    是导致时间四舍五入为整数秒的原因。您可以选择任何您喜欢的周期,或者您可以使用浮点表示以允许非整数值:

    std::int64_t elapsed_attoseconds =
    std::chrono::duration_cast<std::chrono::duration<std::int64_t, std::atto>>
    (end-start).count();

    double elapsed_seconds =
    std::chrono::duration_cast<std::chrono::duration<double,std::ratio<1>>>
    (end-start).count();

    注意在实际代码中你应该避免使用.count()逃避 chrono::duration 提供的强类型直到你绝对必须。

    auto total_duration = end - start;
    auto seconds = std::chrono::duration_cast<std::chrono::seconds>(total_duration);
    auto milli = std::chrono::duration_cast<std::chrono::milliseconds>(total_duration - seconds);

    std::cout << seconds.count() << "s " << milli.count() << "ms\n";

关于c++ - C++ 11中<chrono>头文件的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13666320/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com