为什么我的程序的这个简单部分使我打了两个多小时
Why does this simple part of my program makes me struck for more than two hours?
我粘贴了下面程序的一部分,为什么要花大量时间进行执行?
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(j<i) {
pot[i]+=-(x[i]-x[j])*1./pow((pow(x[i]-x[j],2.)+ blah blah,1.5);
}
if(j>i) {
pot[i]+=(x[i]-x[j])*1./pow((pow(x[i]-x[j],2.)+blah blah,1.5);
}
}
}
如果我将任何一个1.5作为1.4进行,则需要将近两个小时的运行时间。
以下一个工作非常好
for(i=0;i<N;i++)
{
pot[i]=0.0;
for(j=0;j<N;j++)
{
if(j<i)
{
pot[i]+=-1.*(x[i]-x[j])/pow(pow(x[i]-x[j],3.)+blah blah,1.);
}
if(j>i)
{
pot[i]+=1.*(x[i]-x[j])/pow(pow(x[i]-x[j],1.)+blah blah,3.);
}
}
}
/*我非常需要程序中的前一个,而不是以后*/
以上是此块的一部分
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(j<i)
{
pot[i]+=-(x[i]-x[j])*1./pow(fabs(pow(x[i]-x[j],2.)+ g*g*pow(x[i+N]-x[j+N],2.)+ h*h*pow(x[i+2*N]-x[j+2*N],2.)),1.5) ;
}
if(j>i)
{
pot[i]+=(x[i]-x[j])*1./pow(fabs(pow(x[i]-x[j],2.) + g*g*pow(x[i+N]-x[j+N],2.) + h*h*pow(x[i+2*N]-x[j+2*N],2.)),1.5) ;
}
}
}
好吧,如果N
为1000,它将执行pow
200万次。在这种情况下,pow
执行log
,然后进行乘法,然后进行exp
。这是沉重的代码。
我只想指出,如果您想知道,编译器优化对此代码没有帮助,因为该程序计数器几乎将其所有时间花在log
和exp
中。
另外,正如@Amon指出的那样,您可以摆脱一个pow
呼叫,给出两个速度。
在其上,您将生成2 n ** 2调用pow()。POW()很昂贵,涉及每个呼叫的log()和exp()的呼叫。对于n = 1000,也就是说,正如另一个人所观察到的那样,log()和exp()的呼叫。
。log()和exp()本身很昂贵,是浮点功率系列扩展。
您的编译器可能知道数字。正方形。这将使您的第二个示例中的运行时间大大减少。
dijkstra曾经观察到(在一个研究生的招聘演讲中),练习的目的是"不要弄乱它"。观察POW(x,2)== x * x and pow(x,1.5)== x * sqrt(x),您可以通过定义两个(inline)函数并重写两个(inline)函数来摆脱很多先验的数字呼叫关键线为:
pot[i]+=(x[i]-x[j])*1./xsqrtx(square(x[i]-x[j])+blahblah);
另外,如果您实际上在C/C 中进行此操作,则可能值得缓存点差。
delta = x(i]-x[j];
pot[i]+=(delta)*1./xsqrtx(square(delta)+blahblah);
c/c 不允许假设x在您不在时没有更改,并进行了这种特殊的常见亚表达优化。(fortran曾经是并且确实如此。)
最后,您知道您可以分配浮点数吗?
delta = x(i]-x[j];
pot[i]+=(delta)/(xsqrtx(square(delta)+blahblah));
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- 如何在C++中比较两个char数组
- 给定两个偶数,求出它们之间所有偶数的平方和
- 比较两个大小不等的映射c++
- 为什么我的程序的这个简单部分使我打了两个多小时
- 返回的C 时间为两个小时
- 两个时间之间经过的时间,格式为24小时hh:mm:ss
- 如何比较两个小时并说哪个更晚或更早