/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef INCLUDE_PERFETTO_BASE_FLAT_SET_H_ #define INCLUDE_PERFETTO_BASE_FLAT_SET_H_ #include <algorithm> #include <vector> // A vector-based set::set-like container. // It's more cache friendly than std::*set and performs for cases where: // 1. A high number of dupes is expected (e.g. pid tracking in ftrace). // 2. The working set is small (hundreds of elements). // Performance characteristics (for uniformly random insertion order): // - For smaller insertions (up to ~500), it outperforms both std::set<int> and // std::unordered_set<int> by ~3x. // - Up until 4k insertions, it is always faster than std::set<int>. // - unordered_set<int> is faster with more than 2k insertions. // - unordered_set, however, it's less memory efficient and has more caveats // (see chromium's base/containers/README.md). // // See flat_set_benchmark.cc and the charts in go/perfetto-int-set-benchmark. namespace perfetto { namespace base { template <typename T> class FlatSet { … }; } // namespace base } // namespace perfetto #endif // INCLUDE_PERFETTO_BASE_FLAT_SET_H_