12

我正在创建一个 Java 应用程序,它将进行一些处理,然后需要显示一条消息以向用户提供反馈。

然而,它似乎非常慢 - 需要两秒钟以上才能返回。

我将源代码剥离到明显的罪魁祸首,这是使用的代码:

package SwingPlay;

import javax.swing.JFrame;

public class Dialog
{

    public static void main( String[] args )
    {
        JFrame frame = new JFrame( "DialogDemo" );
    }

}

我从命令行执行这个:

java -classpath . SwingPlay.Dialog

正如你所看到的——我什么也没做,只是创建了一个 JFrame,甚至没有显示它。

如果它是相关的,这是我的java -version输出:

java version "1.6.0_11"
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)

这是(当前)针对 Win XP SP2 运行的。


所以,第一个问题:为什么这么慢?

更重要的是,我只想立即显示一条简单的消息(GUI,而不是 cmdline)——任何人都可以提供一些代码来做到这一点吗?


更新:

一些背景知识可能会有所帮助:
我正在创建一个应用程序,它将有许多“头”(即不同的用户界面都使用相同的核心类来完成复杂的部分)。
我目前有一个可以正常工作的纯命令行头 - 立即响应。
我还将有一个带有常规点击 GUI 的标准应用程序,并且不要预见这一点会出现问题。
我目前正在处理的是这两者的混合体 - 它将从运行框(或类似的启动器)启动,可能带有参数,并且只需要有效地响应状态消息,可以用按键。

后一个是问题的重点。

虽然我不反对将我现有的命令行版本与 shell 脚本一起使用(尽管认为没有必要!),但现有的答案似乎表明事情对我来说并没有像其他人那样快 - 一个示例对我来说需要 1460 毫秒,而 70 毫秒 - 一个显着的差异。

4

10 回答 10

11

延迟它的原因是因为 Java 是一种解释语言,并且需要时间来启动一个新的 JVM(解释器)

实际上创建框架只需不到几毫秒(在我的机器中大约需要 70 毫秒)。

如果要在 Java 应用程序中使用它,则无需担心。这几乎是瞬时的(您应该为此使用 JDialog 或 JOptionPane )

如果这不会在 Java 应用程序中使用,并且 2 秒太多(我认为太多了),那么您应该考虑另一种工具来完成这项工作。

这是我在您的代码中测量时间的方法:

import javax.swing.JFrame;

public class Dialog {

    public static void main( String[] args ) {
        long start = System.currentTimeMillis();
        JFrame frame = new JFrame( "DialogDemo" );
        System.out.println( "Took: " + (  System.currentTimeMillis() - start   ) );
    }

}
于 2009-02-03T21:03:25.757 回答
4

我会使用JOptionPane来显示消息。这是一个简单的例子:

import javax.swing.*;

public class OptionDemo {
    public static void main(String[] args) throws Exception {
        JOptionPane.showMessageDialog(null, "Hello World");
    }
}

不过,恐怕我无法解释您遇到的延迟。在我的系统上,您的代码片段在 500 毫秒内运行。

于 2009-02-03T20:36:54.467 回答
3

Java 是错误的工具。设置 JVM 涉及在执行第一行 Java 代码之前在后台发生的很多事情,而且真的没有办法绕过它。

于 2009-02-03T20:47:50.887 回答
2

你需要使用java来显示消息框吗?如果该框来自您的应用程序之外,那么您可能想要使用其他东西来生成一个对话框。

要制作一个仅从命令行字符串显示消息框的本机 Windows 应用程序,最多只需要几个小时。大多数常见的脚本语言也应该有办法做到这一点。这是某个人通过命令行通过 javascript 提供的示例:

http://www.snee.com/bobdc.blog/2009/01/displaying-a-message-box-from.html

于 2009-02-03T23:57:25.827 回答
2

此外,创建AWT Window(或者可能是Frame)而不是JFrame会快得多,因为后者必须引入大量额外的类文件。

于 2009-02-03T20:24:06.583 回答
1

你可以使用 JOptionDialog

JOptionPane.showMessageDialog([parent frame], [message], [title], JOptionPane.MESSAGE_TYPE);
于 2009-02-03T20:37:14.950 回答
1

哦,如果你真的不需要从 Java 显示对话框,你可以考虑使用KDialog(或者它的 GNOME 对应物)或类似的东西。

于 2009-02-03T20:26:21.400 回答
1

由于您有兴趣加快这一速度,并且由于大部分开销似乎是 JVM 启动开销,因此请查看Nailgun,它旨在通过让 JVM 始终在后台运行来解决缓慢的 JVM 启动问题。在您的情况下,在一次运行之后,Swing 库也将最终被缓存(希望在再运行几次之后也被 JITed),进一步减少开销。

但是,由于后台 JVM,这种方法会导致内存使用量增加,并且还会导致其他问题,因为确定何时关闭它可能并不简单。

于 2013-06-28T21:14:37.650 回答
0

您可能正在寻找的是Java 6 中的新 SplashScreen 功能。无需等待 JVM 加载(加载任何 VM 总是有成本的),这将预先加载一个屏幕。

于 2009-02-03T20:12:53.813 回答
0

您是否尝试过通过像NetBeans这样的分析器运行它?如果标准库深处存在瓶颈,那么这是找到它的好方法。

于 2009-02-03T21:49:18.423 回答