为什么.Net HashHelpers.IsPrime以这种方式实现?

Vas*_*huk 6 .net c# algorithm primes

看看.NET System.Collections.Generic.Dictionary<T,T>实现,我找到了一个方法HashHelpers.IsPrime(n),它检查数字是否为素数.我有点困惑为什么他们使用非常简单的优化技术测试从3开始的奇数.

(来源代码)

int limit = (int)Math.Sqrt (candidate);
for (int divisor = 3; divisor <= limit; divisor+=2)
{
     if ((candidate % divisor) == 0)
          return false;
     }
return true;
Run Code Online (Sandbox Code Playgroud)

因此,它们将检查从3减少到两次.但更优化的是根据维基百科减少测试3次测试数字6*k-1,6*k + 1 .而且我认为还有更优化和更快的素数测试解决方案.

我知道在特定的Dictionary<T,T>实现中它并不是那么重要,因为它仅在大小调整时被调用,并且在调整大小时非常罕见.但总的来说,它是一个框架,并且很受知名公司的欢迎.也许存在一些逻辑或我在这里看不到什么?谢谢.

Eri*_*ert 17

我认为有更优化和更快的素数测试解决方案.

是的.

也许存在一些逻辑或我在这里看不到什么?

不.你已经准确地总结了这种情况.

你问:

为什么.Net HashHelpers.IsPrime以非最佳方式实现?

然后你回答你自己的问题:

我知道在特定的Dictionary<T,T>实现中它并不是那么重要,因为它仅在大小调整时被调用,并且在调整大小时非常罕见.

所以你知道你的问题的答案.它没有经过优化,因为足够快的速度足够快,而且给定的算法足够快.

如果你想让它更快,嘿,它是开源的.更好地实现您喜欢的算法,并提交精心设计,准确和精确的经验性能测试的详细结果,这些测试清楚地表明,对于广泛使用的基础功能进行不必要的更改是通过您的优秀性能算法在不重要的和罕见的情况.

如果这听起来像很多工作几乎没有任何好处,那么你就知道了你的问题的答案.具有小优点的昂贵工作被分类到优先级列表的底部.

  • 我读"足够快就是足够快",并且不必向下滚动就知道它是Eric Lippert的帖子.你最喜欢的短语之一!:) (7认同)