我正在制作一种概率模拟器,它可以在特定的时间内运行,或者进行特定次数的重复运算。我正在寻求优化方法,目前已经使用多线程,每个ProbabilityWorker都扩展了Thread,并且主程序会自动分配n个线程,其中n是可用线程数量(例如,在我的Core i3-7100U上,这是4)。
我正在分析性能,并意识到我使用的获取与结束时间相关的方法会导致很大的开销。
对于“在特定时间内运行”的模式,我在循环条件中使用new Date对象,然后将其更改为更快的System.currentTimeMillis()来尝试节省时间,但我注意到即使这样也会引起开销。
我的run函数如下:
我正在分析性能,并意识到我使用的获取与结束时间相关的方法会导致很大的开销。
对于“在特定时间内运行”的模式,我在循环条件中使用new Date对象,然后将其更改为更快的System.currentTimeMillis()来尝试节省时间,但我注意到即使这样也会引起开销。
我的run函数如下:
public void run() {
if (mode) {
while (completed < repitions) {
resultSet[randy.nextInt(o)]++;
completed++;
}
} else {
while (System.currentTimeMillis() < endTime) {
resultSet[randy.nextInt(o)]++;
completed++;
}
}
done = true;
}
当 mode
为真时表示运行指定次数,randy
是一个随机数生成器,o
表示可能的结果数量,endTime
表示以毫秒为单位的终点时间,系统时间(可以被修改,程序接受一定量的秒数,endTime
被计算为当前时间加上 secondsInput * 1000
)。
此外,在同一台 Core i3-7100U 上,这是我的性能统计数据:
DE-WEY-LAPTOP:/mnt/c/Users/danny/Documents/Programming/Data Structures/Probability$ java Main -n 10000000000
Running 10000000000 repitions of the probability simulator with 2 possible outcomes.
4 threads detected on system; doing 2500000000 repitions per thread.
Done. Gathering results from worker threads...
Done. Printing results...
Outcome 1: 4999997330 out of 10000000000 (49.9999733%)
Outcome 2: 5000002670 out of 10000000000 (50.0000267%)
Time taken: 43.443 seconds (2.301866813986143E8 ops/sec)
DE-WEY-LAPTOP:/mnt/c/Users/danny/Documents/Programming/Data Structures/Probability$ java Main -t 44
Running the probability simulator for 44 seconds using 4 threads.
Done. Gathering results from worker threads...
Done. Printing results...
Outcome 1: 141568074 out of 283130850 (50.000935609807264%)
Outcome 2: 141562776 out of 283130850 (49.999064390192736%)
Time taken: 44 seconds (6434792.045454546 ops/sec)
我的问题是,有没有一种优化System.currentTimeMillis()
方法调用的方法,可以不用或减少它所需的时间?是否有其他更快的调用可以使用?
System.nanoTime()
更适合您的目的(计时某些操作所需的时间)。另请参见Java中的时间测量开销。 - Mick MnemonicSystem.currentTimeMillis()
283130850 次?我真的认为有更好的方法 - 实现tick
并选择何时检查给定时间是否小于当前时间。 - zlakad