Use F14ValueSet instead of std::unordered_set

This appears to ever so slightly speed up `walk`.
This commit is contained in:
Marcus Holland-Moritz 2021-03-03 17:36:25 +01:00
parent 4d0972fb22
commit 340fb1cb8e

View File

@ -25,7 +25,6 @@
#include <climits> #include <climits>
#include <cstring> #include <cstring>
#include <ostream> #include <ostream>
#include <unordered_set>
#include <fcntl.h> #include <fcntl.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -39,6 +38,8 @@
#include <fmt/format.h> #include <fmt/format.h>
#include <folly/container/F14Set.h>
#include "dwarfs/error.h" #include "dwarfs/error.h"
#include "dwarfs/logger.h" #include "dwarfs/logger.h"
#include "dwarfs/metadata_v2.h" #include "dwarfs/metadata_v2.h"
@ -213,6 +214,9 @@ class metadata_ : public metadata_v2::impl {
size_t block_size() const override { return meta_.block_size(); } size_t block_size() const override { return meta_.block_size(); }
private: private:
template <typename K>
using set_type = folly::F14ValueSet<K>;
entry_view make_entry_view(size_t index) const { entry_view make_entry_view(size_t index) const {
return entry_view(meta_.entries()[index], &meta_); return entry_view(meta_.entries()[index], &meta_);
} }
@ -345,8 +349,7 @@ class metadata_ : public metadata_v2::impl {
} }
template <typename Signature> template <typename Signature>
void void walk(directory_view parent, entry_view entry, set_type<int>& seen,
walk(directory_view parent, entry_view entry, std::unordered_set<int>& seen,
std::function<Signature> const& func) const; std::function<Signature> const& func) const;
std::optional<entry_view> get_entry(int inode) const { std::optional<entry_view> get_entry(int inode) const {
@ -589,7 +592,7 @@ std::string metadata_<LoggerPolicy>::modestring(uint16_t mode) const {
template <typename LoggerPolicy> template <typename LoggerPolicy>
template <typename Signature> template <typename Signature>
void metadata_<LoggerPolicy>::walk(directory_view parent, entry_view entry, void metadata_<LoggerPolicy>::walk(directory_view parent, entry_view entry,
std::unordered_set<int>& seen, set_type<int>& seen,
std::function<Signature> const& func) const { std::function<Signature> const& func) const {
walk_call(func, entry, parent); walk_call(func, entry, parent);
if (S_ISDIR(entry.mode())) { if (S_ISDIR(entry.mode())) {
@ -608,14 +611,14 @@ void metadata_<LoggerPolicy>::walk(directory_view parent, entry_view entry,
template <typename LoggerPolicy> template <typename LoggerPolicy>
void metadata_<LoggerPolicy>::walk( void metadata_<LoggerPolicy>::walk(
std::function<void(entry_view)> const& func) const { std::function<void(entry_view)> const& func) const {
std::unordered_set<int> seen; set_type<int> seen;
walk(make_directory_view(root_), root_, seen, func); walk(make_directory_view(root_), root_, seen, func);
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
void metadata_<LoggerPolicy>::walk( void metadata_<LoggerPolicy>::walk(
std::function<void(entry_view, directory_view)> const& func) const { std::function<void(entry_view, directory_view)> const& func) const {
std::unordered_set<int> seen; set_type<int> seen;
walk(make_directory_view(root_), root_, seen, func); walk(make_directory_view(root_), root_, seen, func);
} }