首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟线程和数据写入线程并行性

模拟线程和数据写入线程并行性
EN

Stack Overflow用户
提问于 2014-09-06 10:06:38
回答 2查看 108关注 0票数 0

这是一个一般的编程问题。假设我有一个线程在做一个特定的模拟,其中速度是非常重要的。在每次迭代时,我都希望从中提取数据并将其写入文件。

更好的做法是将数据交给另一个线程,让模拟线程专注于他的工作,还是因为速度非常重要,让模拟线程在不复制数据的情况下也进行数据记录。(在我的例子中,它是大小为1000-10000的整数的3-5除数)

首先,这当然取决于我们复制了多少数据,但它还能依赖什么呢?同步和复制的成本是否值得?在每秒50次或更多次迭代的情况下,在每次迭代中创建小的runnables来处理记录任务,这是一种良好的实践吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-06 10:28:40

如果您真的希望这个stat捕获的延迟较低,并且在模拟过程中也希望如此,那么就会想到两种技术。它们可以非常有效地结合使用。请注意,这两种方法离标准Java已走过的路径相当远,所以首先测量并确认您需要这些技术,然后再滥用它们;它们可能很难正确实现。

  1. 在模拟过程中将数据写入文件的最快方法是将工作交给另一个线程,而不减慢模拟速度。然而,必须注意的是,如何发生的手,因为一个内存屏障在仿真线程将减缓模拟。由于作者只关心值最终会出现,我会考虑使用位于AtomicLong.lazySet后面的内存屏障,它请求线程安全地写入到内存地址,而不阻塞另一个线程实际可见的写。不幸的是,目前只能通过lazySet或类sun.misc.Unsafe直接访问这个内存屏障,这显然不是公共Java的一部分。然而,这不应该是一个太大的障碍,因为它是目前的所有JVM实现,Doug正在讨论将它的部分转移到主流。
  2. 为了避免Java使用的缓慢的阻塞文件IO,请使用内存映射文件。这允许操作系统代表您执行异步IO,而且效率很高。它还支持使用上述相同的内存屏障。

对于这两种技术的示例,我强烈建议阅读Peter的HFT纪事源代码。事实上,HFT纪事可能只是你可以在这里使用的图书馆。它提供了一个高效和简单的使用磁盘支持的队列,它可以支持每秒一百万条左右的消息。

票数 3
EN

Stack Overflow用户

发布于 2014-09-06 12:16:39

在我的压力测试HTTP客户端工作中,我将统计数据存储到一个数组中,当数组准备发送到GUI时,我将为测试客户端创建一个新的数组,并将整个数组交给网络层。这意味着您不需要为任何复制付费,只为分配一个新的数组( JVM上的一个超快操作,涉及手工编码的汇编程序宏来利用任务可用的最佳SIMD指令)。

我还建议不要直接进入最优内存屏障使用的领域;普通的volatile写和AtomicReference.lazySet()之间的区别只能在线程做几乎什么都不做的情况下才能测量(至少每秒数百万次)。根据您的目标I/O吞吐量,您甚至可能不需要NIO来达到目标。最好先尝试使用简单、易于维护的代码,而不是深入到高度专业化的API中,而不需要这样做。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25699113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档