首页 > 解决方案 > 两个线程中的持续时间测量会给出正确的结果吗?

问题描述

我正在开发的程序有两个线程运行类似但不同的任务:

线程1:

timer1.start()
writeToExternalDB1(consumedData)
timer1.end()

线程2:

timer2.start()
writeToExternalDB2(consumedData)
timer2.end()

我想比较两个外部数据库的写入性能。我在写操作周围有计时器,这样我就可以收集一些指标。这两个线程同时运行。

我的问题是,这种设计是否会针对每次写入操作所花费的时间给出正确的测量结果?我的理解可能不是因为CPU给每个线程的处理时间可能不同。假设对于thread1,在timer1启动后,cpu不会继续进行后面的写操作,而是切换到处理thread2。这可能会在timer1.start()writeToExternalDB1(consumedData)之间引入一些差距。但是,在这种情况下,如果我们正在处理大量数据,我们是否应该认为这个差距可以忽略不计?我应该怎么做才能给出正确的测量结果?

标签: javamultithreadingperformanceconcurrencylocking

解决方案


您问:

两个线程中的持续时间测量会给出正确的结果吗?

是的,如果您timer的编码正确,您将准确捕捉开始和停止的时刻,例如调用Instant.now().

您问:

我想比较两个外部数据库的写入性能。… 这两个线程同时运行。

您的比较不太可能是精确的,甚至是有效的。

如果您的应用程序在具有单核的机器上运行,那么当一个线程运行时,另一个线程正在休眠。

在多核机器上,您的两个线程可能同时运行。或者它们可能不是,您无法控制主机操作系统的进程调度。您的JVM可能随时被主机操作系统暂停。

如果您的机器有多个内核在您的测试运行时可能未使用,那么您可能会认为您的测试结果在有效范围内的某个地方,但您不确定,而且您当然不能称它们为准确。


推荐阅读