【问题标题】:How to use chrono to determine runtime如何使用 chrono 确定运行时间
【发布时间】:2014-09-14 18:19:57
【问题描述】:

我想确定哪个容器更适合用于某些操作,因此我必须检查向量与列表的运行时间。

网上的参考对于这个实现来说非常模糊或过于复杂。

任何帮助将不胜感激

【问题讨论】:

  • 您的意思是“我如何测量执行时间”还是“我如何测量编译时间”?通常,我使用time myprogtime g++ {options} myprog.cpp 之类的命令来测量时间——但假设它的运行时间相当长——至少一两秒。
  • 我不认为这是您感兴趣的 compile 时间,而是 run 时间?通常,您在进行操作之前拍摄时间快照,并在操作完成时拍摄另一张快照,然后您只需检查两次之间的差异。
  • 我如何获得各自的开始和结束时间?

标签: c++ list vector compiler-optimization chrono


【解决方案1】:

如果您可以访问C++11 编译器,

#include <chrono>
#include <iostream>

int main()
{
    std::chrono::steady_clock::time_point _start(std::chrono::steady_clock::now());
    // code you want to time here
    std::chrono::steady_clock::time_point _end(std::chrono::steady_clock::now());

    std::cout << std::chrono::duration_cast<std::chrono::duration<double>>(
                    _end - _start).count(); // in seconds, read more about std::chrono
}

【讨论】:

  • 我已经尝试过了,但收到了大量错误。我有 头文件,但它一直告诉我:'std::chrono' 尚未声明|
  • -std=c++11编译,是C++11标准的一部分
【解决方案2】:

这就是我使用它的方式:

#include <iostream>
#include <chrono>

    auto start = std::chrono::high_resolution_clock::now();
    ... code to measure here ... 
    auto diff = std::chrono::high_resolution_clock::now() - start;
    auto t1 = std::chrono::duration_cast<std::chrono::nanoseconds>(diff);
    std::cout << "Loop1: " << t1.count() << std::endl;

你需要用g++ -std=c++11 编译它,只要你有一个工作的 C++11 编译器和库,它应该可以工作。

【讨论】:

  • 我会改用steady_clock,如果在运行时更改系统时间,high_resolution_clock 可能会改变,尽管这可能永远不会发生......
  • 不是我(或我的系统)经常做的事情......我希望高分辨率时钟至少在某些系统上会提供更高的分辨率,至少在某些情况下,这更重要.但我承认我只是从我的一些代码中复制了这个,没有过多考虑可能存在哪些不同的时钟源,以及它们的优缺点。
  • 是的,我在 high_resolution_clock 之前也使用过,但是当我不得不为一个耗时 2 天的模拟计时时遇到了问题,而且有人刚刚更改了挂钟时间。正如您所说,似乎(尽管标准不保证)两者都具有相同的精度。
  • 我只将它用于需要几秒钟或几分钟的事情。对于需要一段时间的事情,我通常只使用标准的time(当然,它也有你描述的同样的问题)。或者 Linux 上的 time 命令行工具 - 无需更改代码...
  • 当然,如果你真的偏执于运行时可能会发生某些事情,我想你会使用 stable_clock :D
【解决方案3】:

这是我当前的代码:

#include <iostream>
#include <list>
#include <vector>
#include <chrono>
#include <stdlib.h>
#include <ctime>

using namespace std;

template <typename Container>
void fill_container(Container& c, int n)
{
int v;

for(int i =0; i<n; i++)
{
    v= rand() %12;
    c.push_back(v);
}

}

template<typename Container>
void print(Container& c, ostream& out =cout)
{
typename Container::iterator itr = c.begin();
cout << "now" ;
while(itr!=c.end())
{
    out << *itr << endl;
    itr++;
}

}

template <typename Container>
void removeOdd(Container& c)
{
 typename Container::iterator itr2 = c.begin();
 while(itr2!= c.end())
 {
        cout << *itr2 << endl;
         if(*itr2 %2 != 0 )
        {
            itr2 = c.erase(itr2);
        }
        itr2++;
 }

 }

int main()
{





//Timer ends
std::chrono::steady_clock::time_point _start(std::chrono::steady_clock::now());
// code you want to time here
vector<int> damn;
fill_container(damn, 20);
removeOdd(damn);
print(damn);
std::chrono::steady_clock::time_point _end(std::chrono::steady_clock::now());

std:: cout << std::chrono::duration_cast<std::chrono::duration<double>>( _end - _start).count();



return 0;
}

【讨论】:

  • 你的代码可以工作(除了我编辑的第一个包含的错字),只要确保你用-std=c++11编译
  • 如果使用g++,则编译为g++ -std=c++11 program.cpp
  • 你用的是什么编译器?如果您使用 IDE(如 Eclipse 或 CodeBlocks),有一个选项可以指定编译器标志,在线搜索即可找到。
猜你喜欢
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
相关资源
最近更新 更多