哪条代码有更好的性能?
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次。 哪种解决方案(以及为什么)会有更好的性能? 这会产生重大影响吗?
答案 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%的时间。这是一个非常粗略的估计,但即使我的数量是千分之一,在这里进行优化也没有意义。