'子串'或者'如果有长度&分钟' - 显着更好的性能

时间:2017-06-20 17:25:33

标签: java performance core

哪条代码有更好的性能?

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次。 哪种解决方案(以及为什么)会有更好的性能? 这会产生重大影响吗?

5 个答案:

答案 0 :(得分:0)

让我们来看看每个人做了什么:

1总是找到两个值中较低的值,并始终调用substring返回一个新的String。

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

所以2,因为有些时候它会减少工作量并创造更少的物体。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

区别在于检查s.length()&gt; constparam,但基本上它是Math.min所做的。

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

答案 3 :(得分:0)

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

来自Math。我会进行JMH测试,我会说两个提出的解决方案不会显示出统计上显着的差异。

如果您真的关心性能,请不要使用substring(检查代码,它有3个if并在每次调用时创建一个新的String),但是你应该使用char数组运行。

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

答案 4 :(得分:0)

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

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