【问题标题】:Will this time duration measurement in two threads give correct result? [closed]两个线程中的持续时间测量会给出正确的结果吗? [关闭]
【发布时间】:2020-11-21 20:45:43
【问题描述】:

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

线程1:

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

线程2:

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

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

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

【问题讨论】:

标签: java multithreading performance concurrency locking


【解决方案1】:

你问:

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

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

你问:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多