mcl*_*sen 0 c# bit-shift bitconverter
我最近对一些代码进行了一些分析,发现调用BitConverter时消耗的CPU占用量最大,如:
return BitConverter.ToInt16(new byte[] { byte1, byte2 });
Run Code Online (Sandbox Code Playgroud)
切换到类似的东西时:
return (short)(byte1 << 8 | byte2);
Run Code Online (Sandbox Code Playgroud)
我注意到性能的巨大提升.
我的问题是为什么使用BitConverter这么慢?我会假设BitConverter本质上是在内部进行相同类型的位移.
调用BitConverter涉及新对象的分配和初始化.然后是方法调用.方法调用内部是参数验证.
按位操作可以编译到少数CPU操作码以进行转换,然后按或.
后者肯定会更快,因为它消除了前者的所有开销.
您可以查看参考源,并发现它还需要担心一些额外的事情,特别是参数验证和字节序担心:
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)));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
856 次 |
| 最近记录: |