如何优化我的程序

How can I optimize my program?

本文关键字:我的 程序 优化 何优化      更新时间:2023-10-16

我编写了实现这个公式的程序:

Pi=1/n*summ(4/(1+(i-0.5)/n)^2)

程序代码:

#include <iostream>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
using namespace std;
const long double PI = double(M_PI);
int main(int argc, char* argv[])
{
    typedef struct timeval tm;
    tm start, end;
    int  timer = 0;
    int n;
    if (argc == 2) n = atoi(argv[1]);
    else n = 8000;
    long double pi1 = 0;
    gettimeofday ( &start, NULL );
    for(int i = 1; i <= n; i++) {
        pi1 += 4 / ( 1 + (i-0.5) * (i-0.5) / (n*n) );
    }
    pi1/=n;
    gettimeofday ( &end, NULL );
    timer = ( end.tv_usec - start.tv_usec ); 
    long double delta = pi1 - PI;
    printf("pi = %.12Lfn",pi1);
    printf("delta = %.12Lfn", delta);
    cout << "time = " << timer << endl;
    return 0;
}

如何以最佳方式呈现?这部分中的浮点运算何时会减少:

for(int i = 1; i <= n; i++) {
            pi1 += 4 / ( 1 + (i-0.5) * (i-0.5) / (n*n) );
        }

感谢

一个想法是:

double nn = n*n;
for(double i = 0.5; i < n; i += 1) {
    pi1 += 4 / ( 1 + i * i / nn );
}

但您需要测试它与当前代码是否有任何差异。

我建议您阅读这份优秀的文档:

AMD64处理器软件优化指南

当你没有AMD处理器时,这也很好。

但如果我是你,我会用代替整个计算循环

pi1 = M_PI;

哪一个可能是最快的。。。如果你真的对Pi计算的更快算法感兴趣,请查看维基百科文章:类别:Pi算法

如果你只是想微优化你的代码,请阅读上面提到的软件优化指南。

简单优化示例:

  • for循环外计算double one_per_n = 1/n;,减少每次迭代除以n的成本
  • 循环内计算double j = (i-0.5) * one_per_n
  • pi1 += 4 / (1 + j*j);

这应该更快,也可以避免n的较大值出现整数溢出。对于更优化的代码,您必须查看生成的代码,并使用探查器进行适当的更改。以这种方式优化的代码在具有不同CPU或缓存的机器上可能表现不同。。。。为了节省计算时间,避免除法总是很好的。

#include <iostream>
#include <cmath>
#include <chrono>
#ifndef M_PI //M_PI is non standard make you sure catch this case
    #define M_PI 3.14159265358979323846
#endif
typdef long double float_t;
const float_t PI = double(M_PI);
int main(int argc, char* argv[])
{
    int n = argc == 2 ? atoi(argv[1]) : 8000;
    float_t pi1=0.0;
    //if you can using auto here is a no brainer
    std::chrono::time_point start   
          =std::chrono::system_clock::now();
    unsigned n2=n*n;
    for(unsigned i = 1; i <= n; i++) 
    {
        pi1 += 4.0 / ( 1.0 + (i-0.5) * (i-0.5) / n2 );
    }
    pi1/=n;
    std::chrono::duration<double> time
         =std::chrono::system_clock::now()-start;
    float_t delta = pi1 - PI;
    std::cout << "pi = " << std::setprecision(12) << pi1
              << "delta = " << std::setprecision(12) << delta
              << "ntime = " << time.count() << std::endl;
    return 0;
}
相关文章: