这是一个一般的编程问题。假设我有一个线程在做一个特定的模拟,其中速度是非常重要的。在每次迭代时,我都希望从中提取数据并将其写入文件。
更好的做法是将数据交给另一个线程,让模拟线程专注于他的工作,还是因为速度非常重要,让模拟线程在不复制数据的情况下也进行数据记录。(在我的例子中,它是大小为1000-10000的整数的3-5除数)
首先,这当然取决于我们复制了多少数据,但它还能依赖什么呢?同步和复制的成本是否值得?在每秒50次或更多次迭代的情况下,在每次迭代中创建小的runnables来处理记录任务,这是一种良好的实践吗?
发布于 2014-09-06 10:28:40
如果您真的希望这个stat捕获的延迟较低,并且在模拟过程中也希望如此,那么就会想到两种技术。它们可以非常有效地结合使用。请注意,这两种方法离标准Java已走过的路径相当远,所以首先测量并确认您需要这些技术,然后再滥用它们;它们可能很难正确实现。
对于这两种技术的示例,我强烈建议阅读Peter的HFT纪事源代码。事实上,HFT纪事可能只是你可以在这里使用的图书馆。它提供了一个高效和简单的使用磁盘支持的队列,它可以支持每秒一百万条左右的消息。
发布于 2014-09-06 12:16:39
在我的压力测试HTTP客户端工作中,我将统计数据存储到一个数组中,当数组准备发送到GUI时,我将为测试客户端创建一个新的数组,并将整个数组交给网络层。这意味着您不需要为任何复制付费,只为分配一个新的数组( JVM上的一个超快操作,涉及手工编码的汇编程序宏来利用任务可用的最佳SIMD指令)。
我还建议不要直接进入最优内存屏障使用的领域;普通的volatile写和AtomicReference.lazySet()之间的区别只能在线程做几乎什么都不做的情况下才能测量(至少每秒数百万次)。根据您的目标I/O吞吐量,您甚至可能不需要NIO来达到目标。最好先尝试使用简单、易于维护的代码,而不是深入到高度专业化的API中,而不需要这样做。
https://stackoverflow.com/questions/25699113
复制相似问题