逻辑表达式效率和优化问题(100分)

  • 主题发起人 主题发起人 FreeAndNil
  • 开始时间 开始时间
F

FreeAndNil

Unregistered / Unconfirmed
GUEST, unregistred user!
两个表达式:
if (b and (P = ' ')) or ((not b) and (P <> ' ')) or (P = #0) then

if (not (b xor (P <> ' '))) or (P = #0) then
结果一样,效率哪个高?

顺便问一下,有朋友说,逻辑表达式不需要自己优化,编译器就可以优化了,真的吗?
 
写个测试程序,跑它10W次,算出时长短就知道了。
 
这种优化有必要么?
有心思优化这个不如优化你的程序设计
这种代码优化和不优化运行数十万次也就是几秒的差异
回头再说
if (not (b xor (P <> ' '))) or (P = #0) then

if (not (b xor (' '<> P))) or (#0 = P) then
哪个效率高?答案是后者 但是在这个层面上优化性能没有意义!
 
可能是我有点精益求精,因为我在写一个字符串操作的函数中,发现,多一个char类型变量的比较,效率相差5%,而
if (b and (P = ' ')) or ((not b) and (P <> ' ')) or (P = #0) then

if (not (b xor (P <> ' '))) or (P = #0) then
相差了不止一个比较,对于频繁、大数据量的操作,效率影响还是比较显著的,从表达式上看,是差了几次运算,但是,and、not、=、<>和xor,运行效率应该不能等同,我是想从汇编代码执行的角度看,哪个效率更好。

程序设计要优化,局部算法也要优化,精益求精不能说是没有意义,而且,把别人贬的没有意义也不能提高你自身的品质。
 
最优化执行仍然是我们追求的目标,虽然在做项目过程中我们由于项目周期短面没有多作时间去考虑,但是做研究是很有必要
 
1、首先应该把简单操作 P = #0 放在前面,因为一旦编译器发现它为真,会立即终止 or 后面的复杂运算;
2、另外既然有“异或”运算符,何必脱裤子放屁把它展开,难道编译器展开“异或”会比你自己展开“异或”慢??
3、not 的优先级比 or 高,所以 not 外面不必加括号,谢谢!
if (P = #0) or not (b xor (P <> ' ')) then
 
1、P = #0放在最后是因为这个条件只会在整个运算过程出现一次,而且是在最后,如果放在前面,反而效率低。
2、展开是因为一开始写的时候是考虑如何实现,写完了想优化才发现可以写成xor
3、加括号是为了阅读方便,而且,加括号不影响运行效率。
 
To FreeAndNil:
1、您的具体程序我不知道,我说的是一般情况,至于您说的“只会在整个运算过程出现一”我无法预知,因为我不是神仙...
2、写成 xor 比自己展开要简洁,效率只会高不会低(xor 也是汇编指令之一),这是我的建议;
3、确实不影响效率,但您加了括号使我阅读不太方便...
 
呵呵,回复:
1、这个表达式很明显是字符串处理,#0更说明了这点
2、再次申明,并非刻意展开,只是在构思算法时,按处理条件写表达式,写完后再想优化。
3、习惯不同,我喜欢把优先级用括号明示,而不喜欢在读代码时用优先级去判断哪个优先执行。
 
行了行了,都差不多了,结贴吧,顺便分我一点,[:)]
 
To FreeAndNil:
不是说不该精益,而是重点力量放在哪里的问题。优化有很多的层面
从减少网络访问 到减少硬盘访问 到降低算法的时间复杂度 最后才是去研究在寄存器和内存读写上的优化。假设你的代码要执行100w次 每次节省0.1微秒,一共节省了多少时间?
而你如果能减少一个远程连接,时间就省下来了。
再退一步说,你真要在这个层面上节省时间就应该直接写汇编语句了,还用高级语言干吗?
 
to ball_cao:
不同意你的看法,优化是应该各方面的,照你的话看,这方面根本就没有优化的必要,什么是优化?效率哪怕是提高一点也是优化!

况且你也不知道我的应用是什么,我这个应用就是大量的字符处理,你谈什么远程连接不过是泛泛而论,汇编不考虑,因为不会,我只能在我力所能及的范围内进行优化,哪怕只优化一点点。
 
看了半天LZ一直都在坚持自己是最正确的,何必发帖来征求意见呢?别人给了你意见你还反驳,一点都不诚恳,最起码要谢谢支持啊。不知道LZ是怎么想的,至于你的优化,也只能具体到程序中。
 
执行效率很重要一点要看数据的特殊性,先判断不易成功的条件,这样会大大减少表达式比较次数;
 
>>汇编不考虑,因为不会
很好——按照楼主的思路继续推理——优化不考虑,因为不会。

“不会”是理由么?——不可以学么?有谁生下来就会Delphi、会优化的?
楼主既然已经意识到“效率哪怕是提高一点也是优化”,那么做为低级语言的汇编语言,
在提高效率方面定然会有比Delphi灵活的地方,为什么不去学习呢?
楼主强调“我力所能及的范围内”——请问一个人的能力不会随着学习、实践而变化么?
 
先设几个逻辑变量:
A: b
B: P=' '
C: P=#0
原式变为AB+~A~B+C,然后化简.这里好象可以写成(b=(P=' ')) or (P=#0)
如果是人来化简,变量这么少,真值表和卡诺图足够了.
如果是编程序来化简,先转为主析取范式,再用公式去化简,NOI92有一题一模一样,搜个结果应该不难.
 
楼上的楼上的高手,我还以为你对我的问题有什么好建议呢!

不会不是理由,但是现实,你非要不会的我用不会的去做优化吗?不是为什么不去学的问题,而是我现阶段没时间去学,而ball_cao兄一来就说大道理,说我做的事情没意义,我同样也不觉得他的话有什么意义。

我强调“我力所能及的范围内”,这难道也有什么错吗?莫非你认为凌驾于自己的能力的空谈才是好的?积极的?向上的?我目前是不会汇编,只会pascal,所以,我把优化的范围限制在pascal语言这层,我实在看不出这为什么会成为本人不强调能力学习的证明,难道我要说,“嘿,请大家把实现这段代码功能的最优汇编代码给我”,这就是你想看到的?

我在不会pascal之前,还不会考虑用pascal代码去做代码优化呢。你一进来就对我的话做了歪曲性的推论,还反问我为什么不去学,请问,我有说我不去学吗?我问pascal的解决方案,你却说:嗨,你为什么不学汇编?然后对我一阵冷嘲热讽,我承认你是技术高手,IQ很高,可惜EQ却不怎么高,真遗憾。

>>请问一个人的能力不会随着学习、实践而变化么?
难道我否定了“一个人的能力会随着学习、实践而变化”么?如果你愿意,请在我学会汇编后再来指教汇编,我非常乐意聆听,只是,不知道到时候你会不会用cpu指令序列、执行流水线一类的再来谴责我一次。

to xingxin00:
我是认为我是对的(只是这个问题),只是来求证一下,看看我的看法是否正确,如果别人认为我做的没有意义,我提出自己的观点难道有错么?


真诚感谢上面每一位给我帮助的朋友。
 
明白了。那就在高级语言这个层面上继续——OK?

就正确性而言,毫无疑问,几个方案都是没错的。
如果要在此基础上进行效率优化——那么不可避免的要在实际中检验。正如上面您已经提
到的——“P = #0放在最后是因为这个条件只会在整个运算过程出现一次,而且是在最
后,如果放在前面,反而效率低”——类似这样的“情况”将会对判定效率造成直接影响。
如果楼主希望通过讨论得到高级语言所能达到的最佳执行效率,那就要将每个子判定的真
假出现频率给出一个大致的预期——所以建议楼主做一些附加的统计工作——相信不会是白
干。
LeeChange兄给出的表达式化简是一个很好的思路,不过,正如楼主将最不可能为真的判
定“P = #0”放在最后的初衷一样——一个在“逻辑上”最简的表达式未必在实际执行
时效率优于其它的同根表达式。鉴于影响效率的因素太多(除了判定结果出现概率、表达式
归并情况之外,即便对相同的语句,不同版本的Delphi的优化编译结果可能也不尽相同),
只有楼主自己有最终的发言权。我个人的建议是:楼主自己将if表达式的所有可能组合(当
然,有些无谓的增加表达式复杂度的情况就免了)“穷举”出来,将每个表达式都用多组实
际数据试验一下,为每个情况给出相应的评分,从中选择综合表现最优的表达式即可。

ps:在没有得到解决的问题面前,没有任何人有资格当“高手”,您甭抬举谁。
 
谢谢creation-zy,此回复仅希望您能看到,明天结帖。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部