为什么BitConverter比直接执行按位操作慢?

时间:2014-03-12 14:47:08

标签: c# bit-shift bitconverter

我最近对某些代码进行了一些分析,发现调用BitConverter时消耗的CPU占用量最大,如:

return BitConverter.ToInt16(new byte[] { byte1, byte2 });

切换到以下内容时:

return (short)(byte1 << 8 | byte2);

我注意到了性能的巨大提升。

我的问题是为什么使用BitConverter这么慢?我原以为BitConverter本质上是在内部进行相同的位移。

2 个答案:

答案 0 :(得分:6)

BitConverter的调用涉及新对象的分配和初始化。然后是方法调用。方法调用内部是参数验证。

可以将按位操作编译到少数CPU操作码以进行移位,然后执行或。

后者肯定会更快,因为它消除了前者的所有开销。

答案 1 :(得分:4)

您可以查看reference source,看看它有一些额外的事情要担心,特别是参数验证和字节序担忧:

public static unsafe short ToInt16(byte[] value, int startIndex) {
     if( value == null)  {
          ThrowHelper.ThrowArgumentNullException(ExceptionArgument.value);
     }

     if ((uint) startIndex >= value.Length) {
          ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.startIndex, ExceptionResource.ArgumentOutOfRange_Index);
     }

     if (startIndex > value.Length -2) {
          ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall);
     }
     Contract.EndContractBlock();

     fixed( byte * pbyte = &value[startIndex]) {
          if( startIndex % 2 == 0) { // data is aligned 
              return *((short *) pbyte);
          }
          else {
              if( IsLittleEndian) { 
                   return (short)((*pbyte) | (*(pbyte + 1) << 8)) ;
              }
              else {
                   return (short)((*pbyte << 8) | (*(pbyte + 1)));                        
              }
          }
     }
}