如果不存在控制台,是否仍显示控制台文本



当启动"Runnable jar"时,默认情况下不会启动控制台。如果你想调用终端,你可以在命令提示符下运行(对于Windows用户("java -jar nameofyourprogram.jar",你将能够看到控制台。

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

当然,使用 GUI,除非您运行我上面放置的命令,否则您将不会加载控制台,因此如果您有很多打印语句,它是否仍然会影响程序的速度,它们是否仍然打印?(甚至认为没有显示终端/控制台(

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 频率大致相似的值(对可能生效的任何速度限制或电源管理进行模数计算(。

当然,使用 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 纳秒。(显然我已经运行了几次 - 这些只是典型的结果。因此,虽然写入实际上没有做任何事情的控制台的效率要高得多,但它远非免费。它是否是应用程序中的问题是另一回事。

不,据

我所知,输出真的没有写在任何地方。如果您将其用于日志记录,则最好使用专用的日志记录包,这将允许您禁用它以实现更高效的无操作日志记录,并且还允许您记录到特定文件或您想要的任何位置。

相关内容

最新更新