微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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会增加额外的性能开销.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐