阶乘函数的优化问题
int fact(int n)性能优化 C 阶乘
{
int i;
int result = 1;
for(i = n; i > 1; i--)
result = result * i;
return result;
}
int fact_u2(int n)
{
int i;
int result = 1;
for(i = n; i > 1; i -= 2)
result = (result * i) * (i - 1);
return result;
}
int fact_u3(int n)
{
int i;
int result = 1;
for(i = n; i > 1; i -= 2)
result = result * (i * (i - 1));
return result;
}
为什么fact_u2相对fact性能没有改进,而使用fact_u3性能改进?谢谢
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int fact(int n)
{
int i;
int result = 1;
for(i = n; i > 1; i--)
result = result * i;
return result;
}
int fact_u2(int n)
{
int i;
int result = 1;
for(i = n; i > 1; i -= 2)
result = (result * i) * (i - 1);
return result;
}
int fact_u3(int n)
{
int i;
int result = 1;
for(i = n; i > 1; i -= 2)
result = result * (i * (i - 1));
return result;
}
#define CALLTIMES 1000000000
int main()
{
clock_t start;
int i, value;
value = 12345678;
start = clock();
for( i = 0; i < CALLTIMES; ++ i)
{
value += value * fact(12);
}
start = clock()- start;
printf("value:%d\tfact:%f\n", value, (double)start / CLOCKS_PER_SEC);
value = 12345678;
start = clock();
for( i = 0; i < CALLTIMES; ++ i)
{
value += value * fact(12);
}
start = clock()- start;
printf("value:%d\tfact_u2:%f\n", value, (double)start / CLOCKS_PER_SEC);
value = 12345678;
start = clock();
for( i = 0; i < CALLTIMES; ++ i)
{
value += value * fact(12);
}
start = clock()- start;
printf("value:%d\tfact_u3:%f\n", value, (double)start / CLOCKS_PER_SEC);
printf("fact_u2:%x\tfact_u3:%x\n", &fact_u2,&fact_u3);
}
value:-292789938 fact:1.515000
value:-292789938 fact_u2:1.344000
value:-292789938 fact_u3:1.406000
fact_u2:401030 fact_u3:401030
value:-2147483648 fact:14.813000
value:-2147483648 fact_u2:15.234000
value:-2147483648 fact_u3:15.063000
fact_u2:4010a0 fact_u3:4010e0