Google の Caliper プロジェクトを使用して、いくつかのマイクロベンチマークを作成するよう依頼されました。最新のベータ スナップショットの注釈機能を使用したいと思っていますが、いくつかの小さな例を除けば、実際に実行する方法に関する適切なドキュメントを見つけるのに苦労しています... ユーザーに指示するビデオ チュートリアルがあります。新しい Maven 統合機能も使用しないように求められました。
現在、私は別のSOの質問から収集した他の情報で変更された、彼らの1つから取り除かれた小さな例を持っています:
public class Benchmarks {
public class Test {
@Param int size; // set automatically by framework
private int[] array; // set by us, in setUp()
@BeforeExperiment void setUp() {
// @Param values are guaranteed to have been injected by now
array = new int[size];
}
@Benchmark int timeArrayIteration(int reps) {
int dummy = 0;
for (int i = 0; i < reps; i++) {
for (int doNotIgnoreMe : array) {
dummy += doNotIgnoreMe;
}
}
return dummy;
}
}
//(Questionable practice here?)
public static void main (String args[]) {
CaliperMain.main(Test.class, args);
}
}
実行すると、サイズのデフォルト値を設定していないというメッセージが表示されます。どこに置くべきかを追跡するのに苦労しています。
@Param 行をコメントアウトして「サイズ」を完全に削除し、setUp の配列宣言に厳密な値を指定すると、「実行する実験はありません」と判断されますが、これは理にかなっていると思います。
私が間違っていることを指摘できる最新のリソースやチュートリアルがあれば (おそらく、正直なところ、かなりの数)、私は非常に感謝しています。
編集:
私はいくつかのアドバイスに従ってこれに更新しました:
public class Benchmarks {
@Param({"1", "10", "1000"}) int size; // set automatically by framework
private int[] array; // set by us, in setUp()
@BeforeExperiment void setUp() {
// @Param values are guaranteed to have been injected by now
array = new int[size];
}
@Benchmark int timeArrayIteration(int reps) {
int dummy = 0;
for (int i = 0; i < reps; i++) {
for (int doNotIgnoreMe : array) {
dummy += doNotIgnoreMe;
}
}
return dummy;
}
}
ベータ スナップショットを実行し、Benchmarks クラスを引数として渡しています。私は以下を受け取ります:
Experiment selection:
Instruments: []
User parameters: {size=[1, 10, 1000]}
Virtual machines: [default]
Selection type: Full cartesian product
There were no experiments to be performed for the class Benchmarks using the instruments [allocation, runtime]
インストゥルメントを検出していないようです。ドキュメントには、デフォルトの割り当てであるランタイムを使用するだけであると記載されているため、渡していません(これは私の目的には問題ありません)。
ダブル編集:その問題、ばかげた間違いを見つけました。確認次第、簡単に追記します。