gpt4 book ai didi

c - 函数运行时的非线性行为

转载 作者:行者123 更新时间:2023-12-03 17:06:38 25 4
gpt4 key购买 nike

我有一个计算总和的函数,并根据总和的结果执行特定任务或给出警告消息。我需要在粒子轨迹模拟中运行此函数数百万次(它计算时间和位置相关力)并注意到我的代码非常慢。

这是我的 MWE:

#include <stdio.h>
#include <math.h>

int foo()
{
double sum =0;
double dummy_sum = 0;

for (size_t i=0; i<40; i++)
{
sum+=1e-2;
dummy_sum += 1e-2;
}

if (sum>5.) // normally this should not happen
{
printf("warning message!\n");
return(-1);
}
else if(sum >0)
{
// normal behavior
}

return(0);
}

int main()
{
int fooint;

for(size_t i=0; i<5e9; i++)
{
fooint = foo();
if(fooint!=0)
{
return(fooint);
}
}
return 0;
}

我使用 gcc 版本 4.8.5 使用 gcc -Ofast -std=c99 test.c -o test.exe 进行编译。

为了找到优化我的功能的方法,我运行了 time ./test.exe,它表明我的机器上的运行时间约为 38 秒。

当我删除线条时

        printf("warning message!\n");
return(-1);

或行

        sum+=1e-2; 

运行时间减少到大约 6 秒。

此外,当我将函数循环中的迭代次数更改为 35 时,速度提高了,运行时间为 6 秒。将它增加到 36 会得到 33 秒的运行时间。

我在具有相同 linux 和 gcc 版本的另一台机器上编译并运行了代码,得到了类似的结果(运行时间略长,因为机器较旧)。

什么可能导致这种奇怪的行为?

最佳答案

这不是什么奇怪的行为。如果你删除行 printfreturn(-1) 然后函数 foo 被编译器优化并且将只是 return (0); 里面的代码都不会执行,因为结果不会改变。如果您注释代码 sum+=1e-2;,也会发生同样的情况,编译器知道该函数唯一可能的结果是 return(0); sum 被初始化为 0 并且永远不会改变。

关于c - 函数运行时的非线性行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57223073/

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