0

私は修士論文のために 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);  
}

どうもありがとう!

4

1 に答える 1