2012-01-21 20 views
1

我正在寻找一种方法将CPU旋转一段固定的CPU时间以模拟假“工作”,以便我可以测试出一些并发算法。基本上,我正在寻找一种方法来让线程执行一些需要N秒CPU时间的事情。旋转处理器以获得固定的CPU时间

我最初的实现有这样的事情:

public void doWork() { 
    long startTime = System.currentTimeMillis(); 
    while(System.currentTimeMillis() - startTime < mDurationMillis) { 
     //Churn 
    } 
    System.out.println("Task " + mTaskId + " on thread " + Thread.currentThread().getId() + ": done work!"); 
} 

但我很快意识到,这只是测量实时,而且100个这样的任务将在大致相同的时间内完成的一个在单一处理器上。有一种方法可以测量线程在运行时使用的CPU时间吗?

+5

我强烈建议你使用*真实*工作,这是典型的算法将在实际使用中看到的类型和数量。如果您测试的工作与您计划在实际使用中所做的工作不同,那么您很可能会得到毫无意义的测试结果。在现代CPU上,I/O重(或系统调用重)代码的并发行为将与内存访问繁重的代码非常不同,后者将与执行大量浮点数学的代码不同,等等。 –

+0

我建议运行多个竞争线程(比如说100个线程)并让它们具有'Thread.sleep(randomMilliseconds)'来模拟时序变化。如果存在并发问题,那么使用正确测试的方法将有助于找到它。 – Bohemian

+0

我有理解这个问题的麻烦。如果任务由单个线程执行,并且所有时间测量均在任务内完成,那么为什么CPU时间与真实(又名挂钟)时间(明显地)不同?为什么你认为100个这样的任务在一个处理器上几乎与一个完成时间相同? –

回答