java – 针对多个谓词扫描一次数组或针对单个谓词多次扫描数组是否更有效

我有一个包含1000个元素的int数组.我需要提取数组中各种子群的大小(有多少是偶数,奇数,大于500等).

我可以使用for循环和一堆if语句来尝试为每个匹配项添加计数变量,例如:

for(int i = 0; i < someArray.length i++) {
    if(conditionA) sizeA++;
    if(conditionB) sizeB++;
    if(conditionC) sizeC++;
    ...
}

或者我可以做一些更懒惰的事情,例如:

supplier<IntStream> ease = () -> Arrays.stream(someArray);
int sizeA = ease.get().filter(conditionA).toArray.length;
int sizeB = ease.get().filter(conditionB).toArray.length;
int sizeC = ease.get().filter(conditionC).toArray.length;
...

以第二种方式实现这一目标的好处似乎仅限于可读性,但效率是否会受到巨大冲击?它可能更有效率吗?我猜它归结为迭代数组一次,4个条件总是好于每次迭代4次,每次一个条件(假设条件是独立的).我知道这个特殊的例子,第二种方法有很多额外的方法调用,我肯定不会提高效率.

解决方法

前言:

>正如@Kayaman指出的那样,对于一个小阵列(1000个元素),它可能并不重要.
>正确处理此类事情的方法是在完成工作代码和工作基准测试后进行优化,然后在分析代码后查看真正的热点位置.

但是假设这值得花费在优化上,第一​​个版本可能比第二个版本更快,原因有两个:

>递增和测试索引的开销仅在第一个版本中产生一次而在第二个版本中产生三次.>对于太大而无法放入内存缓存的数组,第一个版本将比第二个版本需要更少的内存读取.由于内存访问通常是一个瓶颈(特别是在多核机器上),这可能很重要.>与简单的数组迭代相比,Streams会增加额外的性能开销.

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...