java三元运算符值在性能上的位置?
为什么java三元运算符值在性能上的位置?,java,Java,为什么StringUtils.isEmtpy?空:s比慢!StringUtils.isEmtpy(s)?s:null?在我的测试中,后一个比第一个快1毫秒 测试: publicstaticvoidmain(字符串[]args){ 列表列表=新的ArrayList(Arrays.asList(“a”、“a”、“a”、“a”、“a”、null、“a”)); Long start1=System.nanoTime(); 对于(字符串s:list) ) { 字符串s1=isEmpty(s)?null:s
StringUtils.isEmtpy?空:s
比慢!StringUtils.isEmtpy(s)?s:null
?在我的测试中,后一个比第一个快1毫秒
测试:
publicstaticvoidmain(字符串[]args){
列表列表=新的ArrayList(Arrays.asList(“a”、“a”、“a”、“a”、“a”、null、“a”));
Long start1=System.nanoTime();
对于(字符串s:list)
) {
字符串s1=isEmpty(s)?null:s;
}
Long-end1=System.nanoTime();
System.out.println(“第一部分为null:+(end1-start1));
Long start2=System.nanoTime();
对于(字符串s:list)
) {
字符串s2=!isEmpty(s)?s:null;
}
Long-end2=System.nanoTime();
System.out.println(“第二个空:”+(end2-start2));
}
//输出
第一次为空:98600
秒为空:8200运行发布在我的机器上的代码产生: 第一个为空:79347
第二个为空:13027 重新排列代码,使“null为第二个”首先运行: 第二个为空:42239
第一个为空:5526
它清楚地表明,你不能从这个测试中得出哪个更快的结论 首先,正如前面的评论所述,您计算性能的方法存在缺陷 使用
String s1 = isEmpty(s) ? null : s;
String s2 = !isEmpty(s) ? s : null;
对于任何实际的列表大小,都不会对性能产生影响。两个LOC之间的唯一开销是相应的否定和分支
还有,别再担心同样的事情了。你越想微优化,你几乎每次都在浪费时间,因为编译器足够聪明,可以自己执行微优化
此外,硬件越来越便宜,运行程序的速度快得难以想象,但维护代码库却变得越来越复杂。
在我看来,花点时间让代码对其他人更具可读性,你本来可以这样写的
String s1 = StringUtils.trimToNull(s);
就这样吧
PS:请不要将trimToNull()与您的代码进行性能比较,再次担心 你的测试方法有缺陷。微基准是出了名的不可靠。“数字常常欺骗我,特别是当我自己安排数字时;在这种情况下,迪斯雷利的话通常会公正而有力地适用:“有三种谎言:谎言、该死的谎言和统计数据。”——马克·吐温这不是检验的方法performance@Deadpool,你能提供更多的细节吗?谢谢,让我看看
String s1 = StringUtils.trimToNull(s);