编码优化无极限——由一个相等判断想到的

在google.com/codesearch 中搜索 ArrayList.Contains 方法的编码时找到了两个项目的编码,它们的写法大同小异,但是我发现一个奇怪的问题。
两个对象判断是否相等时,首先判断其中一个是否为null,再判断另一个是否也为null,如果是则判定两个相同;然后再在不为 null 的条件下判断两个对象是否相等:

        if  (item == null {
            
for(int i=0; i<5; i++)
                
if (_items[i]==null)
                    
return true;
            
return false;
        }

        
else   {
            
for(int i=0; i<5; i++)
                
if (item.Equals(_items[i]))
                    
return true;
            
return false;
        }

其实从单纯编码的角度考虑,两种情况下的代码可以合并到一处的,这样看起来精简的多:
             for ( int  i = 0 ; i < 5 ; i ++ )
                
if  (item.Equals(_items[i]))   // 这里有一个bug,详情见回复
                    
return   true ;
            
return   false ;
    

但是为什么要分开哪?
我考虑大概是这个原因,对象是否为 null 需要在内存中查找一次(只需找到该对象,查看其引用地址);对象是否相等需要在内存中查找两次(找到两个对象的引用地址,再比较其内容)。在这种循环判断中,如果 item
为 null 的话,只需在 _items 中找到另一个为 null 的对象即可,不必再到内存中查找 item 了,这样就节省了一次内存查找的操作。

=================================================================================

有趣的是另一个项目中是这样实现的:

         int  index;
        
if (item  !=   null )
        
{
            
for(index = 0; index < 5++index)
            
{
                
if(item.Equals(store[index]))
                
{
                    
return true;
                }

            }

            
return false;
        }

        
else
        
{
            
for(index = 0; index < 5++index)
            
{
                
if(store[index] == null)
                
{
                    
return true;
                }

            }

            
return false;
        }

这种实现方式为程序运行时节约了一个整数大小的内存开销。
看到大家这么珍惜cpu、内存,我也想为这段代码做点贡献,我修改了一下:

         int  index;
        
if (item  !=   null )
        
{
            
for(index = 0; index < 5++index)
            
{
                
if(item.Equals(store[index]))
                
{
                    
return true;
                }

            }

        }

        
else
        
{
            
for(index = 0; index < 5++index)
            
{
                
if(store[index] == null)
                
{
                    
return true;
                }

            }

        }

        
return   false ;


我为这三段代码加上相同的内容编译成dll,发现它们的IL确实是不一样哪。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值