【发布时间】:2013-12-18 03:55:12
【问题描述】:
谁能帮我优化这段代码?它目前是一个很大的瓶颈,因为它经常被调用。即使是 25% 的速度提升也会很显着。
public int ReadInt(int length)
{
if (Position + length > Length)
throw new BitBufferException("Not enough bits remaining.");
int result = 0;
while (length > 0)
{
int off = Position & 7;
int count = 8 - off;
if (count > length)
count = length;
int mask = (1 << count) - 1;
int bits = (Data[Position >> 3] >> off);
result |= (bits & mask) << (length - count);
length -= count;
Position += count;
}
return result;
}
最佳答案是最快的解决方案。使用 dottrace 完成的基准测试。目前这段代码占用了大约 15% 的总 cpu 时间。最少的数字赢得最佳答案。
编辑:示例用法:
public class Auth : Packet
{
int Field0;
int ProtocolHash;
int Field1;
public override void Parse(buffer)
{
Field0 = buffer.ReadInt(9);
ProtocolHash = buffer.ReadInt(32);
Field1 = buffer.ReadInt(8);
}
}
数据大小可变,但大多数情况下为 512 字节;
【问题讨论】:
-
您至少可以提供一些示例输入吗?
Data有多大?您在调用此方法时提供了什么length? -
...另外,
Length属性呢? -
您期待什么样的输出?或者至少解释一下你在做什么。
-
已更新。长度可以是 8、9 或 32