Przeglądaj źródła

Merge pull request julian-klode/apt#3 from adrian17/master

Improve GetLocalitySortedVersionSet, speeds up apt search by 30%
Julian Andres Klode 10 lat temu
rodzic
commit
a9c2517e9c
2 zmienionych plików z 22 dodań i 11 usunięć
  1. 2 2
      apt-pkg/contrib/strutl.cc
  2. 20 9
      apt-private/private-cacheset.h

+ 2 - 2
apt-pkg/contrib/strutl.cc

@@ -71,14 +71,14 @@ bool Endswith(const std::string &s, const std::string &end)
 {
    if (end.size() > s.size())
       return false;
-   return (s.substr(s.size() - end.size(), s.size()) == end);
+   return (s.compare(s.size() - end.size(), end.size(), end) == 0);
 }
 
 bool Startswith(const std::string &s, const std::string &start)
 {
    if (start.size() > s.size())
       return false;
-   return (s.substr(0, start.size()) == start);
+   return (s.compare(0, start.size(), start) == 0);
 }
 
 }

+ 20 - 9
apt-private/private-cacheset.h

@@ -15,17 +15,28 @@
 
 class OpProgress;
 
+class VerIteratorWithCaching
+{
+   const pkgCache::VerIterator iter;
+   const pkgCache::DescFile * descFile;
+public:
+   VerIteratorWithCaching(const pkgCache::VerIterator& iter) :
+      iter(iter),
+      descFile(iter->DescriptionList != 0
+	 ? (const pkgCache::DescFile *) iter.TranslatedDescription().FileList()
+	 : nullptr)
+   {}
+   const pkgCache::DescFile * CachedDescFile() const { return descFile; }
+   operator pkgCache::VerIterator() const { return iter; }
+};
+
 struct VersionSortDescriptionLocality					/*{{{*/
 {
-   bool operator () (const pkgCache::VerIterator &v_lhs,
-	 const pkgCache::VerIterator &v_rhs)
+   bool operator () (const VerIteratorWithCaching &v_lhs,
+	 const VerIteratorWithCaching &v_rhs)
    {
-      pkgCache::DescFile const *A = nullptr;
-      pkgCache::DescFile const *B = nullptr;
-      if (v_lhs->DescriptionList != 0)
-	 A = v_lhs.TranslatedDescription().FileList();
-      if (v_rhs->DescriptionList != 0)
-	 B = v_rhs.TranslatedDescription().FileList();
+      pkgCache::DescFile const *A = v_lhs.CachedDescFile();
+      pkgCache::DescFile const *B = v_rhs.CachedDescFile();
 
       if (A == nullptr && B == nullptr)
 	 return false;
@@ -45,7 +56,7 @@ struct VersionSortDescriptionLocality					/*{{{*/
 									/*}}}*/
 // sorted by locality which makes iterating much faster
 typedef APT::VersionContainer<
-   std::set<pkgCache::VerIterator,
+   std::set<VerIteratorWithCaching,
             VersionSortDescriptionLocality> > LocalitySortedVersionSet;
 
 class Matcher {