gpt4 book ai didi

c - 具有不同运行时间的几乎相同的代码 - 为什么?

转载 作者:太空狗 更新时间:2023-10-29 14:50:54 24 4
gpt4 key购买 nike

我正在测试两个几乎相同的代码,其中一个 for 循环有细微差别。第一个使用三个循环迭代索引 y,z,x 而第二个循环迭代 x, z,y.

我的问题是为什么用户时间和挂钟时间不同?是因为一个代码和另一个代码中的内存位置吗?

test_1.c:

#define N 1000

// Matrix definition
long long int A[N][N],B[N][N],R[N][N];

int main()
{
int x,y,z;
char str[100];

/*Matrix initialization*/
for(y=0;y<N;y++)
for(x=0;x<N;x++)
{
A[y][x]=x;
B[y][x]=y;
R[y][x]=0;
}
/*Matrix multiplication*/
for(y=0;y<N;y++)
for(z=0;z<N;z++)
for(x=0;x<N;x++)
{
R[y][x]+= A[y][z] * B[z][x];
}
exit(0);
}

第二个代码 (test_2.c) 的区别在于最后一个 for 循环:

for(x=0;x<N;x++)
for(z=0;z<N;z++)
for(y=0;y<N;y++)
{
R[y][x]+= A[y][z] * B[z][x];
}

如果我打印/user/bin/time -v ./test_1 我得到以下统计数据:

Command being timed: "./test_1"
User time (seconds): 5.19
System time (seconds): 0.01
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.22

虽然/user/bin/time -v ./test_2 给出以下统计数据:

Command being timed: "./test_2"
User time (seconds): 7.75
System time (seconds): 0.00
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:07.76

最佳答案

基本上,您正在以不同的模式访问内存 - 您的第一种方法对内存缓存更友好,因为您正在访问同一区域的大量数据,然后继续访问下一 block 内存等

如果您想要一个真实世界的类比,假设您要将传单分发到 10 条不同的道路 (A-J),每条道路的门牌号为 1-10。您可以交付 A1、A2、A3...A10、B1、B2、B3...B10 等...或者您可以交付 A1、B1、C1...J1、A2、B2、C2...等。显然,第一种方法会更有效率。这就像在计算机内存中一样 - 访问最近访问过的内存“附近”的内存比跳来跳去更有效。

关于c - 具有不同运行时间的几乎相同的代码 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40107153/

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