"写高效率程序需要的知识"
对使用硬件设备特性的知识
对数据类型、运算符和混合运算的了解
对编译环境的使用
CPU执行程序原理
编译原理的相关知识
编译环境反汇编
对所求问题的具体分析
数据结构
算法
程序效率测定的方法(High-Resolution Timer)
编程风格
/*
"不要认为 CPU 运算速度快就把所有的问题都推给它去做,程序
设计师应该将代码优化再优化,我们自己能做的决不要让CPU做
,因为 CPU 是为用户服务的,不是为我们程序设计师服务的!"
"空间换时间的算法"
*/
/*
写一个函数计算当参数为 n(n很大) 时的值 1-2+3-4+5-6+7......+n
*/
#include<windows.h>
#include<conio.h>
#include<stdio.h>
//
int fun1(int); //大量使用了乘法,效率低
int fun2(int); //减少了乘法的使用,效率稍高
int fun3(int); //效率最高
int fun4(int); //我的算法1,也使用了乘法
int fun5(int); //我的算法2
//
//
void main()
{
float f = 5.1f;
double d = 5.1;
int ii = 5555;
int n=100000;
LARGE_INTEGER li1,li2;
LARGE_INTEGER liF;
QueryPerformanceFrequency(&liF);
printf("本机Frequency %I64d/n",(&liF)->QuadPart);
QueryPerformanceCounter(&li1);
f+=4.2;
QueryPerformanceCounter(&li2);
printf("f+=4.2: %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);
QueryPerformanceCounter(&li1);
d+=4.2;
QueryPerformanceCounter(&li2);
printf("d+=4.2: %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);
QueryPerformanceCounter(&li1);
ii/=22;
QueryPerformanceCounter(&li2);
printf("ii/=22: %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);
QueryPerformanceCounter(&li1);
ii%=23;
QueryPerformanceCounter(&li2);
printf("iimod=33: %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);
QueryPerformanceCounter(&li1);
fun1(n);
QueryPerformanceCounter(&li2);
printf("fun1(n): %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);
QueryPerformanceCounter(&li1);
fun2(n);
QueryPerformanceCounter(&li2);
printf("fun2(n): %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);
QueryPerformanceCounter(&li1);
fun3(n);
QueryPerformanceCounter(&li2);
printf("fun3(n): %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);
QueryPerformanceCounter(&li1);
fun4(n);
QueryPerformanceCounter(&li2);
printf("fun4(n): %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);
QueryPerformanceCounter(&li1);
fun5(n);
QueryPerformanceCounter(&li2);
printf("fun5(n): %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);
getch();
}
int fun1(int n)
{
long temp=0;
int i,flag=1;
if(n<=0)
{
printf("error: n must > 0");//常数中不能有换行符
exit(1);
}
for(i=1;i<=n;i++)
{
temp=temp+flag*i;
flag=(-1)*flag;
}
return temp;
}
int fun2(int n)
{
long temp=0;
int j=1,i=1,flag=1;
if(n<=0)
{
printf("error: n must > 0");
exit(1);
}
while(j<=n)
{
temp=temp+i;
i=-i;
i>0?i++:i--;
j++;
}
return temp;
}
/*
1-2+3-4+5-6+7......+n
---------------------
--首先看清楚序列规律,看结果和n有什么直接关系
if n是偶数 结果为(-1)*n/2
if n是奇数 结果为(-1)*n/2
*/
int fun3(int n)
{
if(n<=0)
{
printf("error: n must > 0");
exit(1);
}
if(0==n%2)
return (n/2)*(-1);
else
return (n/2)*(-1)+n;
}
int fun4(int n)
{
if(n<=0)
{
printf("error: n must > 0");
exit(1);
}
int sum=0;
int flag=1;
for(int i=1;i<n;i++)
{
flag = (i%2)?1:-1;
sum+=flag*i;
}
return sum;
}
int fun5(int n)
{
if(n<=0)
{
printf("error: n must > 0");
exit(1);
}
int sum=0;
int t;
for(int i=1;i<n;i++)
{
(i%2)?(t=i):(t=-i);
sum+=t;
}
return sum;
}
/*
结论:
尽量使用加减代替乘除
尽量寻找问题规律,减少程序运算
使用实数的地方尽量使用double
*/
结果:

本文探讨了编写高效程序所需的知识,包括理解硬件特性、掌握数据类型和运算符、熟悉编译环境,以及CPU执行原理。同时,文章深入讨论了数据结构、算法在提升程序效率中的作用,并介绍了利用High-Resolution Timer进行程序效率测定的方法。

被折叠的 条评论
为什么被折叠?



