提高软件执行效率的几条原则
2014-02-12 23:37
197 查看
似乎有很多朋友对于我说的“避免使用WITH语句”持反对意见。理由是With语句可以提高执行效率。
的确With是可以稍微提高一些执行效率,但是这是以破坏代码可读性的代价来换取的,尤其是多个WITH语句嵌套在一起的时候。
其实,如何提高执行效率主要还是在你所写下的代码里。以下是我总结的几条提高执行效率的例子,请大家指正:
一、尽量避免使用重复的语句块:
我们来看一段代码:
//假设已经有var的声明: Loop, LoopChild: Word;
//ArrayA, ArrayB: array[0..100] of Char;
//Value: Char;
for Loop := 0 to 100 do
ArrayA[Loop]:= ArrayB[Loop];
for Loop := 0 to 100 do
begin
Value:= ArrayA[Loop];
for LoopChild := 0 to 100 do
...
end;
其实这个就是重复的语句块的执行了,上面的代码我们可以写成:
CopyMemory(@ArrayA[0], @ArrayB[0], SizeOf(ArrayA));
for Loop := 0 to 100 do
begin
Value:= ArrayA[Loop];
for LoopChild := 0 to 100 do
...
end;
二、尽量不要使用 i:= i + x;这样的语句
在DELPHI里高效率的替代语句是Inc(i, x);等同于C中的i += x;
三、尽可能的减少运算次数
如复制字符串的右边部分:s:= Copy(Text, 3, Length(Text) - 2);
我们可以替代成:s:= Copy(Text, 3, MaxInt);
因为不管你传进去的拷贝长度是否越界,COPY函数内部都会做一次检查,反正都是要检查的,干脆用长一点不是很好吗,而且LENGTH()这里多调用了一次函数判断字符串的长度。
四、不使用if Flag = True then 这样的语句
原因很简单,因为FLAG本来就是BOOLEAN类型的变量,完全没有必要提取他的值来和True比较,直接写成
if Flag then 可以有效的减少执行时间;
同理:
if Value = 0 then
Result:= True
else
Result:= False;
这样的语句也可以直接写成: Result:= Value = 0;
五、尽量减少子程序间的嵌套调用
其实这和提高可读性是矛盾的,过多的在子程序内部嵌套调用其他子程序是会影响执行效率的;
(所谓嵌套调用就是,比如有10个函数a1, a2, a3, a4, a5, a6, a7, a8, a9, a10; 那么在a1中调用a2,在a2中调用a3...这就叫嵌套调用)
至于怎么和可读性去协调,那么就要看实际情况了,不过我还是推荐以注意可读性为优先
六、尽可能使用整数运算来替代浮点运算
比如 Trunc(a / b) 如果可能的话,优先选择写成 a div b比较好(前提a, b都是整数)
七、循环次数多的循环尽可能的放在循环嵌套的内部
如:for i := 0 to 100 do
for j := 0 to 5 do
...
应该尽量写成:
for j := 0 to 5 do
for i := 0 to 100 do
...
因为每次循环前都需要对循环变量进行初始化操作,把循环次数多的循环放在内循环可以有效的减少这个操作,从而提高执行效率。
另外,大数据量的分页显示;直接的内存操作等等都可以有效的提高软件的执行效率……
以上是我暂时所能想到的了,呵!或许还有没有想到的,希望大家补充,也欢迎大家批评错误,谢谢!
本文已阅读 4607 次
来自: CnPack 开源软件项目
的确With是可以稍微提高一些执行效率,但是这是以破坏代码可读性的代价来换取的,尤其是多个WITH语句嵌套在一起的时候。
其实,如何提高执行效率主要还是在你所写下的代码里。以下是我总结的几条提高执行效率的例子,请大家指正:
一、尽量避免使用重复的语句块:
我们来看一段代码:
//假设已经有var的声明: Loop, LoopChild: Word;
//ArrayA, ArrayB: array[0..100] of Char;
//Value: Char;
for Loop := 0 to 100 do
ArrayA[Loop]:= ArrayB[Loop];
for Loop := 0 to 100 do
begin
Value:= ArrayA[Loop];
for LoopChild := 0 to 100 do
...
end;
其实这个就是重复的语句块的执行了,上面的代码我们可以写成:
CopyMemory(@ArrayA[0], @ArrayB[0], SizeOf(ArrayA));
for Loop := 0 to 100 do
begin
Value:= ArrayA[Loop];
for LoopChild := 0 to 100 do
...
end;
二、尽量不要使用 i:= i + x;这样的语句
在DELPHI里高效率的替代语句是Inc(i, x);等同于C中的i += x;
三、尽可能的减少运算次数
如复制字符串的右边部分:s:= Copy(Text, 3, Length(Text) - 2);
我们可以替代成:s:= Copy(Text, 3, MaxInt);
因为不管你传进去的拷贝长度是否越界,COPY函数内部都会做一次检查,反正都是要检查的,干脆用长一点不是很好吗,而且LENGTH()这里多调用了一次函数判断字符串的长度。
四、不使用if Flag = True then 这样的语句
原因很简单,因为FLAG本来就是BOOLEAN类型的变量,完全没有必要提取他的值来和True比较,直接写成
if Flag then 可以有效的减少执行时间;
同理:
if Value = 0 then
Result:= True
else
Result:= False;
这样的语句也可以直接写成: Result:= Value = 0;
五、尽量减少子程序间的嵌套调用
其实这和提高可读性是矛盾的,过多的在子程序内部嵌套调用其他子程序是会影响执行效率的;
(所谓嵌套调用就是,比如有10个函数a1, a2, a3, a4, a5, a6, a7, a8, a9, a10; 那么在a1中调用a2,在a2中调用a3...这就叫嵌套调用)
至于怎么和可读性去协调,那么就要看实际情况了,不过我还是推荐以注意可读性为优先
六、尽可能使用整数运算来替代浮点运算
比如 Trunc(a / b) 如果可能的话,优先选择写成 a div b比较好(前提a, b都是整数)
七、循环次数多的循环尽可能的放在循环嵌套的内部
如:for i := 0 to 100 do
for j := 0 to 5 do
...
应该尽量写成:
for j := 0 to 5 do
for i := 0 to 100 do
...
因为每次循环前都需要对循环变量进行初始化操作,把循环次数多的循环放在内循环可以有效的减少这个操作,从而提高执行效率。
另外,大数据量的分页显示;直接的内存操作等等都可以有效的提高软件的执行效率……
以上是我暂时所能想到的了,呵!或许还有没有想到的,希望大家补充,也欢迎大家批评错误,谢谢!
本文已阅读 4607 次
来自: CnPack 开源软件项目
相关文章推荐
- ABAP程序编写过程中怎么提高程序执行效率二
- 做好发散测试,提高软件测试效率(转)
- 对提高ASP执行效率的几点看法
- 技巧:快速提高 Vi/Vim 使用效率的原则与途径
- paip.提高工作效率--数据绑定到table原则和过程Angular js jquery实现
- 解析提高PHP执行效率的50个技巧
- 快速提高 Vi/Vim 使用效率的原则与途径
- 提高SQL执行效率的16种方法
- 用JavaScript压缩工具来减少Script文件的大小和提高执行效率
- 解析提高PHP执行效率的50个技巧
- 提高网页执行效率
- 程序员提高效率的辅助开发软件神器汇总
- 良好的书写规范提高PHP代码执行效率【上】
- 良好的书写规范提高PHP代码执行效率
- 关于优化内存 提高软件运行效率的 写的真的很不错
- 调试程序心得-2(提高程序执行效率)
- 如何提高PHP执行效率
- 18个提高效率的办公软件推荐,收好不谢
- 这几条UI原则可以让你的设计提高(下)
- 巧用头脑思考,提高软件运行效率-浅谈程序算法