java - 在 ARM v6 上使用 java 将数字转换为字符串的性能

标签 java string arm type-conversion armv6

我正在 ARM v6 处理器上运行 Java 软件。这个程序的性质要求我将一些数字(int 或 float)转换为 String。处理器以 850Mhz 运行。 Java 运行时是 OpenJDK 零虚拟机 1.7.0_21-b02。

我并不期望这里有坚如磐石的表现,但我希望有比我在下面的代码片段中看到的更高效的东西。

    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 计算机上运行此代码片段会返回以下结果:

String.valueOf: 0.39714 s
Float.toString: 0.33295 s
StringBuilder.append, setLength: 0.33277 s
"" + : 0.37581 s

在 ARMv6 处理器上运行完全相同的代码片段会返回以下值:

String.valueOf: 204.78758 s
Float.toString: 200.79659 s
StringBuilder.append, setLength: 180.81551 s
"" + : 267.63036 s

关于如何在此设备上优化我的数字到 int 转换的任何线索?

提前致谢。

最佳答案

“无中生有”的假设,但您在这里观察到的性能差异似乎与 CPU 缓存有关;您的 ARM CPU 的缓存比台式机的 i7 少得多。

您的 float 组中有两个 百万 个元素;这至少需要 8 MB 的存储空间。这 8 MB 需要到达 CPU。

我这里还有一个 i7,缓存大小为:32kb (L1), 256kb (L2), 6MB (L3);四分之三的 float 组可以放入 L3!在您的情况下,似乎一次只能有 32kb...因此存在大量缓存抖动,内存总线流量非常高。

我怀疑如果将数组大小减小到适合 32kb 的大小(例如,尝试仅使用 1000 个 float ),性能数据会更接近。

编辑:您的 CPU 也可能没有 FPU;正如@Voo 提到的那样,这是造成性能损失的主要原因。

所以:

  • 缺少 FPU,
  • 小缓存,
  • 大量数据。

要进行更“真实”的比较,您应该测试较小的数据子集;这至少会缓解(但不会完全消除)缓存问题。

关于java - 在 ARM v6 上使用 java 将数字转换为字符串的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22099453/

相关文章:

java - 如何在 Alfresco 新用户页面点击 "Create User"按钮后自动生成一封带有创建密码的邮件?

javascript - 如何识别字符串中的第一个字符是否是Javascript中的数字

c - C语言中的递归字符串计算器

gcc - 我怎样才能让 ARM MULL 指令在 gcc 的 uint64_t 中产生它的输出?

linux - 了解 U-Boot 进程的 Linux 加载地址

c++ - 使用 arm-none-eabi 进行 Clang 交叉编译

java - JfreeChart 中的自定义数据点标签

java - JOptionPane showInputDialog 如何工作?

java - 一个 JFrame 中的多个 JPanel 不显示顶部面板

c# - C# 中 Substring 的意外行为