私は修士論文のために Java で暗号化 (POT) プロトコルに取り組んできました。暗号ペアリングを使用するため、jPBC ( http://gas.dia.unisa.it/projects/jpbc/ ) と呼ばれる外部 Java ライブラリを使用します。
プロトコルの片側をモバイル デバイスで実行したいので、Android ADT で、プロトコルを開始する 1 つのボタンを備えたシンプルな GUI を作成しました。ただし、私の携帯電話 (Samsung S2 plus、ARM Cortex A9 32 ビット プロセッサ) では、ラップトップ (Intel Core i7、ただし半分のコアしか使用しない) よりもプロトコルの実行速度が約 200 倍遅くなります。プロセッサの違いは 10 倍で説明できるかもしれませんが、確かに 100/200 倍ではないので、パフォーマンスの違いは Android の jPBC ライブラリの非効率性によるものであると考えました。
jPBC ライブラリはすべての計算に BigInteger を多用するため、Android では BigInteger が非常に非効率的であるかどうかを調査することにしました (通常のコンピューターでも非常に効率的ではありません)。電話とラップトップで1200 ビットの BigInteger 計算のループを実行しました。説明できない結果がいくつか出てきました。
10^6加算と減算には、ラップトップでは205 ミリ秒、電話では 48 025 ミリ秒(x 200)かかります。
10^5 乗算と除算には、ラップトップでは 814 ミリ秒、電話では 13 705 ミリ秒かかります (x 17)。
10^3 Modular Exponentiations (modPow) は、ラップトップで 5079 ミリ秒、電話で 22 153 ミリ秒かかります (x 4.5)
これらの結果については多くのことが述べられているため、次の単純な質問に固執します。
誰でもこれらの結果を再現して、BigInteger の追加が Android で非常に遅いことを確認できますか、それとも私が間違ったことを教えてもらえますか?
コード:
Java メソッド:
public static long bigIntCalculations(){
System.out.println("starting bigIntCalculations");
Random random = new Random();
BigInteger start = new BigInteger(1200, random);
BigInteger temp = new BigInteger(start.toString());
long nOfIterations = 1000000L;
long time1 = System.nanoTime()/1000000;
for (long i = 0; i < nOfIterations; i++) {
start = start.add(temp);
start = start.subtract(temp);
}
long result = (System.nanoTime()/1000000)-time1;
System.out.println(result);
return result;
}
Android の場合:
/** Called when the user clicks the button1*/
public void runProtocol(View view) {
long duration = Test.bigIntCalculations();
String result ="Calculations take: " + duration + " ms";
Intent intent = new Intent(this, DisplayMessageActivity.class);
intent.putExtra(CALC_RESULT, result);
startActivity(intent);
}
どうもありがとう!