1

如果有人对 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)

我必须说我是这个库的忠实粉丝,因为它使代码干净且可测试,但目前我正在从事性能敏感的项目,我担心我对这个库的喜爱会损害性能。

我知道这是一个非常普遍的问题,但是有人将这个库用于生产环境吗?并注意到性能问题?

4

2 回答 2

0

除了多次运行它以检查 JVM 优化(我不知道是否考虑到 Predicate 可以是一个功能接口,JVM 不能使用invokedynamicJava 7 中引入的新字节码关键字),我认为你错误依赖只是之后start

start = System.nanoTime();
filtered.clear();
CollectionUtils.select(ints, predicate,filtered);
end = System.nanoTime();
System.out.println(filtered + " (" + (end - start) + ")");

filtered.clear()如果您想检查 CollectionUtils 和普通旧 foreach 之间的差异,我认为您不应该评估它的工作时间。

于 2014-08-21T13:30:59.750 回答
0

好吧,您基本上是在将方法调用开销与内联代码进行比较,后者显然更快。

只要您不做真正挑战您的 cpu 的事情,如果这会导致您的应用程序出现性能问题,我会感到非常惊讶。

于 2014-10-16T21:47:21.123 回答