【发布时间】:2026-01-06 02:40:01
【问题描述】:
我正在尝试优化以下 C# 代码,它根据阈值将字节设置为 0x00 或 0xFF。
for (int i = 0; i < veryLargeNumber; i++)
{
data[i] = (byte)(data[i] < threshold ? 0 : 255);
}
Visual Studio 的性能分析器显示,上述代码相当昂贵,需要将近 8 秒的时间来计算 - 占我总处理费用的 98%。我正在处理不到 1000 件商品,因此加起来需要两个多小时。
我认为问题与三元条件运算符有关,因为它会导致分支。我想某种纯数学运算可能会快得多,因为它对 CPU 缓存友好。
有没有办法优化这个?如果有帮助,我可以修复阈值。我认为任何高于约 7% 的性能提升都是胜利,因为总处理时间减少了整整 10 分钟。
【问题讨论】:
-
你看过为此制作的 IL 吗?
-
@DarenThomas 不,这对我也没有多大用处,因为我对 IL 了解不多。但是,如果它是 x86 程序集,我会很好! ^_^
-
它们不可能是 那个 不同的 ;) 但是 JIT 真的应该能够将它编译得非常快 - 你可以尝试将结果存储在一个单独的数组中吗?这可能会使优化更容易,因为优化器不必担心您更改输入数组。但我在这里谈论我不太了解的东西。不过,我赞成并行化的建议,因为这是一个非常容易并行化的案例!
-
我会尝试将
(byte)cast 运算符移近实际常量(0 和 255)。这应该可以帮助您避免在每次迭代中强制转换。 -
@Snowbear,实际上,如果进行任何转换,我会感到惊讶 - 编译器应该能够找出
0和255是字节。
标签: c# optimization ternary-operator threshold