首页 > 解决方案 > 处理时间差异

问题描述

首先让我说,我不是一个熟练的 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;
}

标签: c++

解决方案


这是不正确的:

ProcessTime::ProcessTime(){
    TimePoint proc_start = Clock::now();
}

您正在设置一个名为 的局部变量proc_start,然后构造函数结束。您没有设置 的实际成员变量ProcessTime

一种解决方法(也是首选方法)是使用成员初始化列表:

ProcessTime::ProcessTime() : proc_start(Clock::now()) {}

或者,如果您对成员初始化列表一无所知,则分配值的代码将如下所示。

ProcessTime::ProcessTime(){
    proc_start = Clock::now();
}

推荐阅读