代码长度是否会影响性能?

时间:2016-12-01 11:25:31

标签: java performance

我采用以下示例来说明示例,但请注意它可能是任何其他任务。

for (int i =0; i< 1000; i++){     
  String a= "world";
  Log.d("hello",a);
}

对战

String a="";
a="world";
Log.d("hello",a);

String a="";
a="world";
Log.d("hello",a);

String a="";    
a="world";
Log.d("hello",a);

String a="";
a="world";
Log.d("hello",a);

String a="";    
a="world";
Log.d("hello",a);
...
//1000 times

让我们忽略可读性和代码质量,只是编译程序的性能。 哪一个更好?

4 个答案:

答案 0 :(得分:4)

唯一的回答:这个根本不重要。

我的意思是:可读性等方面以及优秀设计 更值得花时间。

何时,只有当你设法设计出一流的应用程序时;而且你已经遇到了性能问题,你必须研究这个具体的问题;好吧,那么研究它会有好处。但我99.9%肯定:你不是在这一点上。从这个意义上讲:你是在浪费你的时间来做这些想法!

换句话说:尤其是在&#34; JVM堆栈中&#34;有大量的东西可以对性能产生微妙或不那么微妙的影响。像:有许多选项影响垃圾收集的内部工作以及即时编译器正在做的事情。这将影响&#34;表现&#34;运行应用程序的方式比手动解压循环代码更重要。

并且为了记录:许多基准测试实验表明,如果你给出正常的&#34;那么JIT确实做得最好。代码。含义:Oracle JIT旨在为您提供最佳结果&#34;在&#34;正常&#34;输入。但是一旦你开始摆弄你的java代码,为了以某种方式创建&#34;优化&#34;代码...您的更改很可能使JIT更难以做好工作。

因此:请忘记这种微观优化。如果你花费相同的时间来学习&#34;良好的OO设计&#34;也许&#34;通用的Java性能主题&#34; ......你将从中获得更多!

答案 1 :(得分:2)

  

哪一个更好?

第一个,因为它实际编译(在第二个中有一个拼写错误)。非编译代码绝对是性能最差的代码。

但是,第一个,因为,尽管你说&#34;忽略了可读性和代码质量&#34;,可读性几乎总是比性能更重要。可读性当然是你应该首先编写代码,然后再使它具有高性能。

第一个,因为JIT将为您展开循环,它确定在运行它的特定JVM上具有更好的性能,用于运行代码的特定数据(I&#39; m假设您不喜欢一遍又一遍地使用相同的消息填充日志。

不要试图再次猜测JIT将适用的优化。自己应用优化可能会使性能更糟,因为这会使JIT更难以优化代码。编写清晰,可维护的代码,让JVM发挥其神奇作用。

答案 2 :(得分:0)

取决于编程语言。编译器负责压缩代码,以避免在低级别重复调用。面向对象使用java-script等语言进行编程处于相对较高的水平,因此编译可能需要一些时间才能运行。

因此,根据您的问题假设,广泛简要地总结,唯一的影响是整体文件大小和编译所花费的时间。

答案 3 :(得分:0)

您正在做的事情被称为&#34;循环展开&#34;。

检查:Here

这是编译器在使用适当的优化级别编译时将执行的优化之一。

在我看来,你的第二个选项应该比第一个选项运行得更快。因为在第一个选项代码中必须增加循环计数器,所以检查循环条件并采取适当的分支决策。如果存在分支错误预测,则分支本身可能很昂贵。这是因为在分支误预测时,CPU必须清除所有pipline并重新启动指令。检查:https://en.wikipedia.org/wiki/Loop_unrolling