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

Will this time duration measurement in two threads give correct result?

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

线程 1:

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

线程 2:

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

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

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

您问的是:

Will this time duration measurement in two threads give correct result?

是的,如果您的 timer 编码正确,例如调用 Instant.now().

,您将准确捕捉开始和停止时刻

您问的是:

I want to compare the writing performance of the two external database. … Those two threads are running concurrently.

您的比较不太可能准确,甚至无效。

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

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

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