2017-02-06 3 views
0

非常に複雑で、同時に動作しているので、私はここで提示すべきコードに苦労しています。sbtを実行する代わりに.jarから実行するとScala JavaFXアプリケーションが遅くなるのはなぜですか?

私は、比較的複雑なJavaFXのグラフを作成し、ScalaアプリケーションからVBoxの内容を更新することが重要です。

今、コンソールウィンドウでsbt runを使用してアプリケーションを実行すると、sceneragphがすぐに読み込まれます。パッケージ化された.jar(これはsbt-one-jarを使用しています)から実行すると、sceenraphは時間がかかります。

すべてがうまくいきます。すべてが同じように動作しますが、.jarから実行すると魔法のように遅くなります。

とにかく、私はそれが非常に啓発的でない場合でも、いくつかのコードを貼り付けます。

def SetVboxSceneGraph(
    id:String, 
    blob:String, 
    handler:(MyEvent)=>Unit 
) 
{ 
    val comp=MyComponent.FromBlob(blob,handler) 

    comp.CreateNode 

    val box=GetMyBox(id) 

    val vbox=box.GetNode.asInstanceOf[VBox] 

    vbox.getChildren().clear() 

    vbox.getChildren().add(comp.GetParent) 
} 

編集:

sillyflyの提案によると、私は、各ステップは、シーングラフの更新にかかる時間を測定しました。遅くの手順は次のとおりです。

 comp.CreateNode 

これは、一部は私がクラスである、いわゆる「MyComponentの」Sを記述するために開発された(「ブロブ」として渡された)XMLマークアップからのJavaFXシーングラフを構築するための責任があること既存のJavaFXウィジェットからカスタムウィジェットを構築します。シーングラフが作成されると、更新には同じ時間がかかります。

+1

これは、任意のシーングラフで発生、またはコンテンツの問題をしていますか? 'System.nanoTime'のようなもので、どのステップに時間がかかるのか絞り込むことができますか([この回答](http://stackoverflow.com/questions/9458234/measuring-time-in-java/9458267#9458267参照) ) 例えば)? – Itai

+0

また、どのステップが正確に遅くなるかを知ることは有益であると私にも気付いた。私は、System.nanoTimeを使用し、経過時間を別の単位で報告することができる、アプリケーション内のTimerクラスを持っています。どのステップが責任あるかという手がかりを得たら、私はその質問を更新します。 – sbtpr

+0

質問が更新されました。 – sbtpr

答えて

1

スタートアップの速度が遅くなる可能性があります。クラスのロードとJVMヒープの拡張です。また、アプリケーションに必要なメモリを少なくして、全体的な処理速度を落とすことも可能です。

build.sbtに設定されている場合を除いて、アプリケーションはビルド時と同じプロセスで実行されます。javaこれは、スタートアップ税(クラスローディング、ヒープ成長)のすべてがすでに支払われていることを意味します。

残念ながら、クラスローディングをスピードアップする方法はありません。ただし、、実質的にあなたのjavaコマンドに両方XmsXmxのフラグを設定することにより、あなたのヒープの成長をスピードアップすることができます。

# This is 2 GB. Pick an appropriate value for your app. 
java -Xms2g -Xmx2g -jar my.jar 
+0

最初に技術的な観察:メモリサイズの前のコロンはエラーを引き起こすので、-Xms2gと-Xmx2gだけです。残念ながら、ヒープパラメータをどの程度大きく選んでも、実行は高速化されません(ヒープサイズをほとんど選択しなくても、それは減速しません)。私が何をしていても、sbtを実行するとまだまだ高速です。 – sbtpr

+0

申し訳ありませんが、コロンはエラーです。あなたはまだ減速している場合は、単にクラスの読み込みです。より最適なクラスパスで複数のjarファイルに分割しようとすることもできますが、それだけではあまり効果がありません。 – jkinkead

+0

私が学ばなければならない教訓は、コンテンツが変化するたびにシーングラフを作成するのではなく、実際にコンテンツを表示するために各コンポーネントを更新するということです。スクロール可能なコンテンツのリストの代わりに、固定フォーマットのコンテンツのページのみを表示します。これはプログラミングと見た目の面ではあまり優雅ではありませんが、少なくとも機能します。 JavaFXでは大型のスクリーングラフを作成するにはコストがかかるという現実を受け入れる必要があります。 – sbtpr

関連する問題