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がJava 7で導入された新しいバイトコードキーワードを使用できなかったかどうかはわかりませんinvokedynamic)、エラーは単に依存していると思いますの後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 に答える