如果有人在Apache CollectionUtils上做了基准测试,我就会徘徊。 在我简单的基准测试中:
List<Integer> ints = Arrays.asList(3, 4, 6, 7,8, 0,9,2, 5, 2,1, 35,11, 44, 5,1 ,2);
long start = System.nanoTime();
ArrayList<Integer> filtered = new ArrayList<Integer>(ints.size());
for (Integer anInt : ints) {
if (anInt > 10) {
filtered.add(anInt);
}
}
long end = System.nanoTime();
System.out.println(filtered + " (" + (end - start) + ")");
Predicate<Integer> predicate = new Predicate<Integer>() {
@Override
public boolean evaluate(Integer integer) {
return integer > 10;
}
};
start = System.nanoTime();
filtered.clear();
CollectionUtils.select(ints, predicate,filtered);
end = System.nanoTime();
System.out.println(filtered + " (" + (end - start) + ")");
我得到了以下结果:
[35, 11, 44] (127643)
[35, 11, 44] (3060230)
我必须说我是这个图书馆的忠实粉丝因为它使代码干净且可测试但是目前我正致力于性能敏感项目,我担心我对这个图书馆的感情会损害表演。
我知道这是一个非常普遍的问题,但是任何人都使用这个库进行生产环境?并注意到性能问题?
答案 0 :(得分:0)
除了多次运行以检查JVM优化之外(我不知道如果Predicate可以是一个功能接口,JVM就无法使用Java 7中引入的新字节码关键字invokedynamic
),我认为你错误依赖于start
:
start = System.nanoTime();
filtered.clear();
CollectionUtils.select(ints, predicate,filtered);
end = System.nanoTime();
System.out.println(filtered + " (" + (end - start) + ")");
如果您想检查CollectionUtils和普通旧foreach之间的差异,我认为您不应该评估时间filtered.clear()
是否有效。
答案 1 :(得分:0)
好吧,你基本上是将方法调用开销与内联代码进行比较,而后者明显更快。
只要您不做真正挑战您的cpu的事情,如果这会导致您的应用程序出现性能问题,我会感到非常惊讶。