首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译时性能成本

编译时性能成本
EN

Stack Overflow用户
提问于 2013-10-04 16:04:01
回答 3查看 188关注 0票数 1

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

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

代码语言:javascript
运行
复制
private final static char[] DigitTens = {
     ("0000000000"+ "1111111111"+"2222222222"+"3333333333"+"4444444444" //
     +"5555555555"+"6666666666"+"7777777777"+"8888888888"+"9999999999")
      .toCharArray();             
};

与:

代码语言:javascript
运行
复制
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',
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-04 16:08:09

+s连接的字符串表达式是一个常量表达式,在编译时解析(JLS§15.28)。但是,toCharArray()调用在运行时执行。总的来说,您的第一个片段相当于以下内容:

代码语言:javascript
运行
复制
private final static char[] DigitTens;

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

第二个片段相当于:

代码语言:javascript
运行
复制
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范围内(包括在内)。

票数 3
EN

Stack Overflow用户

发布于 2013-10-04 16:05:26

回答这个问题

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

他们是。但每次创建程序时,它们只发生一次,在程序运行过程中从未发生过。

我认为我从来没有担心过编译器的性能(除了查看构建的总体结构)。我会代码清晰,不担心性能,除非它成为一个问题。运行时性能也是如此。

票数 1
EN

Stack Overflow用户

发布于 2013-10-04 16:08:13

“编译时间”的性能开销会影响开发人员,可能会在他们的整个生命中花费一毫秒。

运行时性能开销可能每秒发生x次,成本要高得多。

至于您的具体示例,第二种方法的效率略高(可以说是以降低清晰度为代价),因为它消除了在运行时调用toCharArray的需要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19185781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档