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



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

以下是我在 c++ 文件中创建方法以从不同函数收集时间的方式(标头和 cpp 不同,但我直接在 cpp 文件中声明了结构(:

结构声明和初始化:

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 时(不使用上述方法(,我得到了正确的结果。

在这种情况下,这取决于您对极大输入的含义。在现代计算机上,冒泡排序的执行速度非常快,对于相对较大的输入也是如此。我怀疑该函数相对于您的持续时间分辨率(微秒(执行得太快。

我的建议是不要铸造由时钟计算的持续时间,而是直接存储它,类似于以下行(未经测试(:

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() << "usn";
}
}

最新更新