From fbfddad6eb82fb8e8461f174d7ecc2774bbbdc00 Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Sat, 11 Mar 2017 02:50:47 +0000 Subject: [PATCH] [libFuzzer] reduce the number of vector resizes during merge (https://github.com/google/oss-fuzz/issues/445) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297551 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Fuzzer/FuzzerMerge.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/Fuzzer/FuzzerMerge.cpp b/lib/Fuzzer/FuzzerMerge.cpp index 5c17f66940a..58a228bc3df 100644 --- a/lib/Fuzzer/FuzzerMerge.cpp +++ b/lib/Fuzzer/FuzzerMerge.cpp @@ -74,6 +74,7 @@ bool Merger::Parse(std::istream &IS, bool ParseCoverage) { size_t ExpectedStartMarker = 0; const size_t kInvalidStartMarker = -1; size_t LastSeenStartMarker = kInvalidStartMarker; + std::vector TmpFeatures; while (std::getline(IS, Line, '\n')) { std::istringstream ISS1(Line); std::string Marker; @@ -95,11 +96,11 @@ bool Merger::Parse(std::istream &IS, bool ParseCoverage) { return false; LastSeenStartMarker = kInvalidStartMarker; if (ParseCoverage) { - auto &V = Files[CurrentFileIdx].Features; - V.clear(); + TmpFeatures.clear(); // use a vector from outer scope to avoid resizes. while (ISS1 >> std::hex >> N) - V.push_back(N); - std::sort(V.begin(), V.end()); + TmpFeatures.push_back(N); + std::sort(TmpFeatures.begin(), TmpFeatures.end()); + Files[CurrentFileIdx].Features = TmpFeatures; } } else { return false; @@ -270,8 +271,8 @@ void Fuzzer::CrashResistantMerge(const std::vector &Args, IF.seekg(0, IF.beg); M.ParseOrExit(IF, true); IF.close(); - Printf("MERGE-OUTER: consumed %zd bytes to parse the control file\n", - M.ApproximateMemoryConsumption()); + Printf("MERGE-OUTER: consumed %zdMb (%zdMb rss) to parse the control file\n", + M.ApproximateMemoryConsumption() >> 20, GetPeakRSSMb()); std::vector NewFiles; size_t NumNewFeatures = M.Merge(&NewFiles); Printf("MERGE-OUTER: %zd new files with %zd new features added\n", -- 2.50.1