2013-10-05 114 views
0

启动“Runnable jar”时,默认情况下不会启动控制台。如果你想调用一个终端,你可以在命令提示符下运行(对于windows用户)“java -jar nameofyourprogram.jar”,你将能够看到控制台。如果没有控制台存在,是否仍然显示控制台文本?

我的问题是当你使用System.out.println()时,如果你的控制台没有显示,并且你将信息打印到控制台,它是否仍然打印?它是否会减慢程序的运行速度(对于大量的打印语句)

当然,使用GUI时,除非您运行上面提到的命令,否则无法安装控制台,因此如果您有大量打印语句,它仍然影响你的程序的速度,他们仍然是打印? (甚至认为不显示终端/主机)

回答

1
does it slow down your program at all (for lots of print statements) 

是 您可以通过使用System.nanoTime();

注意手动测试我见过的人使用System.currentTimeMillis()检查执行时间,但这是不正确的办法 。使用System.nanoTime();检查执行时间。

System.currentTimeMillis()使用GetSystemTimeAsFileTime方法,它本质上只是读取时间的日低分辨率值Windows维护执行。根据所报告的信息,读取这个全局变量自然很快 - 大约6个周期。无论定时器中断是如何编程的,这个时间值都会以恒定的速率更新 - 取决于平台,它将为10ms或15ms(该值似乎与默认中断周期相关)。

System.nanoTime()使用API​​实现(如果可用,则返回currentTimeMillis*10^6)。根据其运行的硬件,以不同方式实现了QueryPerformanceCounter(QPC)。通常它将使用可编程间隔定时器(PIT)或ACPI电源管理定时器(PMT)或CPU级别的时间戳计数器(TSC)。访问PIT/PMT需要执行慢速I/O端口指令,因此QPC的执行时间大约为几微秒。相反,读取TSC的时间大约为100个时钟周期(从芯片读取TSC并将其转换为基于工作频率的时间值)。您可以通过检查QueryPerformanceFrequency是否返回签名值3,579,545(即3.57MHz)来判断您的系统是否使用ACPI PMT。如果您看到1.19Mhz左右的值,那么您的系统正在使用旧的8245 PIT芯片。否则,你应该大致看到一个值,你的CPU频率(模任何速度节流或电源管理,可能是有效。)

+0

是什么让nanoTime比Milli更好? – Loligans

+0

@Loligans检查这个http://stackoverflow.com/questions/351565/system-currenttimemillis-vs-system-nanotime – SpringLearner

1

当然你不会有一个控制台加载的GUI,除非你运行上面提到的命令,所以如果你有很多的打印语句,它是否仍然影响你的程序的速度,他们仍然打印?

任何性能问题的最佳答案是测试它。下面是一个简单的示例程序:

import java.io.*; 

class Test { 

    public static void main(String[] args) throws Exception { 
     // Untimed, for the sake of JIT compilation 
     for (int i = 0; i < 100000; i++) { 
      System.out.println("Foo"); 
     } 
     // Now let's time it. 
     long start = System.nanoTime(); 
     for (int i = 0; i < 100000; i++) { 
      System.out.println("Foo"); 
     } 
     long end = System.nanoTime(); 
     String outputPath = "c:\\users\\jon\\test\\results.txt"; 
     try (FileWriter writer = new FileWriter(outputPath)) { 
      writer.write((end - start) + " nanoseconds"); 
     } 
    } 
} 

从控制台上运行这一点,但它隐藏,我的笔记本电脑,我得到的5604097078纳秒的结果。

从Windows资源管理器运行它,所以没有输出,我得到了3339245234纳秒的结果。(显然我已经运行了几次 - 这些只是典型的结果。)因此,尽管写入一个实际上没有做任何事情的控制台效率会更高,但它远没有免费。在应用程序中是否存在问题是另一回事。

并且不,输出真的不是写在任何地方,据我所知。如果您使用这种方式进行日志记录,最好使用专用的日志记录软件包,该软件包允许您将其禁用以实现更高效的无日志记录,并且还允许您登录到特定文件或任何位置想。

+0

据我可以想象,然后你仍然写入标准输出,但是没有人(例如控制台) ,花时间阅读它。 – Skeen

+0

我可以尝试运行该程序,并将stdout重定向到一个文件,这应该会产生一些GUI执行时间。 – Skeen

+0

如果输出没有推到标准输出上,我实际上会感到非常震惊,只是因为你在GUI模式下运行,因为这显然是程序中的语义变化,比如说如果我将stdout重定向到标准输入,运行在GUI模式(假设禁用打印语句)将改变我的程序输入。 – Skeen