gpt4 book ai didi

c# - 加快字节解析可能吗?

转载 作者:行者123 更新时间:2023-11-30 19:40:33 26 4
gpt4 key购买 nike

我们正在我们的项目中进行一些性能优化,并且使用探查器我发现了以下方法:

private int CalculateAdcValues(byte lowIndex)
{
byte middleIndex = (byte)(lowIndex + 1);
byte highIndex = (byte)(lowIndex + 2);

// samples is a byte[]
retrun (int)((int)(samples[highIndex] << 24)
+ (int)(samples[middleIndex] << 16) + (int)(samples[lowIndex] << 8));
}

这个方法已经非常快了,每次执行大约 1µs,但它每秒被调用大约 100.000 次,因此它占用大约 10% 的 CPU。

有没有人知道如何进一步改进这种方法?

编辑:

当前解决方案:

fixed (byte* p = samples)
{
for (; loopIndex < 61; loopIndex += 3)
{
adcValues[k++] = *((int*)(p + loopIndex)) << 8;
}
}

这比以前花费了 <40% 的时间(“整个方法”之前每次调用花费约 35 微秒,现在约 13 微秒)。 for 循环实际上比现在的计算花费更多的时间...

最佳答案

我强烈怀疑在转换为 byte 之后,您的索引无论如何都会被转换回 int 以用于数组索引操作。这将是便宜的,但可能不是完全免费的。所以摆脱强制转换,除非您使用转换为 byte 来有效地获取 0..255 范围内的索引。到那时,您也可以摆脱单独的局部变量。

此外,您对 int 的转换是空操作,因为移位操作仅在 int 和更高类型上定义。

最后,使用|可能比+更快:

private int CalculateAdcValues(byte lowIndex)
{
return (samples[lowIndex + 2] << 24) |
(samples[lowIndex + 1] << 16) |
(samples[lowIndex] << 8);

}

(为什么底部 8 位没有任何内容?这是故意的吗?请注意,如果 samples[lowIndex + 2] 设置了其顶部位,结果将最终为负 - 这样可以吗?)

关于c# - 加快字节解析可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22958403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com