From d9f33b129ccff18321bfa63e0f22972e48e7143f Mon Sep 17 00:00:00 2001 From: Kirill Bobyrev Date: Thu, 13 Sep 2018 10:02:48 +0000 Subject: [PATCH] [clangd] Don't create child AND and OR iterators with one posting list `AND( AND( Child ) ... )` -> `AND( Child ... )` `AND( OR( Child ) ... )` -> `AND( Child ... )` This simple optimization results in 5-6% performance improvement in the benchmark with 2000 serialized `FuzzyFindRequest`s. Reviewed By: ilya-biryukov Differential Revision: https://reviews.llvm.org/D52016 llvm-svn: 342124 --- clang-tools-extra/clangd/index/dex/Iterator.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/clang-tools-extra/clangd/index/dex/Iterator.cpp b/clang-tools-extra/clangd/index/dex/Iterator.cpp index 5cbd0f490afc..8d5527205b30 100644 --- a/clang-tools-extra/clangd/index/dex/Iterator.cpp +++ b/clang-tools-extra/clangd/index/dex/Iterator.cpp @@ -198,7 +198,7 @@ class OrIterator : public Iterator { public: explicit OrIterator(std::vector> AllChildren) : Children(std::move(AllChildren)) { - assert(Children.size() > 0 && "OR iterator must have at least one child."); + assert(!Children.empty() && "OR iterator should have at least one child."); } /// Returns true if all children are exhausted. @@ -405,12 +405,16 @@ std::unique_ptr create(PostingListRef Documents) { std::unique_ptr createAnd(std::vector> Children) { - return llvm::make_unique(move(Children)); + // If there is exactly one child, pull it one level up: AND(Child) -> Child. + return Children.size() == 1 ? std::move(Children.front()) + : llvm::make_unique(move(Children)); } std::unique_ptr createOr(std::vector> Children) { - return llvm::make_unique(move(Children)); + // If there is exactly one child, pull it one level up: OR(Child) -> Child. + return Children.size() == 1 ? std::move(Children.front()) + : llvm::make_unique(move(Children)); } std::unique_ptr createTrue(DocID Size) {