9

Java での sha256 の計算が遅いことがわかりました。たとえば、python よりも遅いです。1GB のゼロの sha256 を計算する 2 つの簡単なベンチマークを書きました。どちらの場合も結果は同じで正しいですが、python の時間は 5653ms で、java の時間は 8623ms (53% 遅い) です。結果は毎回同じで、これは私にとって重要な違いです。

Javaでの計算を高速化するには?

ベンチマーク:

ジャワ:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class BenchmarkSha256 {

  public static void main(String... args) throws NoSuchAlgorithmException {
    int size = 1024 * 1024;
    byte[] bytes = new byte[size];
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    long startTime = System.nanoTime();
    for (int i = 0; i < 1024; i++)
      md.update(bytes, 0, size);
    long endTime = System.nanoTime();
    System.out.println(String.format("%1$064x", new java.math.BigInteger(1, md.digest())));
    System.out.println(String.format("%d ms", (endTime - startTime) / 1000000));
  }

}

パイソン:

#!/usr/bin/env python

import hashlib
import time

size = 1024 * 1024
bytes = bytearray(size)
md = hashlib.sha256()
startTime = time.time()
for i in range(0, 1024):
  md.update(bytes)
endTime = time.time()
print "%s\n%d ms" % (md.hexdigest(), (endTime - startTime) * 1000)

結果:

~> java BenchmarkSha256
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14
8623 ms

~> python BenchmarkSha256.py 
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14
5653 ms

Java と Python のバージョン:

~> java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

~> python --version
Python 2.7
4

4 に答える 4

5

データを段階的にフィードしようとしましたか? バイトを使用して、 ?messageDigest.update()で最終的なダイジェストを取得できます。messageDigest.digest()

メモリに 1 GB の配列を割り当てるのは、かなり分厚い操作です。最終的には、小さな増分更新の方が高速であることがわかる場合があります。

于 2011-10-21T08:33:20.930 に答える
3

2 つのコマンド ライン プログラムを比較するためにこれを行う場合を除き、これは最適なテストとは言えません。主に、これらの数値は、各プログラムに関連するオーバーヘッドの大きな違いによって汚染されています。VM の開始時間は異なります。メモリ割り当て速度は異なります。

これを少しきれいにするために、コード自体の中で実際の MD5 計算の前後に 2 つの時間サンプルを取得します。

これにより、ハッシュ操作自体のパフォーマンスが実際に測定されます。

于 2011-10-21T08:35:53.137 に答える
0

Java ツールのパフォーマンスを少し向上させることができるかもしれませんが、Python の実装は通常より高速になります。

あなたのプロジェクトが Java に他に大きな依存関係がない場合は、Python 実装を使用することをお勧めします。

于 2011-10-21T09:00:46.717 に答える