From 316d447fe1c7110b6f13ae59a16dcd496ced43d9 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Wed, 9 Dec 2020 13:59:10 +0100 Subject: [PATCH] Pre-sorting --- src/dwarfs/inode_manager.cpp | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/dwarfs/inode_manager.cpp b/src/dwarfs/inode_manager.cpp index b2c3eb6d..3cfe69df 100644 --- a/src/dwarfs/inode_manager.cpp +++ b/src/dwarfs/inode_manager.cpp @@ -445,12 +445,36 @@ void inode_manager_::order_inodes_by_nilsimsa2( log_.info() << "nilsimsa: depth=" << depth << ", limit=" << limit; - std::sort(index.begin(), index.end(), [&](auto a, auto b) { - auto const& ia = *inodes[a]; - auto const& ib = *inodes[b]; - return (ia.size() < ib.size() || - (ia.size() == ib.size() && ia.any()->path() < ib.any()->path())); - }); + { + auto ti = log_.timed_info(); + size_t num_name = 0; + size_t num_path = 0; + + std::sort(index.begin(), index.end(), [&](auto a, auto b) { + auto const& ia = *inodes[a]; + auto const& ib = *inodes[b]; + auto sa = ia.size(); + auto sb = ib.size(); + if (sa < sb) { + return true; + } else if (sa > sb) { + return false; + } + ++num_name; + auto fa = ia.any(); + auto fb = ib.any(); + if (fa->name() < fb->name()) { + return true; + } else if (fa->name() > fb->name()) { + return false; + } + ++num_path; + return fa->path() < fb->path(); + }); + + ti << "pre-sorted index (" << num_name << " name, " << num_path + << " path lookups)"; + } finalize_inode();