summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2021-02-06 00:46:37 +0000
committerGitHub <noreply@github.com>2021-02-05 16:46:37 -0800
commit51c8f2469f8fd05197b7694c65041b1567f2c6b5 (patch)
tree004877ed58384b8cccede06e872f4ed4c148670a
parent9868c3636bf1309c23213dc8ef6de4c036d6c40b (diff)
downloadbinaryen-51c8f2469f8fd05197b7694c65041b1567f2c6b5.tar.gz
binaryen-51c8f2469f8fd05197b7694c65041b1567f2c6b5.tar.bz2
binaryen-51c8f2469f8fd05197b7694c65041b1567f2c6b5.zip
Use unordered maps of Name where possible (#3546)
Unordered maps will hash the pointer, while ordered ones will compare the strings to find where to insert in the tree. I cannot confirm a speedup in time from this, though others can, but I do see a consistent improvement of a few % in perf stat results like number of instructions and cycles (and those results have little noise). And it seems logical that this could be faster.
-rw-r--r--src/wasm.h12
-rw-r--r--src/wasm/wasm-binary.cpp8
-rw-r--r--src/wasm/wasm-validator.cpp2
3 files changed, 11 insertions, 11 deletions
diff --git a/src/wasm.h b/src/wasm.h
index 0050fcc28..5e4c4668b 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -1643,8 +1643,8 @@ public:
std::unique_ptr<StackIR> stackIR;
// local names. these are optional.
- std::map<Index, Name> localNames;
- std::map<Name, Index> localIndices;
+ std::unordered_map<Index, Name> localNames;
+ std::unordered_map<Name, Index> localIndices;
// Source maps debugging info: map expression nodes to their file, line, col.
struct DebugLocation {
@@ -1878,10 +1878,10 @@ private:
// TODO: add a build option where Names are just indices, and then these
// methods are not needed
// exports map is by the *exported* name, which is unique
- std::map<Name, Export*> exportsMap;
- std::map<Name, Function*> functionsMap;
- std::map<Name, Global*> globalsMap;
- std::map<Name, Event*> eventsMap;
+ std::unordered_map<Name, Export*> exportsMap;
+ std::unordered_map<Name, Function*> functionsMap;
+ std::unordered_map<Name, Global*> globalsMap;
+ std::unordered_map<Name, Event*> eventsMap;
public:
Module() = default;
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index 2c473a254..75ca5a2b1 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -1894,7 +1894,7 @@ void WasmBinaryBuilder::readExports() {
BYN_TRACE("== readExports\n");
size_t num = getU32LEB();
BYN_TRACE("num: " << num << std::endl);
- std::set<Name> names;
+ std::unordered_set<Name> names;
for (size_t i = 0; i < num; i++) {
BYN_TRACE("read one\n");
auto curr = new Export;
@@ -2524,7 +2524,7 @@ void WasmBinaryBuilder::readNames(size_t payloadLen) {
} else if (nameType ==
BinaryConsts::UserSections::Subsection::NameFunction) {
auto num = getU32LEB();
- std::set<Name> usedNames;
+ std::unordered_set<Name> usedNames;
for (size_t i = 0; i < num; i++) {
auto index = getU32LEB();
auto rawName = getInlineString();
@@ -2563,7 +2563,7 @@ void WasmBinaryBuilder::readNames(size_t payloadLen) {
<< std::to_string(funcIndex) << std::endl;
}
auto numLocals = getU32LEB();
- std::set<Name> usedNames;
+ std::unordered_set<Name> usedNames;
for (size_t j = 0; j < numLocals; j++) {
auto localIndex = getU32LEB();
auto rawLocalName = getInlineString();
@@ -2631,7 +2631,7 @@ void WasmBinaryBuilder::readNames(size_t payloadLen) {
}
} else if (nameType == BinaryConsts::UserSections::Subsection::NameGlobal) {
auto num = getU32LEB();
- std::set<Name> usedNames;
+ std::unordered_set<Name> usedNames;
for (size_t i = 0; i < num; i++) {
auto index = getU32LEB();
auto rawName = getInlineString();
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp
index a9a69b244..fad78cefd 100644
--- a/src/wasm/wasm-validator.cpp
+++ b/src/wasm/wasm-validator.cpp
@@ -2465,7 +2465,7 @@ void FunctionValidator::visitFunction(Function* curr) {
returnTypes.clear();
labelNames.clear();
// validate optional local names
- std::set<Name> seen;
+ std::unordered_set<Name> seen;
for (auto& pair : curr->localNames) {
Name name = pair.second;
shouldBeTrue(seen.insert(name).second, name, "local names must be unique");