如何解决为什么通过stream进行调用比使用if子句花费更多的时间?
为什么是这种方法:
public static int howManyDifferentFields() {
int difcolor = 0;
difcolor++;
if (fields[1] != fields[0]) {
difcolor++;
}
if (fields[2] != fields[1] && fields[2] != fields[0]) {
difcolor++;
}
if (fields[3] != fields[2] && fields[3] != fields[1] && fields[3] != fields[0]) {
difcolor++;
}
if (fields[4] != fields[3] && fields[4] != fields[2] && fields[4] != fields[1] && fields[4] != fields[0]) {
difcolor++;
}
if (fields[5] != fields[4] && fields[5] != fields[3] && fields[5] != fields[2] && fields[5] != fields[1] && fields[5] != fields[0]) {
difcolor++;
}
if (fields[6] != fields[5] && fields[6] != fields[4] && fields[6] != fields[3] && fields[6] != fields[2] && fields[6] != fields[1] && fields[6] != fields[0]) {
difcolor++;
}
if (fields[7] != fields[6] && fields[7] != fields[5] && fields[7] != fields[4] && fields[7] != fields[3] && fields[7] != fields[2] && fields[7] != fields[1] && fields[7] != fields[0]) {
difcolor++;
}
if (fields[8] != fields[7] && fields[8] != fields[6] && fields[8] != fields[5] && fields[8] != fields[4] && fields[8] != fields[3] && fields[8] != fields[2] && fields[8] != fields[1] && fields[8] != fields[0]) {
difcolor++;
}
return difcolor;
}
比这快得多吗?
public static int howManyDifferentFields2() {
return (int) Arrays.stream(fields).distinct().count();
}
我想使用第二种方法,因为它的代码要少得多。但这需要更多时间!当我使用第二种方法而不是第一种方法时,该程序需要大约八倍的时间才能完成。 我能做什么?我可以以某种方式重写第一种方法以使其有效但用更少的代码吗? 我认为第二种方法看起来更好...
解决方法
大多数人认为信息流很快。但事实并非如此。支持它们的代码很多,而这正是您要隐藏的开销。
在一般情况下,普通的for循环比非并行流(甚至在元素数量不大时甚至是并行流)都快。
虽然流生成了简洁而强大的代码并具有很多好处,但小流的性能并不是其中之一。
您的逻辑具有O(n 2 )时间复杂度,但是如果n固定为8,就可以了,您可以将其重写为以下等效循环:
int difcolor = 8;
for (int i = 1; i < fields.length; i++) {
for (int j = 0; j < i; j++) {
if (fields[i] == fields[j]) {
difcolor--;
break;
}
}
}
return difcolor;
从完美的分数开始,然后在第一个比赛中递减会提高效率,因为它可以通过尽早退出内循环来减少操作次数,这与您使用短路&&
类似。
您还可以使用Set,它具有O(n)时间复杂度,并且更紧凑,但是只有8个元素,它可能比上面的循环要慢:
Set<Integer> set = new HashSet<>(); // assuming fields is a int[]
int difcolor = 0;
for (int field : fields) {
if (set.add(field)) {
difcolor++;
}
}
这与您的流版本类似,但没有流开销。
如果对元素进行了排序,则可以通过一次操作仅比较邻居。
,您可以使用以下解决方案:-
您可以使用map来存储不同的值。
此外,默认值是difcolor一个计数,因此您可以从-1开始
JSON.parse
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。