启动“Runnable jar”时,默认情况下不启动控制台。如果您想调用终端,可以在命令提示符下运行(对于Windows用户)“java -jar nameofyourprogram.jar”,您将能够看到控制台。
我的问题是,当您使用System.out.println()时,如果未显示您的控制台并且您将信息打印到控制台,它是否仍会被打印?是否会使你的程序变慢(对于大量的打印语句)
当然使用GUI你不会加载控制台,除非你运行我上面的命令,所以如果你有很多打印语句,它是否仍会影响程序的速度,它们是否仍然打印? (甚至认为没有显示终端/控制台)
答案 0 :(得分: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()
是使用QueryPerformanceCounter
/QueryPerformanceFrequency
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频率的值(模数可能有效的任何速度限制或电源管理。)
答案 1 :(得分:1)
当然,使用GUI你不会加载控制台,除非你运行我上面的命令,所以如果你有很多打印语句,它是否仍会影响程序的速度,它们是否仍然打印?< / p>
任何性能问题的最佳答案是测试它。这是一个快速示例程序:
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纳秒的结果。 (显然我已经运行了几次 - 这些只是典型的结果。)因此,虽然写入一个实际上没有做任何事情的控制台的效率要高得多,但它远非免费。是否在您的应用程序中出现问题是另一回事。
不是,据我所知,输出真的不是写在任何地方。如果您正在使用它进行日志记录,那么最好使用专用的日志记录包,这样可以禁用它以实现更高效的无操作日志记录,还允许您登录到特定文件或任何地方想。