我一直在为我的硕士论文研究 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);
}
非常感谢!