問題タブ [microbenchmark]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java で正しいマイクロベンチマークを作成するにはどうすればよいですか?
Java で正しいマイクロベンチマークを作成 (および実行) するにはどうすればよいですか?
考えるべきさまざまなことを示すコードサンプルとコメントを探しています。
例: ベンチマークは時間/反復または反復/時間を測定する必要がありますか? その理由は?
c - Intel Core 2 Duo の命令パイプラインをドレインしますか?
C でいくつかの非常に短い操作のマイクロ ベンチマーク コードを書いています。たとえば、渡された引数の数に応じて、空の関数を呼び出すのに必要なサイクル数を測定しています。
現在、各操作の前後にRDTSC命令を使用してタイミングを計り、CPUのサイクル数を取得しています。ただし、最初の RDTSC の前に発行された命令が、測定している実際の命令の速度を低下させる可能性があることを懸念しています。また、2 番目の RDTSC が発行される前に完全な操作が完了しないのではないかと心配しています。
新しい命令が発行される前に、実行中のすべての命令を強制的にコミットする x86 命令を知っている人はいますか? CPUIDがこれを行う可能性があると言われましたが、そう言っているドキュメントを見つけることができませんでした.
java - 同じメソッドを 2 回連続して呼び出すと、実行時間が異なるのはなぜですか?
サンプルコードは次のとおりです。
}
これにより、次の出力が得られます。何かキーを押すと続行します 。. .
同じメソッドを初めて実行するのに、連続して呼び出すよりも時間がかかるのはなぜですか?
コマンドラインにあげ-XX:CompileThreshold=1000000
てみましたが、違いはありませんでした。
java - 初めて Java ループが SLOW で実行されるのはなぜですか? [Sun HotSpot 1.5、sparc]
Solaris SPARC ボックスでいくつかの Java コードのベンチマークを行っているときに、ベンチマークされた関数を初めて呼び出したときに、実行速度が非常に遅い (10 倍の差) ことに気付きました。
- 最初 | 1 | 25295.979 ミリ秒
- セカンド | 1 | 2256.990 ミリ秒
- サード | 1 | 2250.575 ミリ秒
どうしてこれなの?JIT コンパイラが疑わしいのですが、これを確認する方法はありますか?
編集:いくつかの回答に照らして、このコードがこの動作を示すことができる最も単純なテストケースであることを明確にしたかったのです。したがって、私の目標は、高速に実行することではなく、何が起こっているのかを理解して、実際のベンチマークで回避できるようにすることです。
解決済み: Tom Hawtin は、私の "SLOW" タイムが実際には妥当であると正しく指摘しました。この観察に続いて、デバッガーを Java プロセスに接続しました。最初のループでは、内側のループは次のようになります。
次の反復では、ループは次のようになります。
そのため、HotSpot は内側のループからメモリ アクセスを削除し、1 桁高速化しました。
レッスン:計算してみよう! トムの計算は自分でやるべきだった.
ベンチマーク Java コード:
java - Python プログラムは、同じプログラムの Java バージョンよりも高速に実行されます。何を与える?
更新: 2009-05-29
すべての提案とアドバイスに感謝します。 私はあなたの提案を使用して、数日前の最高の結果よりも平均で 2.5 倍高速に実稼働コードを実行できるようにしました。 最終的にJavaコードを最速にすることができました。
教訓:
以下のコード例は、プリミティブ int の挿入を示していますが、製品コードは実際には文字列を格納しています (私の悪い点です)。Pythonの実行時間が2.8秒から9.6秒になったことを修正しました。そのため、オブジェクトを格納するときは、実際には Java の方が高速でした。
しかしそれだけではありません。次のようにJavaプログラムを実行していました。
Java -Xmx1024m SpeedTest
しかし、初期ヒープ サイズを次のように設定すると、大幅な改善が得られます。
この単純な変更により、実行時間が 50% 以上短縮されました。したがって、SpeedTest の最終結果は python 9.6 秒です。Java 6.5 秒。
元の質問:
次のpythonコードがありました:
私のマシンでは約 3.3 秒で実行されましたが、もっと速くしたかったので、Java でプログラムすることにしました。Java はコンパイルされており、一般に Python よりも高速であると考えられているため、大きな見返りが得られると思いました。
Javaコードは次のとおりです。
したがって、この Java コードは基本的に Python コードと同じことを行います。しかし、3.3 秒ではなく 8.3 秒で実行されました。
単純化するために、この単純な例を実際の例から抽出しました。重要な要素は、例のように多くのメンバーで終わる (set または hashSet) があることです。
ここに私の質問があります:
Python の実装が Java の実装よりも速いのはなぜですか?
一意のコレクションを保持するために、hashSet (java) よりも優れたデータ構造はありますか?
Python の実装を高速化するにはどうすればよいでしょうか?
Java の実装を高速化するにはどうすればよいでしょうか?
アップデート:
これまでに貢献してくれたすべての人に感謝します。詳細を追加させてください。
非常に複雑なため、本番コードは含めていません。そして、多くの気晴らしを生み出すでしょう。上記のケースは、可能な限り単純化したものです。つまり、java の put 呼び出しは、python set の add() よりもはるかに遅いようです。
本番コードの Java 実装も、上記と同様に、Python バージョンよりも約 2.5 ~ 3 倍遅くなります。
VM のウォームアップや起動時のオーバーヘッドは気にしません。startTime から totalTime までのコードを比較したいだけです。他のことは気にしないでください。
ハッシュセットを再ハッシュする必要がないように、十分な数のバケットを使用してハッシュセットを初期化しました。(コレクションに最終的に含まれる要素の数は常に前もってわかっています。) 私は、コレクションを iterations/0.75 に初期化するべきだったと主張することができると思います。しかし、試してみると、実行時間に大きな影響がないことがわかります。
好奇心旺盛な人のために Xmx1024m を設定しました (私のマシンには 4GB の RAM があります)。
Java バージョン: Java(TM) SE ランタイム環境 (ビルド 1.6.0_13-b03) を使用しています。
のプロダクション バージョンでは、hashSet に文字列 (2 ~ 15 文字) を格納しているため、プリミティブを使用できませんが、これは興味深いケースです。
コードを何度も実行しました。私は、Python コードが Java コードよりも 2.5 倍から 3 倍高速であることを確信しています。
php - 簡単なパフォーマンス テストを行うためのより良い方法
操作のパフォーマンスを比較する場合、これは通常、テストを行う方法です。
これらのテストを行うためのより良い方法、おそらくより信頼できる方法はありますか? 同じテストを数回実行すると、大きく異なる結果が得られるようです。たとえば、上記を数回実行したところ、これが得られました。
実行ごとにわかるように、結果は大きく異なる場合があります。
java - Java での小さな配列とリストのベンチマーク: 私のベンチマーク コードは間違っていますか?
免責事項:私はこの質問とこの質問に目を通しまし たが、どちらも細部と一般的な最適化は不要な懸念によって脱線しました。現在のアプリで得られるすべてのパフォーマンスが本当に必要です。このアプリは、リアルタイムで MIDI データを受信し、処理し、吐き出しています。また、可能な限りスケールアップする必要があります 。
array
小さなリストの多数の読み取りでのパフォーマンスとArrayList
、変数を手に持っているだけのパフォーマンスを比較しています。私は、配列ArrayList
が 2.5 倍も優れており、オブジェクト参照だけを上回っていることを発見しました。
私が知りたいのは:
- 私のベンチマークは大丈夫ですか?テストの順序と実行回数を変更せずに入れ替えました。また、ナノ秒の代わりにミリ秒を使用しても無駄になりました。
- この違いを最小限に抑えるために、Java オプションを指定する必要がありますか?
- この違いが本当なら、この場合、この状況でそれらを変換するために必要なコードを入れるべきではないでしょ
Test[]
うか?ArrayList<Test>
明らかに、私は書くことよりも多くのことを読んでいます。
JVM は OSX 上の Java 1.6.0_17 であり、間違いなく Hotspot モードで実行されています。
java - Javaforループのパフォーマンスに関する質問
この例を考えると:
vs
これは何か違いがありますか?私のマシンでは、2番目のマシンの方がパフォーマンスが速いようですが、本当に正確かどうかはわかりません。コンパイラはこのコードを最適化しますか?ループ条件が不変オブジェクト(文字列配列など)の場合、彼はそうするだろうと思います。
assembly - マルチコアプロセッサでベンチマークする方法
マルチコアプロセッサでマイクロベンチマークを実行する方法を探しています。
コンテクスト:
ほぼ同時に、デスクトッププロセッサは、パフォーマンスの予測を困難にするアウトオブオーダー実行を導入しましたが、偶然ではないかもしれませんが、非常に正確なタイミングを取得するための特別な命令も導入しました。これらの手順の例はrdtsc
、x86およびrftb
PowerPCにあります。これらの指示により、システムコールで許可されるよりも正確なタイミングが得られ、プログラマーは、良くも悪くも、自分の心をマイクロベンチマークすることができました。
いくつかのコアを備えたさらに最新のプロセッサでは、一部はスリープ状態になることがあり、カウンタはコア間で同期されません。rdtsc
ベンチマークに使用するのはもはや安全ではないと言われていますが、代替ソリューションについて説明されたとき、私は居眠りをしていたに違いありません。
質問:
一部のシステムでは、パフォーマンスカウンターを保存および復元し、適切な合計を読み取るためのAPI呼び出しを提供する場合があります。この呼び出しがオペレーティングシステムに対して何であるかを知っている場合は、回答でお知らせください。
一部のシステムでは、コアをオフにして、1つだけを実行したままにすることができます。Mac OS X Leopardは、開発者ツールから適切な設定ペインがインストールされている場合に機能することを知っています。rdtsc
これで安全に再利用できると思いますか?
その他のコンテキスト:
マイクロベンチマークを実行しようとするときに、自分が何をしているのかを知っていると仮定してください。アプリケーション全体のタイミングで最適化のゲインを測定できない場合は、最適化する価値がないという意見がある場合は、同意しますが、
代替データ構造が完成するまで、アプリケーション全体の時間を計ることができません。これには長い時間がかかります。実際、マイクロベンチマークが有望でない場合は、今すぐ実装をあきらめることにすることができます。
締め切りを管理できない出版物で提供する数字が必要です。
java - マイクロベンチマークとは何ですか?
この用語が使われているのを聞いたことがありますが、それが何を意味するのか完全にはわかりません。
- それは何を意味し、何を意味しないのでしょうか?
- IS と ISN'T のマイクロベンチマークの例をいくつか教えてください。
- マイクロベンチマークの危険性とそれを回避する方法
- (それとも良いことですか?)