4

私はJavaME環境でコードを書いているので、速度は絶対に重要な要素です。私は、あらゆる種類の反映(Java MEで許可されている非常に限られた量でさえ)が非常に大きなボトルネックになる可能性があることをいくつかの場所で読みました。

だから、私の質問はこれです:String.class.getName()遅いですか?どうmyCustomObject.getClass().getName()ですか?それらを「java.lang.String」や「com.company.MyObject」などの文字列定数に単純に置き換える方がよいでしょうか。

ご参考までに、Java MEはデフォルトのシリアル化実装を提供していないため、すべてのプリミティブ(および非プリミティブも)のクラス名が必要です。したがって、独自に実装する必要があります。ネットワークを介した通信とローカルストレージ(RMSだけでなくJSR-75)の両方で機能する汎用シリアル化ソリューションが必要です

編集

私はJava1.3CLDCを使用しています。

4

3 に答える 3

5

String.class.getName()その値は実行前にロードされるため、遅くなることはありません。つまり、コンパイラは行が実行される前にその値を置きます。 実行時に取得されるため、以前よりmyCustomObject.getClass().getName()も少し遅くなります

于 2012-08-01T09:53:43.027 に答える
1

反射は不自然に遅くはありません。思ったほど遅いですが、遅くはありません。まず、リフレクションを介してメソッドを呼び出すには、リフレクションAPIから明らかなすべてのオブジェクトの作成とメソッドの呼び出しが必要です。次に、リフレクションを介してメソッドを呼び出す場合、Hotspotは呼び出しを介して最適化できません。

呼び出しgetClass().getName()は、予想よりも遅くはありません。いくつかの仮想メソッド呼び出しとメンバー変数フェッチのコストです。バージョンは基本的に同じですが、.classプラスまたはマイナスの変数フェッチがあります。

于 2012-07-31T22:16:49.043 に答える
0

Java MEについて話すことはできませんが、リソースに制約のあるシステムでリフレクションを使用することによるオーバーヘッドには驚かされません。耐えられないほど遅いとは思いませんが、名前を変数にハードコーディングすることで改善が見られることは確かです。

シリアル化を検討しているとおっしゃっていたので、 Kryoプロジェクトでどのようにシリアル化が行われたかを調べてみることをお勧めします。それらのメソッドのいくつかが役立つ場合があります。JavaMEで使用できる場合もあります。(残念ながら、私は私との経験がありません)

于 2012-07-31T22:19:32.263 に答える