- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个线程从 ArrayBlockingQueue() connectionPool.
获取一个对象如果 ArrayBlockingQueue() 为空,则线程可能会被阻塞。为了测量调用线程被阻塞的时间,我使用以下代码:
long start = System.nanoTime();
DataBaseEndPoint dbep = connectionPool.take();
long end = System.nanoTime();
long elapsed = (end - start)/1000000;
现在,我担心的是,未阻塞的线程可能会开始在多处理器计算机中的不同处理器上运行。在这种情况下,我不完全确定使用的“系统计时器”在不同处理器上是否相同。这篇博客文章 ( http://www.javacodegeeks.com/2012/02/what-is-behind-systemnanotime.html ) 建议 Linux 对每个处理器使用不同的时间戳计数器(也用于 System.nanotime()),这确实会扰乱上面示例中的耗时计算。
The value is read from clock_gettime with CLOCK_MONOTONIC flag Which uses either TSC or HPET. The only difference with Windows is that Linux not even trying to sync values of TSC read from different CPUs, it just returns it as it is. It means that value can leap back and jump forward with dependency of CPU where it is read.
但是,此链接 ( http://lwn.net/Articles/209101/ ) 表明 TSC 不再用于高分辨率计时器。
... the recently-updated high-resolution timers and dynamic tick patch set includes a change which disables use of the TSC. It seems that the high-resolution timers and dynamic tick features are incompatible with the TSC...
所以,问题是,Linux 机器使用什么来将值返回到 System.nanotime()
现在?并且,正在使用System.nanotime()
在上述情况下可以安全地测量耗时(在另一个处理器上启动的阻塞线程)。如果不安全,还有什么替代方案?
最佳答案
虚拟机(以及一般生活)的一个无价之宝就是抽象。线程的执行时间不会根据核心数量而有所不同;不在 Linux 中,也不在 Windows 等中......我希望我没有误解你的问题。
(虽然我使用的是currentTimeMillis(),当然,不同尺度的纳米时间是相同的)
检查我制作的以下示例:
public class SynchThreads {
public static void main(String[] args) throws InterruptedException {
GreedyTask gtA = new GreedyTask("A");
GreedyTask gtB = new GreedyTask("B");
Thread a = new Thread(gtA);
Thread b = new Thread(gtB);
a.start();
b.start();
a.join();
b.join();
System.out.println(gtA.toString()+" running time: "+gtA.getRunningTime());
System.out.println(gtB.toString()+" running time: "+gtB.getRunningTime());
}
private static class GreedyTask implements Runnable {
private long startedTime, finishedTime, totalRunTime;
private String myName;
public GreedyTask(String pstrName) {
myName = pstrName;
}
public void run() {
try {
startedTime = System.currentTimeMillis();
randomPowerNap(this);
finishedTime = System.currentTimeMillis();
totalRunTime = finishedTime - startedTime;
} catch (Exception e) { System.err.println(e.getMessage()); }
}
public String toString() { return ("Task: " + myName); }
public long getRunningTime() { return this.totalRunTime; }
}
private static synchronized void randomPowerNap(GreedyTask gt) throws InterruptedException {
System.out.println("Executing: "+gt.toString());
long random = Math.round(Math.random()*15000);
System.out.println("Random time for "+gt+" is: "+random);
Thread.sleep(random);
}
}
以下是在 4 核 Windows 机器上运行的输出:
Executing: Task: A
Random time for Task: A is: 1225
Executing: Task: B
Random time for Task: B is: 4383
Task: A running time: 1226
Task: B running time: 5609 // what's funny about this? this is equal to Btime - Atime
这是在 4 核 Linux 机器上运行的:
Executing: Task: A
Random time for Task: A is: 13577
Executing: Task: B
Random time for Task: B is: 5340
Task: A running time: 13579
Task: B running time: 18920 // same results
结论:B 总时间增加了 randomPowerNap 被 A 阻塞时必须等待的时间,因此,由于虚拟机的硬件抽象,线程的运行时间没有差异,因为它们都在“虚拟大核心”中运行,如果你明白我的意思的话。
我希望这有帮助。
关于Linux 上的 Java : Measuring elapsed time using System. nanotime() 用于阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20557511/
我对这 4 个完全困惑。ElapsedMilliseconds (long)、ElapsedTicks (long)、Elapsed.TotalMilliseconds (double) 和 Elap
我已经包含了 System.Timers 包,但是当我输入时: Timer.Elapsed; //its not working, the property elapsed is just not t
我有一个要使用的 System.Timers.Timer 对象,但我不希望绑定(bind)到 Timer 的处理干扰普通到高优先级线程。换句话说,我想说我想每 5 秒处理一次 X,只要没有其他东西在运
在我的应用程序中,有时我需要手动调用我的计时器。 我试过以下方法: int originalInterval = t.Interval; t.Interval = 0; t.Interval = or
我有一个页面,我在其中触发 ajax 请求并在用户按下按钮后的前 6 秒内显示加载标志: var startTime=(new Date).getTime(); function
我想为每个对象分配不同的计时器。 每个对象都包含 Timer 作为类成员。 这就是我尝试过的: private void EntityTimeElapsed(object sender, MyEnti
我正在使用 Windows 窗体。我正在使用 System.Timers.Timer 。虽然我用 timer.Stop() 停止了计时器,但它仍然会多一点。我放了一些 bool 变量来防止这种情况但没
我正在使用 LabVieW 计算电路的电容。我试图得到它两端的电压达到2.5V后的时间。我提供5V电源。我使用了逻辑运算符并将其连接到耗时组件的重置。但随着时间重置,我得到了零。我想知道实际耗时。 电
我必须在大学做一个小作业: 我有一台运行“n”个独立服务的服务器。过去所有这些服务都是同时启动的。每个服务“i”都会在一定时间“s[i]”(以秒为单位)后将“b[i]”行写入服务器上的日志文件。输入由
我有这个投票类 class Poll { public string question { get; set; } public Timer pollTimer { get; set;
以下类来自 .Net Windows 服务。 DoSomeDatabaseStuff 方法在第一次启动时需要 10 分钟,但当时间过去后,不会再次调用此方法。 public class Test {
Timers.Timer 来创建秒表。我使用 Timer.Elapsed 来处理在特定时间后显示时间的事件。我给定时器间隔 1 并启用为真。我还将 AutoReset 设置为 true。但问题是事件只
我有一个计时器,我想知道它是否有效以测试它是否是计时器第一次引发经过的事件(我想在第一次引发经过的事件后更改 Interval 属性) _timer = new Timer(1000)
我有一个 Backgroundworker,它从数据库中收集大量数据。我想在线程上设置一个超时限制,这样如果它在设定的时间后没有返回结果,进程就会被取消。 我在启动 BackgroundWorker
ElapsedTicks & Elapsed.Ticks 是 Stopwatch 的属性,我觉得应该是一样的。如果它们相同,为什么它们应该给出不同的输出? 代码: Stopwatch spwt = S
我正在使用 Windows 窗体应用程序并拥有一个使用 System.Timers.Timer 定期检查数据库数据的管理器类。 如何将计时器 Elapsed 事件处理程序中发生的异常传递给主应用程序?
我正在使用 System.Timers.Timer 类创建一个带有 Timer.Elapsed 事件的计时器。问题是 Timer.Elapsed 事件仅在间隔时间过去后才第一次触发。 有没有办法在启动
我有一个获取音频的脚本。我想将该频率与歌曲的确切时间联系起来。我可以获取 webkitAudioContext currentTime 属性,但这并不准确,因为它在歌曲开始之前将声音保存在缓冲区中时开
我有下面的代码来获取当前时间戳并计算最后时间戳的耗时(以分钟为单位),我想知道是否可以进一步针对生产进行优化 public static Timestamp getTimestamp() {
我正在尝试获取在响应式(Reactive)编程中从 Redis 读取数据的执行时间,在查找文档时我可以看到 elapsed() 方法将执行相同的操作并实现如下代码。 Flux.fromIterable
我是一名优秀的程序员,十分优秀!