gpt4 book ai didi

c++ - 为什么当我重定向 stdout 时我的程序运行得更快?

转载 作者:太空狗 更新时间:2023-10-29 11:45:11 26 4
gpt4 key购买 nike

我看到了一些非常奇怪的东西。我编写了一个小型代码计时器来捕获代码块运行了多长时间。我无法发布所有代码,它非常大,但我已经通过了有问题的 block 并且 std::cout 附近没有任何东西

$ bin/profiler 50 
50 repetitions of Generate Config MLP took: 254 microseconds
50 repetitions of Create Population took: 5318 microseconds
50 repetitions of Create and Score Population took: 218047 microseconds

$ bin/profiler 50 > time_times
$ cat time_times
50 repetitions of Generate Config MLP took: 258 microseconds
50 repetitions of Create Population took: 5438 microseconds
50 repetitions of Create and Score Population took: 168379 microseconds

$ bin/profiler 50
50 repetitions of Generate Config MLP took: 269 microseconds
50 repetitions of Create Population took: 5447 microseconds
50 repetitions of Create and Score Population took: 216262 microseconds

$ bin/profiler 50 > time_times
$ cat time_times
50 repetitions of Generate Config MLP took: 260 microseconds
50 repetitions of Create Population took: 5321 microseconds
50 repetitions of Create and Score Population took: 169431 microseconds

这是我用来计时的 block ,函数 ptr 只是指向 void 函数的链接,它进行单个函数调用。我知道可能有更好的方法来计时,我想要快速而肮脏,所以我开始改进代码。

void timeAndDisplay(string name,function_ptr f_ptr) {

struct timeval start, end;
long mtime, seconds, useconds;

gettimeofday(&start, NULL);
// Run the code
for (unsigned x = 0; x < reps; x++) {
f_ptr();
}

gettimeofday(&end, NULL);
seconds = end.tv_sec - start.tv_sec;
useconds = end.tv_usec - start.tv_usec;
mtime = ((seconds) * 1000000 + useconds/1.0) + 0.0005;

std::cout << reps << " repetitions of " << name << " took: " << mtime << " microseconds" << std::endl;
}

我正在编译和链接:

g++ -c -Wall  -O3 -fopenmp -mfpmath=sse -march=native src/profiler.cpp -o build/profiler.o
g++ build/*.o -lprotobuf -lgomp -lboost_system -lboost_filesystem -o bin/profiler

我正要开始进行更改,所以我想我会保存一个基线,但是当我重定向它时,创建和评分人口的表现有所不同!

有人知道这是怎么回事吗?

更新 1:第一次通过分析没有显示任何重要信息。几乎所有排名靠前的调用都与程序运行的 vector 数学相关(Eigen 库)。流行的理论是控制台有一些阻塞 io,但对 std::cout 的调用在函数循环之外,总共只有 3 个,所以我很难接受它有这样的影响。

更新 2:在这让我发疯了一段时间之后,我放弃了一点并开始使用我可用的数据来改进我的程序。它变得更奇怪了,但我想我已经找到了一个主要的影响因素——可用的系统熵。我的程序使用了大量的随机数,并且在使用任何一种方法运行了一段时间后,它似乎运行速度较慢。我使用了一个 for 循环来模拟这两种方法,虽然它在重定向 stdout 的情况下更快,但我怀疑这一小块 IO 会稍微颠簸 urandom,这就是它更快的原因。我仍在调查中,但如果有人能指出正确的方向来证明这一点,我将不胜感激。

最佳答案

写入标准控制台输入/输出系统或从标准控制台输入/输出系统写入涉及缓冲区和锁。所以我会说,由于锁定缓冲区,您通常会受到性能影响。

我会推荐以下 Profiler找出什么花费的时间最长。

关于c++ - 为什么当我重定向 stdout 时我的程序运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20109546/

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