java 'Substring'或'if with length & min' -显著提高性能

jv2fixgn  于 5个月前  发布在  Java
关注(0)|答案(5)|浏览(88)

哪段代码的性能更好?

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

yfjy0ee7

yfjy0ee71#

让我们看看每个人都做了什么:
1总是查找两个值中的较低值,并总是调用substring返回一个新的String。
2总是比较两个值,有时调用sub string,有时创建一个新的String。
所以2,因为有时它会做更少的工作,创建更少的对象。

dy1byipe

dy1byipe2#

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

xmq68pz9

xmq68pz93#

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

字符串
Math .我会运行一个JMH测试,我会说,这两个解决方案不会显示统计上的显着差异。
如果你真的关心性能,甚至不要使用substring(检查代码,它有3个if s,每次调用它都会创建一个新的String),但你应该使用char数组。
然后再一次:在真实的生活中,我不认为这有什么关系。用一些真实的参数(字符串的长度和常量值)运行JMH测试。我想你会看到几乎对所有正常用例都足够的数字。

jdzmm42g

jdzmm42g4#

函数substring带参数(0,length)返回未修改的字符串。
区别在于检查s.length()是否> constparam,但基本上这就是Math.min所做的。
所以在我看来,几乎没有性能差异,假设子字符串调用比这个条件或Math.min花费更多的时间,甚至没有这个假设。

bkkx9g8r

bkkx9g8r5#

分支可能会花费几纳秒的时间。在这两种情况下,都没有不必要的char[]复制。方法调用开销相当大,但得到了优化。
几纳秒乘以200最多也就是几微秒。两种方法之间的差异较小,所以你可能会花费0.0001%的时间在这上面。这是一个非常粗略的估计,但即使我错了一千倍,也没有必要在这里优化。

相关问题