令人费解的效率问题

最近在给华容道程序进行性能调优时遇到了一个令人费解的效率问题,我最初始的代码是这样写的:

None.gif      public   override   void  CheckAvailableSteps(BlankPosition _blankPosition, CallBackDelegate _callback)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif      
if(CanMoveUp(_blankPosition))
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Up);
InBlock.gif
InBlock.gif      
if(CanMoveDown(_blankPosition))
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Down);
InBlock.gif
InBlock.gif      
if(CanMoveLeft(_blankPosition))
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Left);
InBlock.gif
InBlock.gif      
if(CanMoveRight(_blankPosition))
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Right);
InBlock.gif
InBlock.gif      
if(CanMoveLeft2(_blankPosition))
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Left2);
InBlock.gif
InBlock.gif      
if(CanMoveRight2(_blankPosition))
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Right2);
InBlock.gif
InBlock.gif      
return;
ExpandedBlockEnd.gif    }

None.gif  }

这是一个水平横放棋子的走法判断程序。可以看出来,我依次测试了一个水平棋子的六种走法是否可行。后来我认为可以进一步进行调优:比如说如果该棋子可以上移,那么其它五种移法就不用考虑了,肯定不行。类似如果该棋子可以左移两位,那么一定可以左移一位。这样我就可以减少判断的次数,进而提高程序运行的效率。所以我把程序改成了类似这个样子:

None.gif      public   override   void  CheckAvailableSteps(BlankPosition _blankPosition, CallBackDelegate _callback)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif      
if(CanMoveUp(_blankPosition))
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Up);
InBlock.gif        
return;
ExpandedSubBlockEnd.gif      }

InBlock.gif
InBlock.gif      
if(CanMoveDown(_blankPosition))
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Down);
InBlock.gif        
return;
ExpandedSubBlockEnd.gif      }

InBlock.gif
InBlock.gif      
if(CanMoveLeft2(_blankPosition))
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Left2);
InBlock.gif        
InBlock.gif        
// 此处添加MoveLeft代码并CallBack, 略dot.gif
InBlock.gif
        
InBlock.gif        
return;
ExpandedSubBlockEnd.gif      }

InBlock.gif
InBlock.gif      
if(CanMoveRight2(_blankPosition))
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Right2);
InBlock.gif        
InBlock.gif        
// 此处添加MoveRight代码并CallBack, 略dot.gif
InBlock.gif
        
InBlock.gif        
return;
ExpandedSubBlockEnd.gif      }

InBlock.gif
InBlock.gif      
if(CanMoveLeft(_blankPosition))
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Left);
InBlock.gif
InBlock.gif      
if(CanMoveRight(_blankPosition))
InBlock.gif        _callback(_newPosition, _newBlankPosition, MoveMethod.Right);
InBlock.gif
InBlock.gif      
return;
ExpandedBlockEnd.gif    }

None.gif  }

结果猜怎么着?程序运行效率骤然降低,从原来的5.88秒一下子长到了6.23秒,这可不是一个小数。明明添加了一些return避免过多的运算,可系统效率反而下降,真不知道为什么?难道代码运行效率与代码行数还有关系?

放到“新手区”。我想原因可能有两个:1、此处的修改对效率影响太小以至于可以忽略不计。2、测试误差比较大。我已经放弃这种优化方法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值