0

我一直在为我的硕士论文研究 Java 中的加密 (POT) 协议。它使用加密配对,因此使用了一个名为 jPBC ( http://gas.dia.unisa.it/projects/jpbc/ ) 的外部 java 库。

由于我希望协议的一侧在移动设备上运行,因此我在 Android ADT 中制作了一个简单的 GUI,其中包含一个启动协议的按钮。但是,该协议在我的手机(Samsung S2 plus,ARM Cortex A9 32 位处理器)上的运行速度比在我的笔记本电脑(Intel Core i7,但只使用半个内核)上慢约 200 倍。由于处理器的差异可能解释了 10 倍但肯定不是 100/200 倍,我认为性能差异可能是由于 Android 上 jPBC 库的低效率。

jPBC 库在其所有计算中广泛使用 BigInteger,因此我决定调查 BigInteger 在 android 上是否会更加低效(在普通计算机上也不是超级高效)。我在手机和笔记本电脑上执行了一个1200 位 BigInteger 计算循环。我想出了一些我无法解释的结果:

10^6加法和减法在笔记本电脑上需要 205 毫秒,在手机上需要 48 025 毫秒(x 200)

10^5 乘法和除法在笔记本电脑上需要 814 毫秒,在手机上需要 13 705 毫秒 (x 17)。

10^3 模幂运算 (modPow) 在笔记本电脑上需要 5079 毫秒,在手机上需要 22 153 毫秒 (x 4.5)

由于这些结果有很多话要说,我将坚持这个简单的问题:

谁能重现这些结果并确认在 Android 上添加 BigInteger 的速度非常慢,或者告诉我我做错了什么?

编码:

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;

}

在安卓中:

/** 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

0

考虑到功能不足的硬件,只有用于 1200 位模幂运算的 x4.5 是一个了不起的结果。这也证明了 JDK 的 BigInteger 实现有多糟糕。

Android 标准库使用 OpenSSL BigNum 进行一些底层操作。如果不偷看,我猜模幂和模逆是在本机代码中处理的,而更简单的算术是在 Java 代码中处理的。

对于加法和乘法的紧密循环,您将产生大量垃圾,并且平台之间的 GC 性能差异也可能产生很大影响——我的猜测是一些预热 + 更小的基准测试将显示更接近的结果。

我的性能痛点是模幂运算,所以我对 Android 的性能非常满意。如果不是这种情况,我会考虑将 gmp4j 或 gmp-java(同名的两个库)等库移植到 Android。其中两个提供了与 BigInteger 兼容的 API。另一个提供到 GMPLib 的更直接映射,这在内存管理方面可能是理想的(GMP 编号是可变的)。

于 2014-01-24T13:44:31.553 回答