【问题标题】:What performance can I expect from Int32 and Int64?我可以从 Int32 和 Int64 获得什么性能?
【发布时间】:2011-06-03 05:48:09
【问题描述】:

我经常看到像 this 这样的 pprogram,其中 Int64 是 32 位平台上的绝对性能杀手。我现在的问题是:

如果我的任务需要特定的字长(在我的情况下是 RNG),Int64 在 64 位平台上是否有效,还是仍会使用 C 调用?将Int64 转换为Int 的效率如何?

【问题讨论】:

  • 我建议第一次尝试使用Integer
  • 我需要一个固定的字长来实现 Xorshift,所以 Integer 是没有选择的。
  • 我会使用Int32Int64 中更适合您的RNG 算法的那个。创建一个类型同义词,以便您以后可以轻松地对其进行测试。另请注意,IntInt32 不同(Haskell 规范仅保证 Int 至少为 31 位)。

标签: haskell 64-bit int 32bit-64bit word-size


【解决方案1】:

在 64 位系统上 Int64 应该没问题,不过我不确定。

更重要的是,如果您要进行加密或随机数生成,您必须使用算法要求使用的数据类型,还要注意签名性。如果您不这样做,您将得到错误的结果,这可能意味着您的密码术不安全,或者您的随机数生成器并不是真正随机的(RNG 很难,很多看起来是随机的,但实际上并非如此)。

对于任何其他类型的工作,尽可能使用 Integer,甚至更好的是,使用 Integral 类型类使您的程序具有多态性。然后,如果您认为您的程序比它应该配置的要慢,那么当您尝试加快它时,它会确定您应该集中在哪里。如果您使用 Integral 类型类,从 Integer 更改为 Int 很容易。 Haskell 应该足够聪明,可以专门化(大多数)使用多态性的代码以避免开销。

【讨论】:

    【解决方案2】:

    这里有一篇关于 64 位性能的有趣文章:

    Isn’t my code going to be faster on 64-bit???

    正如文章所述,最大的瓶颈不是处理器,而是缓存和内存 I/O。

    【讨论】:

    • 首先,就我的目的而言,我只有一个想要操作的数字,所以内存访问应该没有问题。真正的问题是,众所周知,GHC 会通过 C 调用做很多事情,这并不总是很清楚。
    • 这个问题看起来确实是 Haskell 特有的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2010-09-21
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    相关资源
    最近更新 更多