Commit 0b360d9c authored by Fredrik Söderquist's avatar Fredrik Söderquist Committed by Commit Bot

Avoid redundant scans of the instance lists

When the instance lists grow to a sizable length, checking for and
removing instance time with a kScript origin can take significant time
in some cases - especially when there are no such instance times present
at all.
Add a bitmask encoding which origins are present in the list, and then
use that to avoid redundant scans (in RemoveWithOrigin) when possible.

Bug: 1039243
Change-Id: I7008927338508f08e8b416822fbe52073a86da1b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2089706
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#748627}
parent 28f439ff
...@@ -67,6 +67,7 @@ SMILTime ComputeNextRepeatTime(SMILTime interval_begin, ...@@ -67,6 +67,7 @@ SMILTime ComputeNextRepeatTime(SMILTime interval_begin,
void SMILInstanceTimeList::Append(SMILTime time, SMILTimeOrigin origin) { void SMILInstanceTimeList::Append(SMILTime time, SMILTimeOrigin origin) {
instance_times_.push_back(SMILTimeWithOrigin(time, origin)); instance_times_.push_back(SMILTimeWithOrigin(time, origin));
AddOrigin(origin);
} }
void SMILInstanceTimeList::InsertSortedAndUnique(SMILTime time, void SMILInstanceTimeList::InsertSortedAndUnique(SMILTime time,
...@@ -84,15 +85,19 @@ void SMILInstanceTimeList::InsertSortedAndUnique(SMILTime time, ...@@ -84,15 +85,19 @@ void SMILInstanceTimeList::InsertSortedAndUnique(SMILTime time,
return; return;
} }
instance_times_.insert(position - instance_times_.begin(), time_with_origin); instance_times_.insert(position - instance_times_.begin(), time_with_origin);
AddOrigin(origin);
} }
void SMILInstanceTimeList::RemoveWithOrigin(SMILTimeOrigin origin) { void SMILInstanceTimeList::RemoveWithOrigin(SMILTimeOrigin origin) {
if (!HasOrigin(origin))
return;
auto* tail = auto* tail =
std::remove_if(instance_times_.begin(), instance_times_.end(), std::remove_if(instance_times_.begin(), instance_times_.end(),
[origin](const SMILTimeWithOrigin& instance_time) { [origin](const SMILTimeWithOrigin& instance_time) {
return instance_time.Origin() == origin; return instance_time.Origin() == origin;
}); });
instance_times_.Shrink(tail - instance_times_.begin()); instance_times_.Shrink(tail - instance_times_.begin());
ClearOrigin(origin);
} }
void SMILInstanceTimeList::Sort() { void SMILInstanceTimeList::Sort() {
......
...@@ -58,7 +58,21 @@ class CORE_EXPORT SMILInstanceTimeList { ...@@ -58,7 +58,21 @@ class CORE_EXPORT SMILInstanceTimeList {
const_iterator end() const { return instance_times_.end(); } const_iterator end() const { return instance_times_.end(); }
private: private:
static unsigned OriginToMask(SMILTimeOrigin origin) {
return 1u << static_cast<unsigned>(origin);
}
void AddOrigin(SMILTimeOrigin origin) {
time_origin_mask_ |= OriginToMask(origin);
}
void ClearOrigin(SMILTimeOrigin origin) {
time_origin_mask_ &= ~OriginToMask(origin);
}
bool HasOrigin(SMILTimeOrigin origin) const {
return (time_origin_mask_ & OriginToMask(origin)) != 0;
}
Vector<SMILTimeWithOrigin> instance_times_; Vector<SMILTimeWithOrigin> instance_times_;
unsigned time_origin_mask_ = 0;
}; };
// This class implements SMIL interval timing model as needed for SVG animation. // This class implements SMIL interval timing model as needed for SVG animation.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment