Java 模拟线程和数据写入线程并行性
这是一个一般的编程问题。假设我有一个线程在做一个特定的模拟,速度非常重要。在每次迭代中,我都希望从中提取数据并将其写入文件 将数据移交给不同的线程并让模拟线程专注于自己的工作是更好的做法,还是因为速度非常重要,所以让模拟线程也进行数据记录而不复制数据。(在我的例子中是3-5个整数,大小为1000-10000)Java 模拟线程和数据写入线程并行性,java,multithreading,simulation,Java,Multithreading,Simulation,这是一个一般的编程问题。假设我有一个线程在做一个特定的模拟,速度非常重要。在每次迭代中,我都希望从中提取数据并将其写入文件 将数据移交给不同的线程并让模拟线程专注于自己的工作是更好的做法,还是因为速度非常重要,所以让模拟线程也进行数据记录而不复制数据。(在我的例子中是3-5个整数,大小为1000-10000) 首先,它肯定取决于我们复制了多少数据,但它还能依赖什么呢?同步和复制的成本值得吗?在每次迭代时创建小的可运行文件以处理每秒50次或更多迭代的记录任务,这是一种好的做法吗?如果您确实希望此状
首先,它肯定取决于我们复制了多少数据,但它还能依赖什么呢?同步和复制的成本值得吗?在每次迭代时创建小的可运行文件以处理每秒50次或更多迭代的记录任务,这是一种好的做法吗?如果您确实希望此状态捕获具有较低的延迟,并且希望在模拟过程中使用此延迟,则会想到两种技术。它们可以一起非常有效地使用。请注意,这两种方法与标准的Java践踏路径相去甚远,因此在滥用它们之前,请先测量并确认您需要这些技术;它们可能很难正确实施
对于这两种技术的示例,我强烈建议阅读Peter Lawrey的HFT编年史源代码。事实上,HFT编年史可能正是供您在此使用的图书馆。它提供了一个高效且易于使用的磁盘备份队列,每秒可支持一百万条左右的消息 如果您真的希望在这个状态捕获上有低延迟,并且希望在模拟过程中有低延迟,那么您会想到两种技术。它们可以一起非常有效地使用。请注意,这两种方法与标准的Java践踏路径相去甚远,因此在滥用它们之前,请先测量并确认您需要这些技术;它们可能很难正确实施
volatile
写操作和原子引用.lazySet()
之间的差异只有在线程除了执行内存屏障(每秒至少有数百万次写操作)之外几乎什么都不做的情况下才能测量。根据您的目标I/O吞吐量,您甚至可能不需要NIO来实现这一目标。最好先尝试使用简单、易于维护的代码,而不是在没有确认需要的情况下深入研究高度专业化的API。在我对a的工作中,我将统计数据存储到一个数组中,当数组准备发送到GUI时,我会为测试人员客户端创建一个新数组,并将整个数组交给网络层。这意味着您不需要为任何复制付费,只需要分配一个新的数组(JVM上的一个超快操作,涉及手工编码的汇编宏以利用最佳的性能)