c++ - 处理时间差异
问题描述
首先让我说,我不是一个熟练的 C++ 程序员,我刚刚开始了这段旅程,并且正在使用 Code::Blocks 作为我的 ide 在 Win 10 环境中工作。我开始通过编写欧拉项目问题的解决方案来学习 C++。几年前我利用这些问题开始学习 Python,因此对于前 50 多个问题,我至少有一个 Python 解决方案。在用 Python 解决这些问题时,我了解到随着我的技能提高,我可以制定更好的解决方案。在学习 Python 时,我使用反复试验的方法来改进我的代码,直到我了解了用于计时我的代码的 Python 工具。有一次,我定义了一种方便且一致的计时方法,我的编码得到了显着改善。因为,我现在开始使用 C++ 开始这段旅程,我决定我会积极主动地创建一个一致的方法来计时代码执行。为此,我决定使用 C++ chrono 库并定义了两种不同的方法,它们似乎应该产生相同的时间结果。然而,正如这个问题的瓷砖所暗示的那样,他们没有。
所以这是我的问题:为什么以下两种方法不能产生相同的结果?
方法#1
此方法为do some stuff 段提供了略多于3 秒的时间,但小于3.054 秒的CODE::BLOCKS 执行时间报告。我当然理解基于程序流程的这些差异。所以这种方法似乎给出了很好的结果。这种方法的问题是我需要将计时代码复制并粘贴到我想要计时的每个 .cpp 文件中,这看起来很草率。
使用此方法的输出如下所示:
以秒为单位的经过时间:3.00053 秒
进程返回 0 (0x0) 执行时间:3.151 秒
#include <iostream>
#include <chrono>
#include <unistd.h>
using namespace std;
using Clock = chrono::steady_clock;
using TimePoint = chrono::time_point<Clock>;
// Functions
TimePoint get_timestamp();
double get_duration(TimePoint, TimePoint);
int main()
{
//auto start = chrono::steady_clock::now();
auto start_t = get_timestamp();
//cout << "Start is of type " << typeid(start).name() << "\n";
// do some stuff
sleep(3);
auto end_t = get_timestamp();
//double tme_secs = chrono::duration_cast<chrono::nanoseconds>(end - start).count()/1000000000.0000;
double tme_secs = get_duration(start_t, end_t)/1000000000;
cout << "Elapsed time in seconds : " << tme_secs << " sec";
return 0;
}
TimePoint get_timestamp(){
return Clock::now();
}
double get_duration(TimePoint start, TimePoint end){
return chrono::duration_cast<chrono::nanoseconds>(end - start).count()*1.00000000;
}
方法#2 在这种方法中,我尝试创建一个 ProcessTime 类,该类可以包含在我想要计时的文件中,并提供一种更简洁的方法。这种方法的问题是我在纳秒内得到计时报告,这并不反映正在计时的过程。这是我对这种方法的实现。
使用此方法的输出如下所示:
经过时间:1.1422e+06 秒
进程返回 0 (0x0) 执行时间:3.148 秒
处理时间.h 文件
#ifndef PROCESSTIME_H_INCLUDED
#define PROCESSTIME_H_INCLUDED
#include <chrono>
using namespace std;
using Clock = chrono::steady_clock;
using TimePoint = chrono::time_point<Clock>;
class ProcessTime{
public:
ProcessTime();
double get_duration();
private:
TimePoint proc_start;
};
#endif // PROCESSTIME_H_INCLUDED
处理时间.cpp 文件
#include "ProcessTime.h"
#include <chrono>
using namespace std;
using Clock = chrono::steady_clock;
using TimePoint = chrono::time_point<Clock>;
ProcessTime::ProcessTime(){
TimePoint proc_start = Clock::now();
}
double ProcessTime::get_duration(){
TimePoint proc_end = Clock::now();
return chrono::duration_cast<chrono::nanoseconds>(proc_end - ProcessTime::proc_start).count()*1.00000000;
}
main.cpp 文件:
#include <iostream>
#include "ProcessTime.h"
#include <unistd.h>
using namespace std;
int main()
{
ProcessTime timer;
// Do some Stuff
sleep(3);
double tme_secs = timer.get_duration()/1000000000;
cout << "Elapsed time: " << tme_secs << " seconds";
return 0;
}
解决方案
这是不正确的:
ProcessTime::ProcessTime(){
TimePoint proc_start = Clock::now();
}
您正在设置一个名为 的局部变量proc_start
,然后构造函数结束。您没有设置 的实际成员变量ProcessTime
。
一种解决方法(也是首选方法)是使用成员初始化列表:
ProcessTime::ProcessTime() : proc_start(Clock::now()) {}
或者,如果您对成员初始化列表一无所知,则分配值的代码将如下所示。
ProcessTime::ProcessTime(){
proc_start = Clock::now();
}
推荐阅读
- asp.net-core - 如何在 OpenIdConnect TokenValidated 偶数处理程序中访问 Session
- angular - 运行时错误:this.userprovider.userSignup(...).subscribe 不是 Ionic 中的函数
- spring-mvc - 如何在 Spring MVC 的 Rest Controller 中将 Bean 类对象作为 JSON 返回
- networking - P2P 网络引导
- symfony - 我将如何在 Twig 中添加动态 HTML 标签?
- javascript - 在 fetch 中使用 setState。错误:警告:无法在未安装的组件上调用 setState(或 forceUpdate)
- python - 如何在 Python 中对代码块进行分组,类似于函数,但不需要定义参数?
- python-3.x - numba\jit 不允许在 nopython 模式下使用 np argsort
- c - Lua 的“全局”本地值存储在哪里?
- rust - 为什么在实现具有关联类型的关联 const 时,Rust 希望 Self 被调整大小?