我已经在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时(不使用上述方法),我得到正确的结果。
在这种情况下,这取决于您输入的内容非常大。在现代计算机上,对于较大的输入,气泡排序也将非常快地执行。我怀疑该函数相对于您的持续时间分辨率(微秒)执行得太快。
我的建议不是强制转换时钟计算的持续时间,而是直接存储它,遵循以下几行内容(未经测试):
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";
}
}