gpt4 book ai didi

c++ - 为什么写入文件会大大增加缓存未命中和分支未命中?

转载 作者:太空狗 更新时间:2023-10-29 20:54:35 25 4
gpt4 key购买 nike

以下是我正在分析的代码:

#include <iostream>
#include <fstream>

#define N 10000

using namespace std;

int main()
{
ofstream fout;
fout.open("log.txt");

int A[N], B[N], C[N];

for(int i=0; i<N; i++)
{
A[i] = B[i] = i;
}

int sum = 0;

for(int j=0; j<N; j++)
{
C[j] = A[j]+B[j];
//fout<<C[j]<<endl;
sum += C[j];
sum %= 103;
}

cout<<sum<<endl;

return 0;
}

以下是分析命令:

perf stat -e instructions:u -e instructions:k -e cache-misses -e page-faults -e branch-misses ./test

输出是:

Performance counter stats for './test':

15,60,186 instructions:u
8,35,753 instructions:k
24,345 cache-misses
123 page-faults
13,051 branch-misses

0.001327182 seconds time elapsed

但是,当我取消注释那条注释行时,我得到以下输出:

Performance counter stats for './test':

75,72,868 instructions:u
12,29,31,625 instructions:k
2,18,333 cache-misses
121 page-faults
73,662 branch-misses

0.525844017 seconds time elapsed

我无法理解是什么原因导致缓存未命中率大幅增加以及分支未命中率适度增加。任何见解将不胜感激!

最佳答案

如果没有“fout<<C[j]<<endl;”行,您的程序主要在用户空间中运行(我宁愿说,您程序的重要部分完全在用户空间中运行)。通过取消对该行(在循环内)的注释,您引入了许多额外的系统调用(这由分析器报告的 instructions:k 数量的大幅增加表明)。系统调用非常昂贵,因为它们涉及上下文切换,这取决于硬件架构和操作系统,可能会使 CPU 缓存的明显部分无效。

注意这里的罪魁祸首是endl (强制刷新缓冲区,从而触发系统调用)。将其替换为 '\n'并且对性能的影响应该小得多。

关于c++ - 为什么写入文件会大大增加缓存未命中和分支未命中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38686730/

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