AAPT2: Use hash map for StringPool indices
Hash map has better locality and average case performance
Change-Id: Ic2d111c3cff1d5c0e7e9cbe36714669e6508c275
diff --git a/tools/aapt2/StringPool.h b/tools/aapt2/StringPool.h
index 509e304..5f88543 100644
--- a/tools/aapt2/StringPool.h
+++ b/tools/aapt2/StringPool.h
@@ -22,7 +22,7 @@
#include "util/StringPiece.h"
#include <functional>
-#include <map>
+#include <unordered_map>
#include <memory>
#include <string>
#include <vector>
@@ -199,7 +199,7 @@
std::vector<std::unique_ptr<Entry>> mStrings;
std::vector<std::unique_ptr<StyleEntry>> mStyles;
- std::multimap<StringPiece16, Entry*> mIndexedStrings;
+ std::unordered_multimap<StringPiece16, Entry*> mIndexedStrings;
};
//
diff --git a/tools/aapt2/flatten/XmlFlattener.cpp b/tools/aapt2/flatten/XmlFlattener.cpp
index 570cd96..cc45789 100644
--- a/tools/aapt2/flatten/XmlFlattener.cpp
+++ b/tools/aapt2/flatten/XmlFlattener.cpp
@@ -22,6 +22,7 @@
#include <androidfw/ResourceTypes.h>
#include <algorithm>
+#include <map>
#include <utils/misc.h>
#include <vector>
diff --git a/tools/aapt2/util/StringPiece.h b/tools/aapt2/util/StringPiece.h
index f91bccc..f5c985b 100644
--- a/tools/aapt2/util/StringPiece.h
+++ b/tools/aapt2/util/StringPiece.h
@@ -19,6 +19,7 @@
#include <ostream>
#include <string>
+#include <utils/JenkinsHash.h>
#include <utils/String8.h>
#include <utils/Unicode.h>
@@ -257,4 +258,17 @@
return out.write(utf8.string(), utf8.size());
}
+namespace std {
+
+template <typename TChar>
+struct hash<aapt::BasicStringPiece<TChar>> {
+ size_t operator()(const aapt::BasicStringPiece<TChar>& str) const {
+ uint32_t hashCode = android::JenkinsHashMixBytes(
+ 0, reinterpret_cast<const uint8_t*>(str.data()), sizeof(TChar) * str.size());
+ return static_cast<size_t>(hashCode);
+ }
+};
+
+} // namespace std
+
#endif // AAPT_STRING_PIECE_H