mirror of
https://github.com/roytam1/UXP.git
synced 2026-05-28 14:38:38 +00:00
Reduce number of allocations in AutoStopwatch
This patch fixes two related issues. 1. The AutoStopwatch uses a stack-allocated `mozilla::Vector` to communicate with its callback during each compartment switch. This vector was designed to allow its contents to be stack-allocated but they turned out to be accidentally heap-allocated. 2. During each tick, the stopwatch fills a vector `recentGroups_`. This vector always started with minimal capacity and had to grow repeatedly as groups were added, causing repeated reallocations. This patch preallocates `recentGroups_` to have the same capacity as the previous tick. We expect that this should eventually reach a stable size that closely matches the actual needs of the process.
This commit is contained in:
@@ -1082,6 +1082,9 @@ nsPerformanceStatsService::GetPerformanceGroups(JSContext* cx,
|
||||
return false;
|
||||
}
|
||||
|
||||
// Returning a vector that is too large would cause allocations all over the
|
||||
// place in the JS engine. We want to be sure that all data is stored inline.
|
||||
MOZ_ASSERT(out.length() <= out.sMaxInlineStorage);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1310,8 +1313,12 @@ nsPerformanceStatsService::GetResources(uint64_t* userTime,
|
||||
|
||||
void
|
||||
nsPerformanceStatsService::NotifyJankObservers(const mozilla::Vector<uint64_t>& aPreviousJankLevels) {
|
||||
GroupVector alerts;
|
||||
mPendingAlerts.swap(alerts);
|
||||
|
||||
// The move operation is generally constant time, unless
|
||||
// `mPendingAlerts.length()` is very small, in which case it's fast anyway.
|
||||
GroupVector alerts(Move(mPendingAlerts));
|
||||
mPendingAlerts = GroupVector(); // Reconstruct after `Move`.
|
||||
|
||||
if (!mPendingAlertsCollector) {
|
||||
// We are shutting down.
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user