std :: chrono在使用main方法或类方法时给出不同的值

问题描述 投票:0回答:1

我已经在c ++中创建了实用程序类,以便能够获取不同方法的运行时间。我试图将使用chrono计算的时间存储在结构中,以便可以存储程序中正在使用的所有方法,并在最后进行测量和打印。问题是,在大多数情况下,当我从另一个代码中调用它时,它返回0作为输出,但是如果我使用chrono.now直接在主函数中计算经过的时间,它将给出实际的输出。

下面是我在c ++文件中创建方法以收集来自不同函数的时间的信息(标题和cpp不同,但是我直接在cpp文件中声明了struct:]

结构声明和初始化:

struct analysis{
    const char * func_name;
    int calc_time;
    analysis(const char* x, const int y):
    func_name(x), calc_time(y){}
};
vector<analysis> time_coll {};

开始存储时间的方法:

void Utility::tStart(){
      auto chrono_strt = chrono::high_resolution_clock::now(); 
      sink = chrono_strt;
}

存储结束时间的方法:

void Utility::tEnd(const char* func_name){
    std::chrono::high_resolution_clock::time_point chrono_stp = chrono::high_resolution_clock::now(); 
    std::chrono::microseconds elapsed = std::chrono::duration_cast<std::chrono::microseconds>(chrono_stp - sink);    
    time_coll.push_back((analysis(func_name, elapsed.count())));    
}

打印时间的方法:

void Utility::pStat(){
    for( const auto& elem: time_coll){
        cout << elem.func_name  << " : " << elem.calc_time << endl;
    }
}

其他方法的使用示例:

void Sort::BubbleSort(vector<int>& a){
    u.tStart();
    int temp;
    for (int i=0; i<=(a.size());i++){
        for(int j=0; j<=(a.size())-2;j++){
            if(a[j]>a[j+1]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }

    }
    u.tEnd(__FUNCTION__);
}

上面的方法主要产生0作为结果,除了我给被检查的函数提供了极大的输入(我已经在冒泡排序中对其进行了测试)。当我从头到尾调用主文件中的chrono时(不使用上述方法),我得到正确的结果。

c++ c++11 struct chrono
1个回答
0
投票

在这种情况下,这取决于您输入的内容非常大。在现代计算机上,对于较大的输入,气泡排序也将非常快地执行。我怀疑该函数相对于您的持续时间分辨率(微秒)执行得太快。

我的建议不是强制转换时钟计算的持续时间,而是直接存储它,遵循以下几行内容(未经测试):

struct analysis {
  analysis(const char* x, const chrono::nanoseconds y) : func_name{x}, calc_time{y} {}

  string func_name;
  chrono::nanoseconds calc_time;
};

void Utility::tEnd(const char* func_name) {
  std::chrono::nanoseconds elapsed{chrono::high_resolution_clock::now() - sink};    
  time_coll.emplace_back(func_name, elapsed);    
}

然后,在报告经过时间时,将转换为当时的微秒:

void Utility::pStat() {
  using FractionalUs = std::chrono::duration<double, std::micro>;
  for (const auto& elem: time_coll) {
    cout << elem.func_name  << " : " 
         << std::chrono::duration_cast<FractionalUs>(elem.calc_time).count() << "us\n";
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.