【发布时间】:2014-04-01 17:00:18
【问题描述】:
我在 ARM v6 处理器上运行 Java 软件。这个程序的性质要求我将一些数字(int 或 float)转换为 String。处理器以 850Mhz 运行。 Java Runtime 是 OpenJDK Zero VM 1.7.0_21-b02。
我并不期待这里有坚如磐石的性能,但我希望比我在下面的代码 sn-p 看到的更有效。
long time1, time2;
float[] src = new float[2000000];
for (int i = 0; i < src.length; i++) {
src[i] = (float)Math.random()* 2.56454512f * (float) Math.random();
}
time1 = System.nanoTime();
for (int j = 0; j < src.length; j++) {
String test = String.valueOf(src[j]);
}
time2 = System.nanoTime();
logTimeDelay("String.valueOf", time1, time2);
time1 = System.nanoTime();
for (int j = 0; j < src.length; j++) {
String test = Float.toString(src[j]);
}
time2 = System.nanoTime();
logTimeDelay("Float.toString", time1, time2);
StringBuilder sb = new StringBuilder(50);
time1 = System.nanoTime();
for (int j = 0; j < src.length; j++) {
sb.setLength(0);
sb.append(src[j]);
}
time2 = System.nanoTime();
logTimeDelay("StringBuilder.append, setLength", time1, time2);
time1 = System.nanoTime();
for (int j = 0; j < src.length; j++) {
String test = "" + src[j];
}
time2 = System.nanoTime();
logTimeDelay("\"\" + ", time1, time2);
private static void logTimeDelay(String message, long time1, long time2){
System.out.println(String.format(message + ": %.5f s", (float) (time2 - time1) / 1.0e9));
}
在我的 i7 电脑上运行这段代码 sn-p 会返回以下结果:
String.valueOf: 0.39714 s
Float.toString: 0.33295 s
StringBuilder.append, setLength: 0.33277 s
"" + : 0.37581 s
在 ARMv6 处理器上运行完全相同的代码 sn-p 会返回以下值:
String.valueOf: 204.78758 s
Float.toString: 200.79659 s
StringBuilder.append, setLength: 180.81551 s
"" + : 267.63036 s
关于如何在此设备上优化我的数字到 int 转换的任何线索?
提前致谢。
【问题讨论】:
-
对arm了解不多...L1/L2指令/数据缓存的大小是多少?
-
该处理器是双 CPU ARM11MPcore,运行频率为 850MHz,具有 32KB 指令缓存和 32KB 数据缓存。
-
这是L1;如果有的话,L2 呢?
-
有一个 LEON2 协处理器可用,但我不相信有任何 L2 缓存。
标签: java string arm type-conversion armv6