java - 编译时性能成本

标签 java string compiler-construction

在我看来,在这两种方法中,第一种方法存在与 string concattoCharArray 相关的性能问题。但有人告诉我,这两个操作都发生在编译时,因此没有性能开销。

如果这是真的那么为什么编译时操作不是性能开销?

private final static char[] DigitTens = {
     ("0000000000"+ "1111111111"+"2222222222"+"3333333333"+"4444444444" //
     +"5555555555"+"6666666666"+"7777777777"+"8888888888"+"9999999999")
      .toCharArray();             
};

对比:

private final static char[] DigitTens = {
    '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
    '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
    '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
    '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
    '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
    '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
    '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
    '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
    '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
    '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
};

最佳答案

带有+的字符串连接表达式是constant expression并在编译时解决(JLS §15.28)。但是,toCharArray() 调用是在运行时执行的。总的来说,您的第一个片段相当于:

private final static char[] DigitTens;

static {
    DigitTens = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
            .toCharArray();
}

你的第二个片段相当于:

private final static char[] DigitTens;

static {
    DigitTens = new char[100];
    DigitTens[0] = '0';
    DigitTens[1] = '0';
    ...
    DigitTens[99] = '9';
}

(您可以通过 javap -c 在字节码中自己查看)

最后,不要担心这里的性能;你可能看不出有什么不同。选择您认为更清晰、更易于管理的任何内容。通常情况下,编译代码所花费的时间是无关紧要的,因为编译阶段实际上应该只发生一次,之后您将处理生成的包含字节码的 .class 文件。

我还要指出,在这种特定情况下,DigitTens[i] 只是 i/10,假设 i 在范围 0-99,包括在内。

关于java - 编译时性能成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19185781/

相关文章:

传递参数的 C++ 编译器优化

c++ - 在线裁判系统

java - 使用向后兼容性编译的 java 类是否使用更新版本的 JavaVM 优化?

java - 无法在 JPA @Entity 类中声明 List 属性。它说 'Basic' 属性类型不应该是容器

java - MVC、JSP + Servlet - 如何在应用程序加载时将某些对象放置/附加到应用程序范围?

java - 检查字符串是否包含点

regex - 带数字的 CSV 正则表达式

python - 如何将文本文件读入字符串变量并去除换行符?

java - 在网格首次附加后为网格单元添加(悬停)监听器

java - 如何添加webElement? e.getText() 以字符串格式给出输出,我想添加此输出数字