gpt4 book ai didi

c++ - 自更新到 gcc 4.9.2 以来,std::chrono 测量错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:31 24 4
gpt4 key购买 nike

我正在使用以下内容来为我的单元测试计时:

template<typename F>
void TestFunc(F lambda)
{
std::array<std::chrono::milliseconds::rep, 20> time;

for (int i = 0; i < 10; ++i) {
auto t1 = std::chrono::high_resolution_clock::now();

for (int j = 0; j < 1000; ++j) {
lambda();
}

auto t2 = std::chrono::high_resolution_clock::now();

time[i] = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
}

size_t avg = std::accumulate(begin(time), end(time), (std::chrono::milliseconds::rep)0) / time.size();

...
}

但我在 ubuntu + gcc 4.9.2 上得到了损坏的结果。像 21006482932417 这样的值,其中 gcc 4.8 和 VS2013 返回 4 毫秒

在将 gcc 从 4.8.x 更新到 4.9.2 之前,测量是正确的。难道是因为使用了不正确的 libstd 版本?我运行 ldd 来检查

> ldd ./bin/unittest
linux-vdso.so.1 => (0x00007fff039fe000)
libboost_chrono.so.1.57.0 => /usr/local/lib/libboost_chrono.so.1.57.0 (0x00007fde053c2000)
libboost_system.so.1.57.0 => /usr/local/lib/libboost_system.so.1.57.0 (0x00007fde051bd000)
libboost_filesystem.so.1.57.0 => /usr/local/lib/libboost_filesystem.so.1.57.0 (0x00007fde04fa6000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fde04d7c000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fde04a6f000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fde04858000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fde04492000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fde04289000)
/lib64/ld-linux-x86-64.so.2 (0x00007fde057f7000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fde03f83000)

也尝试切换到 boost::chrono 但它也没有帮助。可能的原因是什么?

最佳答案

您正在分配一个包含 20 个项目的数组,但只为前 10 个项目赋值,因此其余的都被单元化了。即使它们被初始化为 0,它们也会放弃平均计算。您可能会执行类似这样的操作,在其中传递运行测试的次数,这样尺寸就不会不同步。

#include <algorithm>
#include <array>
#include <chrono>
#include <functional>
#include <iostream>
#include <numeric>
#include <vector>

template <size_t N, typename F>
void TestFunc(F lambda)
{
std::array<std::chrono::milliseconds::rep, N> time;

for(int i = 0; i < N; ++i)
{
auto t1 = std::chrono::high_resolution_clock::now();
for(int j = 0; j < 1000; ++j)
{
lambda();
}
auto t2 = std::chrono::high_resolution_clock::now();
time[i] = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
}
auto avg = std::accumulate(begin(time), end(time), (std::chrono::milliseconds::rep)0) / time.size();
std::cout << "Average of " << N << " tests is " << avg << "ms.\n";
}

int main()
{
std::function<int()> f = []()
{
int sum = 0; for(int i = 0; i < 100000; ++i) sum += i; return sum;
};
TestFunc<10>(f);
return 0;
}

我没有 gcc 4.9.2 方便测试,但这在 Visual Studio 2013 和 ideone 上运行良好.

关于c++ - 自更新到 gcc 4.9.2 以来,std::chrono 测量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26970798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com