私は発見を行い、アプリケーションでテストしました。同じメソッドを呼び出して呼び出しています。
さまざまな連続実行とさまざまな方法(暗号化、並べ替えなど)を試したところ、次の結果が得られました。
Executions|Invoke-Call ratio
1 | 62,78%
10 | 107,58%
100 | 76,74%
1000 | 80,01%
10000 | 116,88%
100000 | 82,80%
1000000 | 91,67%
複数のスレッドを使用している可能性があるかどうかを確認しましたが、私が知る限りではありません。説明は何でしょうか?
さらに明確にするために、私のベンチマークの抜粋: 呼び出し部分:
Executable executable = new Executable();
Method execute = executable.getClass().getMethod("execute");
System.out.println("# Startup finished.");
for (float i = 0; i <= 6; i++)
{
int executions = (int) Math.pow(10, i);
long start = System.nanoTime();
for (int j = 0; j <= executions - 1; j++)
{
execute.invoke(executable);
}
long stop = System.nanoTime();
long delta = stop - start;
System.out.println("Invoke;" + executions + ";" + delta);
}
System.out.println("# Shutdown finished.");
呼び出し部分:
Executable executable = new Executable();
System.out.println("# Startup finished.");
for (float i = 0; i <= 6; i++)
{
int executions = (int) Math.pow(10, i);
long start = System.nanoTime();
for (int j = 0; j <= executions - 1; j++)
{
executable.execute();
}
long stop = System.nanoTime();
long delta = stop - start;
System.out.println("Invoke;" + executions + ";" + delta);
}
System.out.println("# Shutdown finished.");
この Executable クラスの例では、すべての準備作業を execute メソッドから除外するように特に注意しました。
public class Executable
{
private int index = 0;
private int testsize = 1111111;
private byte[][] plain = new byte[testsize][];
private byte[][] hashed = new byte[testsize][];
private SecureRandom securerandom;
private MessageDigest messagedigest;
public Executable()
{
this.securerandom = new SecureRandom();
this.messagedigest = MessageDigest.getInstance("SHA-256");
for (int i = 0; i <= testsize - 1; i++)
{
this.plain[i] = new byte[8];
this.securerandom.nextBytes(this.plain[i]);
}
}
public void execute()
{
messagedigest.update(this.plain[index]);
this.hashed[index] = messagedigest.digest();
index++;
}
}