Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java三元运算符值在性能上的位置?_Java - Fatal编程技术网

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);