3

考虑以下 Java 中的简单代码:

void func(String test)
{
    if(str.length() > 0)
    {
       //do something
    }
}

执行 str.length() > 0 是否意味着每次调用此函数时,都会分配 4 字节的内存来存储 0 整数值?

4

6 回答 6

2

如果您编写干净、清晰和简单的代码,JIT 将在 95% 以上的情况下对代码进行最佳优化。如果你试图让它变得更聪明,你更有可能让代码变得更糟,而不是更好。

这条规则有一些值得注意的例外,但这些往往只持续几年。例如,Java 5.0 中的锁比同步快得多,但在 Java 7 中,同步可以快得多。

在考虑性能时,您应该查看整个系统的行为,而不是单个代码行甚至单个库。不这样做可能意味着你花时间担心一些没有区别的事情,而忽略了更重要的事情。

多年来,我已经看到整个团队致力于优化系统的一部分,而他们本可以通过更改配置设置来加快整个过程。这是因为他们将他们的视野限制在他们正在编写的代码上,并且没有考虑他们如何使用他们所连接的系统。想象一下,当他们本可以通过一些微不足道的事情看到更多的加速时浪费了多年的工作,并确保这不会发生在你身上。;)

于 2012-12-26T10:19:57.027 回答
2

运行此函数(包括0)所需的内存将是编译程序(.class / .jar/.apk)的一部分,与函数运行的次数无关。即使函数是内联的,只有代码大小会根据函数被调用的不同位置的数量而增长,并且在代码运行时在运行时没有内存分配。

同时 2 条评论

  • 硬编码存在更大的问题。
  • 除了最严格的意义上,我怀疑length > 0算作硬编码。
于 2012-12-26T09:29:52.210 回答
0

此代码执行时不进行内存分配。

于 2012-12-26T09:29:40.530 回答
0

从内存分配的角度来看,在上面的代码中它看起来并不严重。

如果(str.length()> 0){}

这里是比较的真正要求,因此它不会被视为硬编码值。

如果您对内存使用非常严格,那么请始终选择确切的所需数据类型。

于 2012-12-26T09:45:46.823 回答
0

此代码是本地方法,因此执行后内存将自动回收。因为它是内部方法。

于 2012-12-26T09:49:39.517 回答
0

是的,但在退出函数后立即销毁。intprimitive type。原始类型在 Java 中被认为是最快的。所以,我觉得不会花很多钱。

于 2012-12-26T09:50:38.560 回答