2017-06-20 21 views
0

哪段代码具有更好的性能?'Substring'或'if with length&min' - 显着更好的性能

Pseudocode: 
1) 
prvate String doSth(String s) { 
... 
return s.substring(0, Math.min(s.length(), constparam)); 
} 

2) 
prvate String doSth(String s) { 
if (s.length() > constparam) { 
    return s.substring(0, constparam); 
} 
return s; 
} 

在大多数情况下(99%) - s.length < constparam。 该方法每秒调用20-200次。 哪个解决方案(以及为什么)会有更好的性能? 它会造成重大影响吗?

+2

为什么不运行一些性能测试并找出自己的?这个(和重复的)可能有所帮助:https://stackoverflow.com/questions/447739/java-performance-testing – lucasvw

+2

一旦JIT分析了代码,可能几乎没有区别,如果你只做了200次每秒钟,如果有的话,你可能不会注意到任何区别。 **当心过早优化**,即只在测量问题时才“优化”代码,否则使用看起来更符合逻辑的代码版本。 – Andreas

+0

你会需要这个肯定https://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java –

回答

0

让我们看一下每个人做:

1总能发现两个值的降低,总是调用子返回一个新的String。

2总是比较两个值,有时会调用子字符串,因此有时会创建一个新的String。

所以2,因为有些时候它会做更少的工作,创造更少的对象。

0

如果大多数情况下为s.length < constparam,则情况2会更快,因为大多数情况下不需要执行substring()操作。

0

带参数的函数子串(0,长度)返回未修改的字符串。

区别在于检查s.length()> constparam,但基本上它是Math.min的作用。

所以即时我认为,几乎没有性能差异,假设子字符串调用需要比此条件或Math.min更多的时间,甚至没有这个假设。

+0

检查'java.lang.String.substring(int ,int)',它会创建一个新的String对象,如果该长度不是该字符串本身的长度。 –

+0

并不总是如此。正如我所说的,对于(0,长度)参数,它不会创建一个新的对象: –

0
public static int min(int a, int b) { 
    return (a <= b) ? a : b; 
} 

Math。我会运行一个JMH测试,并且我会说这两个提出的解决方案不会显示统计上显着的差异。

如果你真的关心性能,甚至不使用substring(检查代码,它有3个if S和创建每次调用它一个新的String),但你应该用字符数组操作。

然后再次:在现实生活中,我不认为这很重要。用一些真实参数(字符串长度和常量值)运行JMH测试。我想你会看到几乎每个理智用例的数字都足够了。

0

分支可能花费几纳秒。在这两种情况下都不需要复制char[]。方法调用开销相当大,但会得到优化。

几纳秒200最多几微秒。这两种方法之间的差异较小,所以您可能会花费0.0001%的时间。这是一个非常粗略的估计,但即使我的数字是千分之一,在这里优化也没有意义。

相关问题