为什么这个while循环不能每秒打印1000次?

时间:2015-06-21 16:23:12

标签: java loops time while-loop

以下Java方法用于在csv.reader秒内每秒i次打印nLoopsPerSecond个数字:

seconds

通过以下电话:

public void test(int nLoopsPerSecond, int seconds) {
    double secondsPerLoop = 1.0/(double)nLoopsPerSecond;
    long startTime = System.currentTimeMillis();
    long currentTime;
    int i = 0;
    while ((currentTime = System.currentTimeMillis()) < startTime + seconds*1000) {
        System.out.println(i++);
        while (System.currentTimeMillis() < currentTime + secondsPerLoop*1000);
    }
}

我希望这种方法可以执行test(1000,1); 1,000次,但我只有63次。

当我尝试使用此代码查看每个循环实际使用的秒数时

System.out.println(i++);

我希望每个循环打印public void test(int nLoopsPerSecond, int seconds) { double secondsPerLoop = 1.0/(double)nLoopsPerSecond; long startTime = System.currentTimeMillis(); long currentTime; int i = 0; while ((currentTime = System.currentTimeMillis()) < startTime + seconds*1000) { while (System.currentTimeMillis() < currentTime + secondsPerLoop*1000); System.out.println(System.currentTimeMillis() - currentTime); } } 毫秒,但它会打印115毫秒。

请告诉我的代码有什么问题。

4 个答案:

答案 0 :(得分:7)

您是否在Windows上运行? System.currentTimeMillis()参考基础操作系统时钟,在许多版本的Windows上只有60Hz。

答案 1 :(得分:1)

尝试System.nanoTime(),因为您没有测量自纪元以来的时间。 System.currentTimeMillis vs System.nanoTime

答案 2 :(得分:0)

这可能是因为处理需要一些时间。处理器不仅将时间用于执行程序,还在后台执行其他几项功能。因此,您可能会根据处理器负载得到不同的结果。

答案 3 :(得分:0)

您的输出控制台速度不够快。您没有提到如何运行测试以及输出的位置。终端和缓冲区(未使用)的速度将限制程序输出数据的速度。如果运行无缓冲,则程序将始终等待,直到屏幕上显示新行。如果控制台等待屏幕重绘并且屏幕重新绘制为60Hz,那么你的速度为16ms /行,每秒约60行。

在IntelliJ Idea中没有内部循环运行你的代码,我每秒大约有140.000行(并且Idea警告我,它不显示每一行,因为我的输出太快)。

使用内循环,我得到大约800-900行。之所以会发生这种情况,是因为进程可能是从cpu中调度出来的,或者是因为其他内容而被阻止,比如交换。 (如果我简化了很多,通常桌面操作系统的计划时间为1毫秒。)