gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:39:03 25 4
gpt4 key购买 nike

我想在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com