私はJavaからC++への特定のデータ処理アルゴリズムを移植しています。コードを書き直す理由は移植性です。Javaが利用できない環境で実行する必要があります。しかし、副次的なメリットとして、パフォーマンスの向上が期待されていました。Javaの.getClass()はどれくらいの費用がかかりますか?
基本的に、アルゴリズムは、相互にポインタを持つオブジェクトで構成されたグラフからデータを読み取り、結果を計算します。計算中に多数のオブジェクトの割り当てが行われるため、おそらくこれが減速の原因となります。つまり、C++コードは現在のところ、古いJavaコードより約10倍高速です。これは本当に予想外でした。私は50-60%の改善が見られると思っていました。
残念ながら、私は分析のためにここにコードを掲載する自由はありません。とにかく便利だとは思えません。
ところで、アルゴリズムはほぼ同じです。私が考えることができる唯一の大きな違いは、Javaでは単一のスーパークラスの多くの娘クラスがあり、if(object.getClass()== daughterx.class)が計算中に何度も呼び出されるのに対し、C++コードでは一般クラスが使用されます(娘クラス間のコードの違いが少ないため)。単純な整数比較が使用されます。 if(object-> type == 15)
JavaのObject.getClass()メソッドの高さはどれくらいですか?このメソッドが呼び出されたときに、低レベルで正確には何が起きていますか?
倍に向上しましたどちらもないのJavaを理解していない他の人のいずれかであります! ;) – cheeken
@cheekenそれはJVMに依存しますが、JITがなければ、JavaはPythonよりも遅いと思います。 –
正直なところ、これは問題ではないようです。推奨されていないコードをベンチマークしプロファイリングするのは貴重な時間ですか?あなたがそれをしない限り、 '.getClass()'がボトルネックであることを知る方法はありません。推測は、アルゴリズムの全体的な複雑さを大幅に減らすことができない(つまり、N-squared操作からlog-N操作に移行する)ことができ、データセットが非常に大きい場合を除き、パフォーマンスの問題をデバッグするのに役立ちません。 –