如何加速此循环(在C中)?
unsigned int x = 50000000;
double a= 0.9;
double b= -0.9;
for ( unsigned int i = 1; i <= x; i++)
{
a *= 0.9; //power
b -= a/i;
}
执行时间:14.000秒
我不知道为什么,但是当我在代码中添加这两行时,执行时间只有1.000秒。
unsigned int x = 50000000;
double a= 0.9;
double b= -0.9;
for ( unsigned int i = 1; i <= x; i++)
{
a *= 0.9; //power
a += 10e250;
a -=10e250;
b -= a/i;
}
感谢您的帮助
答案 0 :(得分:6)
首先,代码运行速度低于预期的最可能原因是a变为非规范化数字。非规范化数字是一个特殊情况,可能会运行很多,速度慢很多。也可以通过添加10 ^ 251并再次减去它来将a更改为0并将零除以任何更快(因为结果不需要计算)。
但真正的加速来自不是愚蠢地添加微小的,没有任何影响的数字。当x =几百时,a将是如此之小以至于从b中减去a / i将不会产生任何差异。所以代替b - = a / i;你写的
<ribbon:RibbonMenuButton ToolTip="Interaction" LargeImageSource="Images/measures.png" Style="{x:Null}">
<ribbon:RibbonMenuItem Header="Manip 3D" IsCheckable="True" IsChecked="{Binding ...}" />
<ribbon:RibbonMenuItem Header="Points" IsCheckable="True" IsChecked="{Binding ...}" />
<ribbon:RibbonMenuItem Header="Distances" IsCheckable="True" IsChecked="{Binding ...}" />
</ribbon:RibbonMenuButton>
你的时间会从秒变为不到一毫秒。
答案 1 :(得分:0)
添加10e250它超出了双变量可以支持的数字限制,当减去它时总是变为0.不确定这个但是乘法应该比加法花费更多的时间,所以它减慢了速度,例如。如果你试试这个:
for ( unsigned int i = 1; i <= x; i++)
{
a ++; //power
b -= a/i;
}
你会看到它会像第二次一样运行。我想当你添加10e250并且在a = 0之后;乘以0比使用其他非零变量快。