哪段代码的性能更好?
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条答案
按热度按时间yfjy0ee71#
让我们看看每个人都做了什么:
1总是查找两个值中的较低值,并总是调用substring返回一个新的String。
2总是比较两个值,有时调用sub string,有时创建一个新的String。
所以2,因为有时它会做更少的工作,创建更少的对象。
dy1byipe2#
如果在大多数情况下使用
s.length < constparam
,则情况2将更快,因为在大多数情况下不需要执行substring()
操作。xmq68pz93#
字符串
从
Math
.我会运行一个JMH测试,我会说,这两个解决方案不会显示统计上的显着差异。如果你真的关心性能,甚至不要使用
substring
(检查代码,它有3个if
s,每次调用它都会创建一个新的String),但你应该使用char数组。然后再一次:在真实的生活中,我不认为这有什么关系。用一些真实的参数(字符串的长度和常量值)运行JMH测试。我想你会看到几乎对所有正常用例都足够的数字。
jdzmm42g4#
函数substring带参数(0,length)返回未修改的字符串。
区别在于检查s.length()是否> constparam,但基本上这就是Math.min所做的。
所以在我看来,几乎没有性能差异,假设子字符串调用比这个条件或Math.min花费更多的时间,甚至没有这个假设。
bkkx9g8r5#
分支可能会花费几纳秒的时间。在这两种情况下,都没有不必要的
char[]
复制。方法调用开销相当大,但得到了优化。几纳秒乘以200最多也就是几微秒。两种方法之间的差异较小,所以你可能会花费0.0001%的时间在这上面。这是一个非常粗略的估计,但即使我错了一千倍,也没有必要在这里优化。