【问题标题】:High performance unique timestamp id for multiple threads in HaskellHaskell中多个线程的高性能唯一时间戳ID
【发布时间】:2012-01-29 07:08:36
【问题描述】:

我有多个线程处理事件。我想为每个事件分配一个纳秒时间戳。不过,它必须是唯一的 id。因此,在两个事件到达的奇怪情况下,它们将被分配相同的时间戳,我希望其中一个事件增加一纳秒。鉴于真正的精度不在纳秒级,就系统的时间戳性质而言,这是可以的。

在一个线程中,这是一个微不足道的问题。但是跨多个线程,它变得更具挑战性。性能是绝对关键的,因此在典型的 id 生成器类型上天真地同步的想法似乎会阻塞太多。

是否有某种方法可以通过最少的锁定或不锁定来解决这个问题?

【问题讨论】:

    标签: multithreading performance haskell uniqueidentifier


    【解决方案1】:

    为什么不将时间戳和唯一 ID 生成问题分开?例如,有一个标准模块Data.Unique,它在IO 中提供了全球唯一值,对于大多数用途来说应该足够快。或者,如果您需要更高级的东西,concurrent-supply 包提供了高性能、并发唯一 ID 供应和纯界面。

    也就是说,您可能可以为此目的使用POSIX monotonic clock,例如使用clock 包:

    import Control.Monad
    import qualified System.Posix.Clock as Clock
    
    main :: IO ()
    main = replicateM_ 100 $ do
      time <- Clock.getTime Clock.Monotonic
      print (Clock.sec time, Clock.nsec time)
    

    【讨论】:

    • @augustss:POSIX 单调时钟?我不知道。如果速度不够快,这是将时间戳和 ID 生成解耦的另一个好理由。
    • @ehird 在时间 b 创建的唯一 ID 在所有情况下都比在时间 a(更早)创建的唯一 ID 具有更高的值吗?
    • @JFritsch: Unique 是基于 Integer 原子增加的,所以是的。 (虽然从技术上讲,您只能从中获得Int,因此只有EqOrd 实例可以区分环绕前和环绕后的值,但在64 位机器上不会一个问题。)
    【解决方案2】:

    您可以使用两条信息作为唯一标识吗?如果是这样,给每个线程一个唯一的 id 并为每个事件记录纳秒时间戳和分配时间戳的线程的 id。然后问题减少到您在单线程情况下所做的任何事情,以保证时间戳的唯一性。并且初始化后根本没有同步。

    【讨论】:

      【解决方案3】:

      您可以使用atomicModifyIORef 来实现原子计数器。使用 GHC,它是使用原子操作而不是锁来实现的。

      import Data.IORef
      import System.IO.Unsafe
      
      counter :: IO Int
      counter = unsafePerformIO $ newIORef 0
      
      getUnique :: IO Int
      getUnique = atomicModifyIORef counter $ \x -> let y = x + 1 in (y, y)
      

      【讨论】:

      • @ehird:请不要对我的帖子进行重大更改,如果您有什么要补充的,请发表评论。
      • 抱歉,我觉得我所做的更改是微不足道的,但在保存之前又发现了两个错误。目前,getUnique 总是返回,而counter 可以内联到其他表达式中,复制变量并破坏代码。此外,如果这两个都已修复,那么getUnique 将由于连续执行时累积的 thunk 导致空间泄漏。 (顺便说一句,标准的Data.Unique 模块实际上已经提供了这个API。)
      • @ehird:这正是我想知道的信息,谢谢。
      【解决方案4】:

      在基于 C 的语言中,我们通常使用原子计数器来完成此操作——不需要锁。如果你也想要一个时间戳,那将是一个单独的值。我不确定 Haskell,因为我不使用它来写作(听起来很有趣)。

      【讨论】:

        【解决方案5】:

        【讨论】:

        • 欢迎来到 Stack Overflow!虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-11
        • 2021-05-09
        • 1970-01-01
        • 2012-06-01
        • 1970-01-01
        • 2020-07-26
        相关资源
        最近更新 更多