为什么根据测量的位置测量经过的时间会有很大差异?

Why are there a big difference when measuring elapsed time according to where to measure?

我的问题是关于经过时间根据点的差异。

为了找到在我的代码中执行时总耗用时间的最大部分,我使用了 clock 函数。

来源:

首先,我把clock函数放在main函数的开头和结尾。 (实际上,有一些变量声明,但为了我的问题的可读性,我删除了它们)。那么我想我将能够测量总经过时间。

int main(){

    using clock = std::chrono::system_clock;
    using sec = std::chrono::duration<double>;
    const auto before = clock::now();

...

    std::cin >> a >> b;
    lgstCommSubStr findingLCSS(a,b,numberofHT,cardi,SubsA);

    const sec duration = clock::now() - before;

    std::cout << "It took " << duration.count() << "s in main function" << std::endl;

    return 0;
}

其次,我把clock函数放在了classfindingLCSS处。 class 用于查找两个字符串之间的最长公共子字符串。实际执行我的算法的是 class。我编写了在其构造函数中查找它的代码。所以在做这个class的时候,就是returns最长公共子串信息。我认为这个经过的时间将是实际算法 运行 时间。

public:
    lgstCommSubStr(string a, string b, int numHT, int m, vector <int> ** SA):
        strA(a), strB(b), hashTsize(numHT), SubstringsA(SA),
        primeNs(numHT), xs(numHT),
        A_hashValues(numHT), B_hashValues(numHT),
        av(numHT), bv(numHT), cardi(m)
{

        using clock = std::chrono::system_clock;
        using sec = std::chrono::duration<double>;
        const auto before = clock::now();
...

        answer ans=binarySearch(a,b, numHT);

        std::cout << ans.i << " " << ans.j << " " << ans.length << "\n";


        const sec duration = clock::now() - before;

        std::cout << "It took " << duration.count() << "s in the class" << std::endl;

}

输出如下。

tool coolbox
1 1 3
It took 0.002992s in inner class
It took 4.13945s in main function

表示'tool'和'coolbox'有子串'ool'

但我很困惑,两次之间有很大的不同。

因为第一次是总时间,第二次是算法运行时间,所以我不得不认为它的差异时间是声明变量的经过时间。

但它看起来很奇怪,因为我认为声明变量的时间很短。

是不是测量经过的时间有误?

请给我一个解决问题的提示。感谢阅读!

拍摄 std::cin >> a >> b; 之前的时间快照会导致测量不准确,因为您可能在输入 ab 的值之前开始计时。通常,您希望时间安排尽可能接近您实际测量的对象。