Skip to content

Commit 1daa97c

Browse files
authored
Optimise SchemaFrame::is_reachable (#2231)
Signed-off-by: Juan Cruz Viotti <[email protected]>
1 parent d4e6d97 commit 1daa97c

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

src/core/jsonschema/frame.cc

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,6 +1444,9 @@ auto SchemaFrame::populate_reachability(const Location &base,
14441444
WeakPointer::Hasher, WeakPointer::Comparator>
14451445
has_non_pointer_location;
14461446

1447+
this->pointer_to_location_.reserve(this->locations_.size());
1448+
has_non_pointer_location.reserve(this->locations_.size());
1449+
pointers_with_non_orphan.reserve(this->locations_.size());
14471450
for (const auto &entry : this->locations_) {
14481451
auto [iterator, inserted] = this->pointer_to_location_.try_emplace(
14491452
std::cref(entry.second.pointer), std::vector<const Location *>{});
@@ -1715,6 +1718,7 @@ auto SchemaFrame::populate_reachability(const Location &base,
17151718
bool changed{true};
17161719
while (changed) {
17171720
changed = false;
1721+
std::vector<std::reference_wrapper<const WeakPointer>> newly_reachable;
17181722

17191723
auto write_iterator = unreachable_with_sources.begin();
17201724
for (auto read_iterator = unreachable_with_sources.begin();
@@ -1739,15 +1743,8 @@ auto SchemaFrame::populate_reachability(const Location &base,
17391743
}
17401744

17411745
if (became_reachable) {
1742-
const auto &reached_pointer{read_iterator->pointer.get()};
17431746
cache[read_iterator->pointer] = true;
1744-
for (auto &[cache_pointer, cache_reachable] : cache) {
1745-
if (!cache_reachable &&
1746-
cache_pointer.get().starts_with(reached_pointer) &&
1747-
pointers_with_non_orphan.contains(cache_pointer)) {
1748-
cache_reachable = true;
1749-
}
1750-
}
1747+
newly_reachable.push_back(read_iterator->pointer);
17511748
changed = true;
17521749
} else {
17531750
if (write_iterator != read_iterator) {
@@ -1758,6 +1755,21 @@ auto SchemaFrame::populate_reachability(const Location &base,
17581755
}
17591756
unreachable_with_sources.erase(write_iterator,
17601757
unreachable_with_sources.end());
1758+
1759+
for (auto &[cache_pointer, cache_reachable] : cache) {
1760+
if (cache_reachable) {
1761+
continue;
1762+
}
1763+
if (!pointers_with_non_orphan.contains(cache_pointer)) {
1764+
continue;
1765+
}
1766+
for (const auto &reached : newly_reachable) {
1767+
if (cache_pointer.get().starts_with(reached.get())) {
1768+
cache_reachable = true;
1769+
break;
1770+
}
1771+
}
1772+
}
17611773
}
17621774

17631775
return cache;

0 commit comments

Comments
 (0)