C 如何改进功能?

C 如何改进功能?,c,optimization,gprof,C,Optimization,Gprof,我有一个程序,计算2到26的幂和结果数的根 程序的源代码包含在几个文件中,我使用makefile和-pg标志编译它。我通过gprof./main运行它,结果得到: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 51.95

我有一个程序,计算2到26的幂和结果数的根

程序的源代码包含在几个文件中,我使用makefile和
-pg
标志编译它。我通过
gprof./main运行它,结果得到:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 51.95      1.73     1.73       52     0.03     0.03  very_smart_add
 32.73      2.82     1.09 67108863     0.00     0.00  give_me_sum
 11.71      3.21     0.39       13     0.03     0.16  the_middle_of
  3.60      3.33     0.12       26     0.00     0.05  give_me_product
  0.00      3.33     0.00       13     0.00     0.13  the_middle_of2
  0.00      3.33     0.00        1     0.00     1.21  give_me_power
  0.00      3.33     0.00        1     0.00     2.12  square_root
我想提高最耗时的功能,但我不知道如何做到这一点。在这种情况下可以做什么

文件:

第1.c部分

long long give_me_product(long long a, long long b);

long long give_me_power(long long a, long long b)
{
    long long ret = 1;
    while (b--)
    {
        ret = give_me_product(a, ret);
    }
    return ret;
}
long long give_me_sum(long long a, long long b);

long long give_me_product(long long a, long long b)
{
    long long ret = 0;
    while (b--)
    {
        ret = give_me_sum(a, ret);
    }
    return ret;
}
long long give_me_sum(long long a, long long b)
{
    long long ret = 0;
    while (a--)
    {
        ret++;
    }
    return ret + b;
    while (b--)
    {
        ret++;
    }
    return ret;
}
#define EPS 0.0000000001
#define STEP 1.0

/* This function adds two numbers. */
double very_smart_add(double a, double b)
{
    while (b >= STEP)
    {
        a += STEP;
        b -= STEP;
    }
    a += b;
    return a;
}

double the_middle_of2(double a, double b)
{
    double l = a, r = b;
    double check, m;
    while (1)
    {
        m = very_smart_add(l, r)/2;
        check = very_smart_add(m, m);
        if (check > very_smart_add(a, b) + EPS)
            r = m;
        else if (check < very_smart_add(a, b) - EPS)
            l = m;
        else
            return m;
    }
}
double the_middle_of(double a, double b)
{
    double r = 0;
    double s = a + b;
    while (r + r < s)
    {
        r += 1.0;
    }
    return the_middle_of2(r - 1.0, s - (r - 1.0));
}

double square_root(double x)
{
    double l = 0, r = x;
    double check, m;
    while (1)
    {
        m = the_middle_of(l, r);
        check = m * m;
        if (check > x + EPS)
            r = m;
        else if (check < x - EPS)
            l = m;
        else
            return m;
    }
}
第2.c部分

long long give_me_product(long long a, long long b);

long long give_me_power(long long a, long long b)
{
    long long ret = 1;
    while (b--)
    {
        ret = give_me_product(a, ret);
    }
    return ret;
}
long long give_me_sum(long long a, long long b);

long long give_me_product(long long a, long long b)
{
    long long ret = 0;
    while (b--)
    {
        ret = give_me_sum(a, ret);
    }
    return ret;
}
long long give_me_sum(long long a, long long b)
{
    long long ret = 0;
    while (a--)
    {
        ret++;
    }
    return ret + b;
    while (b--)
    {
        ret++;
    }
    return ret;
}
#define EPS 0.0000000001
#define STEP 1.0

/* This function adds two numbers. */
double very_smart_add(double a, double b)
{
    while (b >= STEP)
    {
        a += STEP;
        b -= STEP;
    }
    a += b;
    return a;
}

double the_middle_of2(double a, double b)
{
    double l = a, r = b;
    double check, m;
    while (1)
    {
        m = very_smart_add(l, r)/2;
        check = very_smart_add(m, m);
        if (check > very_smart_add(a, b) + EPS)
            r = m;
        else if (check < very_smart_add(a, b) - EPS)
            l = m;
        else
            return m;
    }
}
double the_middle_of(double a, double b)
{
    double r = 0;
    double s = a + b;
    while (r + r < s)
    {
        r += 1.0;
    }
    return the_middle_of2(r - 1.0, s - (r - 1.0));
}

double square_root(double x)
{
    double l = 0, r = x;
    double check, m;
    while (1)
    {
        m = the_middle_of(l, r);
        check = m * m;
        if (check > x + EPS)
            r = m;
        else if (check < x - EPS)
            l = m;
        else
            return m;
    }
}
第3.c部分

long long give_me_product(long long a, long long b);

long long give_me_power(long long a, long long b)
{
    long long ret = 1;
    while (b--)
    {
        ret = give_me_product(a, ret);
    }
    return ret;
}
long long give_me_sum(long long a, long long b);

long long give_me_product(long long a, long long b)
{
    long long ret = 0;
    while (b--)
    {
        ret = give_me_sum(a, ret);
    }
    return ret;
}
long long give_me_sum(long long a, long long b)
{
    long long ret = 0;
    while (a--)
    {
        ret++;
    }
    return ret + b;
    while (b--)
    {
        ret++;
    }
    return ret;
}
#define EPS 0.0000000001
#define STEP 1.0

/* This function adds two numbers. */
double very_smart_add(double a, double b)
{
    while (b >= STEP)
    {
        a += STEP;
        b -= STEP;
    }
    a += b;
    return a;
}

double the_middle_of2(double a, double b)
{
    double l = a, r = b;
    double check, m;
    while (1)
    {
        m = very_smart_add(l, r)/2;
        check = very_smart_add(m, m);
        if (check > very_smart_add(a, b) + EPS)
            r = m;
        else if (check < very_smart_add(a, b) - EPS)
            l = m;
        else
            return m;
    }
}
double the_middle_of(double a, double b)
{
    double r = 0;
    double s = a + b;
    while (r + r < s)
    {
        r += 1.0;
    }
    return the_middle_of2(r - 1.0, s - (r - 1.0));
}

double square_root(double x)
{
    double l = 0, r = x;
    double check, m;
    while (1)
    {
        m = the_middle_of(l, r);
        check = m * m;
        if (check > x + EPS)
            r = m;
        else if (check < x - EPS)
            l = m;
        else
            return m;
    }
}
sqrt.c

long long give_me_product(long long a, long long b);

long long give_me_power(long long a, long long b)
{
    long long ret = 1;
    while (b--)
    {
        ret = give_me_product(a, ret);
    }
    return ret;
}
long long give_me_sum(long long a, long long b);

long long give_me_product(long long a, long long b)
{
    long long ret = 0;
    while (b--)
    {
        ret = give_me_sum(a, ret);
    }
    return ret;
}
long long give_me_sum(long long a, long long b)
{
    long long ret = 0;
    while (a--)
    {
        ret++;
    }
    return ret + b;
    while (b--)
    {
        ret++;
    }
    return ret;
}
#define EPS 0.0000000001
#define STEP 1.0

/* This function adds two numbers. */
double very_smart_add(double a, double b)
{
    while (b >= STEP)
    {
        a += STEP;
        b -= STEP;
    }
    a += b;
    return a;
}

double the_middle_of2(double a, double b)
{
    double l = a, r = b;
    double check, m;
    while (1)
    {
        m = very_smart_add(l, r)/2;
        check = very_smart_add(m, m);
        if (check > very_smart_add(a, b) + EPS)
            r = m;
        else if (check < very_smart_add(a, b) - EPS)
            l = m;
        else
            return m;
    }
}
double the_middle_of(double a, double b)
{
    double r = 0;
    double s = a + b;
    while (r + r < s)
    {
        r += 1.0;
    }
    return the_middle_of2(r - 1.0, s - (r - 1.0));
}

double square_root(double x)
{
    double l = 0, r = x;
    double check, m;
    while (1)
    {
        m = the_middle_of(l, r);
        check = m * m;
        if (check > x + EPS)
            r = m;
        else if (check < x - EPS)
            l = m;
        else
            return m;
    }
}
#定义每股收益0.0000000001
#定义步骤1.0
/*此函数用于添加两个数字*/
双倍非常智能添加(双倍a,双倍b)
{
while(b>=步)
{
a+=阶跃;
b-=阶跃;
}
a+=b;
返回a;
}
双倍于2的中间(双倍a,双倍b)
{
双l=a,r=b;
重复检查,m;
而(1)
{
m=非常聪明的加(l,r)/2;
检查=非常智能添加(m,m);
如果(检查>非常聪明添加(a,b)+EPS)
r=m;
否则如果(检查x+EPS)
r=m;
否则如果(检查
看起来像是一个家庭作业,但我将提供一个简化加法的方法-消除不必要的while循环,并可能检测溢出

将此移动到社区wiki

long long give_me_sum(long long a, long long b) {
  #if NEED_TO_PREVENT_UNDEFINED_BEHAVIOR
  if (a >= 0) {
    if (b > LLONG_MAX - a) return LLONG_MAX;
  } else {
    if (b < LLONG_MIN - a) return LLONG_MIN;
  }
  #endif
  return a + b;
}
long long give_me_sum(long long a,long long b){
#如果需要防止未定义的行为
如果(a>=0){
如果(b>LLONG_MAX-a)返回LLONG_MAX;
}否则{
如果(b
给我力量
功能为O(n)。您可以将其优化为O(logn)


TL/DR,但是
sqrt(2^26)=2您的个人资料说
very_-smart\u-add
是时间汇,所以我会从这里开始,也许会解释它的聪明之处。此外,
very_-smart\u-add()
不是很聪明。@krzyhub这是这个案例的改进:
return 8192.2^13=8192,而2