【发布时间】:2011-06-14 13:58:27
【问题描述】:
我不知道 int 数组查找的开销是多少。哪个会更好(在 C# 中):
a = aLookup[i];
b = (a % 6) == 5;
c = (b ? a+1 : a-1) >> 1; // (a + 1) / 2 or (a - 1) / 2
或者
a = aLookup[i];
b = bLookup[i];
c = cLookup[i];
数组查找真的会为b 或c 节省那么多时间吗?
编辑:我以几种方式对其进行了分析。结果是数组查找几乎快了四倍。
【问题讨论】:
-
我不认为这会成为你的瓶颈,选择更具可读性的东西
-
我很困惑为什么人们会问这样的问题。您已经以两种方式编写了代码。自己尝试一下,然后您就会知道哪个更快,然后您可以告诉我们。如果不尝试,这里没有人可以告诉您两件事中哪一个更快;没有什么神奇的方法可以知道“嗯,这在您的服务器硬件上需要 100 纳秒,但是这在 10% 的情况下会导致错误的行缓存未命中,因此会减慢速度……”您只需要尝试并找到出来。
-
两者都不会有那么大的不同。我建议尝试在其他地方优化您的代码。
-
@Eric Lippert 每个人都没有进入这个行业足够长的时间来知道什么是对、错或明显的。人们需要时间来学习东西。您不会看到来自 Jon Skeet 的此类问题,而只会来自新手。很可能他也不知道如何分析性能。
-
@jnm2:你试试就知道了。请记住,C# 是一种 jit 编译语言;例如,这里没有人知道你的机器上的抖动何时会决定它可以推断出数组边界检查可以安全地优化掉。有许多不同的方法可以生成代码和数据局部性,因此缓存未命中可以在性能敏感算法中发挥重要作用。我会使用分析器并让它指导我的工作。
标签: c# arrays performance