From 49521f87851089bdb4097b715d09a8bd348aa60a Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Wed, 28 Sep 2016 00:49:45 +0200 Subject: Do not use MD5SumValue for Description_md5() Our profile says we spend about 5% of the time transforming the hex digits into the binary format used by HashsumValue, all for comparing them against the other strings. That makes no sense at all. According to callgrind, this reduces the overall instruction count from 5,3 billion to 5 billion in my example, which roughly matches the 5%. --- apt-pkg/deb/deblistparser.cc | 18 +++++++----------- apt-pkg/deb/deblistparser.h | 5 ++++- 2 files changed, 11 insertions(+), 12 deletions(-) (limited to 'apt-pkg/deb') diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc index ea4d8e063..0fc08d8fb 100644 --- a/apt-pkg/deb/deblistparser.cc +++ b/apt-pkg/deb/deblistparser.cc @@ -276,31 +276,27 @@ std::vector debListParser::AvailableDescriptionLanguages() description. If no Description-md5 is found in the section it will be calculated. */ -MD5SumValue debListParser::Description_md5() +APT::StringView debListParser::Description_md5() { StringView const value = Section.Find(pkgTagSection::Key::Description_md5); - if (value.empty() == true) + if (unlikely(value.empty() == true)) { StringView const desc = Section.Find(pkgTagSection::Key::Description); if (desc == "\n") - return MD5SumValue(); + return StringView(); MD5Summation md5; md5.Add(desc.data(), desc.size()); md5.Add("\n"); - return md5.Result(); + MD5Buffer = md5.Result(); + return StringView(MD5Buffer); } else if (likely(value.size() == 32)) { - MD5SumValue sumvalue; - if (sumvalue.Set(value)) - return sumvalue; - - _error->Error("Malformed Description-md5 line; includes invalid character '%.*s'", (int)value.length(), value.data()); - return MD5SumValue(); + return value; } _error->Error("Malformed Description-md5 line; doesn't have the required length (32 != %d) '%.*s'", (int)value.size(), (int)value.length(), value.data()); - return MD5SumValue(); + return StringView(); } /*}}}*/ // ListParser::UsePackage - Update a package structure /*{{{*/ diff --git a/apt-pkg/deb/deblistparser.h b/apt-pkg/deb/deblistparser.h index 43ce0cfd3..3d5065953 100644 --- a/apt-pkg/deb/deblistparser.h +++ b/apt-pkg/deb/deblistparser.h @@ -45,6 +45,7 @@ class APT_HIDDEN debListParser : public pkgCacheListParser private: std::vector forceEssential; std::vector forceImportant; + std::string MD5Buffer; protected: pkgTagFile Tags; @@ -74,7 +75,9 @@ class APT_HIDDEN debListParser : public pkgCacheListParser #endif virtual bool NewVersion(pkgCache::VerIterator &Ver) APT_OVERRIDE; virtual std::vector AvailableDescriptionLanguages() APT_OVERRIDE; - virtual MD5SumValue Description_md5() APT_OVERRIDE; +#ifdef APT_PKG_EXPOSE_STRING_VIEW + virtual APT::StringView Description_md5() APT_OVERRIDE; +#endif virtual unsigned short VersionHash() APT_OVERRIDE; virtual bool SameVersion(unsigned short const Hash, pkgCache::VerIterator const &Ver) APT_OVERRIDE; virtual bool UsePackage(pkgCache::PkgIterator &Pkg, -- cgit v1.2.3