java - JavaFx 中标签上带有 setText 的性能问题

标签 java swing javafx

我想在 os linux gentoo(32 位)下编写一个 Java Fx 应用程序,通过管道测量音量并使用 .setText() 方法在标签上显示该值。 标签上的更新率为每 20 毫秒一次。意味着方法 label.setText(string) 每 20 毫秒调用一次。 在这种情况下,JVM的CPU性能非常高。大约30%!!! 如果我对 java swing 技术做同样的事情,CPU 性能大约是 7%! 目标硬件是带有 2 GB RAM 的 E3825 DualCore Intel Atom(嵌入式系统) Oracel java版本是jre 1.8.0.102 其他 Linux 发行版以及 Windows 10 IoT 上仍然存在该问题。

很奇怪的是,使用swing的性能要好很多。 我尝试在 fx 中的 Canvas 上设置文本。好一些,但也好不了多少。

曾经观察到过同样的行为吗?

感谢您的回答。

附上一个示例,标签上每 10 毫秒显示一个计数器。我有什么问题吗?

这里是 java Fx 的代码示例:

      package appl;

  import javafx.application.Application;
  import javafx.application.Platform;
  import javafx.scene.Scene;
  import javafx.scene.control.Button;
  import javafx.scene.layout.VBox;
  import javafx.scene.text.Font;
  import javafx.scene.text.FontPosture;
  import javafx.scene.text.FontWeight;
  import javafx.stage.Stage;

  public class Main_javafx extends Application {
            public static void main(String[] args) {
                           launch(args);
            }

            @Override
            public void start(Stage primaryStage) {
                           Label label = new Label("0000000000");
                           Button button = new Button("start");
                           VBox root = new VBox();
                           root.getChildren().add(label);
                           root.getChildren().add(button);
                           label.setFont(Font.font("Arial", FontWeight.NORMAL, FontPosture.REGULAR, 100));
                           primaryStage.setScene(new Scene(root));
                           primaryStage.show();
                           button.setOnAction(e -> {
                           new Thread(() -> {
                           for (int i = 0; i < 1000000; i++) {
                               try {
                                               Thread.sleep(10);
                               }
                               catch (Exception ex) {
                               }
                               int ii = i;
                               Platform.runLater(() -> {
                                               label.setText(String.valueOf(ii));
                               });
                           }
                           }).start();

                           });
                           primaryStage.setOnCloseRequest(e -> Platform.exit());
            }

}

最佳答案

我没有在 Swing 中进行测试,但使用此代码而不是您的代码时,CPU 使用率确实提高了约 100%:

public class Main_javafx extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label();
        Button button = new Button("start");
        VBox root = new VBox();
        root.getChildren().add(label);
        root.getChildren().add(button);
        label.setFont(Font.font("Arial", FontWeight.NORMAL, FontPosture.REGULAR, 100));
        primaryStage.setScene(new Scene(root));

        IntegerProperty count = new SimpleIntegerProperty();
        label.textProperty().bind(count.asString());
        Timeline timeline = new Timeline(new KeyFrame(Duration.millis(10), e -> count.set(count.get() + 1)));
        timeline.setCycleCount(Animation.INDEFINITE);
        button.setOnAction(e -> timeline.play());

        primaryStage.show();
    }
}

我没有检查为什么此代码使用较少的 CPU,但我猜测绑定(bind)比手动更新更快和/或线程唤醒- sleep 周期比时间轴慢。

关于java - JavaFx 中标签上带有 setText 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44707849/

相关文章:

java - 比较 SWT 和 SWING

java - 用Java实现视频流?

java - 如何在Java中正确使用MongoDB多线程?

java - 如何在java中的文本区域显示输出

java - 使用 Maven 编译具有所有依赖项的 JavaFX jar

javafx:如何使 TableCell Edit 返回 double 而不是字符串,并且字体会根据条件更改颜色?

javafx - JavaFX 图表中的缩放选择矩形未显示,但缩放工作正常

java - 为什么从 java.util.HashMap[Long,Long] 获取丢失的键会返回 0L?

java - 仅搜索第一列的按列排序二维数组的二进制搜索

java - JComboBox 返回 double 值