Closed Bug 1356593 Opened 4 years ago Closed 4 years ago

nsISearchEngine.speculativeConnect and nsISearchEngine.getSubmission are slow

Categories

(Firefox :: Search, enhancement, P1)

enhancement

Tracking

()

RESOLVED FIXED
Firefox 55
Iteration:
55.4 - May 1
Tracking Status
firefox55 --- fixed

People

(Reporter: florian, Assigned: florian)

References

(Blocks 1 open bug)

Details

(Whiteboard: [photon-performance][fxsearch])

Attachments

(1 file)

I got this profile by alternatively clicking the searchbar and location bar on a slow netbook: https://perfht.ml/2of8wvm

We spend a lot of time calling speculativeConnect() on the currentEngine. getSubmission is the slow part (and in getSubmission, getLocale is the slowest part).

We should:
- cache most of the submission URL the first time it's computed. Only the user's query terms change each time.
- cache the getLocale result the first time we get it (we get it while initializing the search service... and we do already have a pref observer that triggers an async reinitialization of the search service whenever the locale changes)
- we may want to add a fast path for getting only the prepath of the submission URL for the speculativeConnect code path.
Flags: qe-verify?
Priority: -- → P2
Assignee: nobody → florian
Status: NEW → ASSIGNED
Iteration: --- → 55.4 - May 1
Priority: P2 → P1
(In reply to Florian Quèze [:florian] [:flo] from comment #0)

> - cache the getLocale result the first time we get it (we get it while
> initializing the search service... and we do already have a pref observer
> that triggers an async reinitialization of the search service whenever the
> locale changes)

Bug 1346616 changed the getLocale implementation yesterday to now just call something implemented in C++, so we may no longer need to cache this value in the search service.
Looking more closely at ParamSubstitution showed that most of the time spent there was wasted. This patch is just a clean reimplementation of it that only does the work that's actually needed to get the same result (I wrote the test before the patch to ensure I wasn't changing the result; except for the {moz:official} parameter that I fixed; I had broken it with https://hg.mozilla.org/mozilla-central/rev/9c92165fef20#l7.16 ). It's likely to be enough and that the caching I suggested in comment 0 won't be needed.

I also replaced the makeURI call (that had overhead calling into NetUtils.jsm) in getSubmission with the simple Services.io.newURI, and I cleaned up the _getURLOfType implementation.

ParamSubstitution is 54% of the JS running in the profile in comment 0, and the makeURI call is 6.9%.
Attachment #8859773 - Flags: review?(adw)
Flags: qe-verify? → qe-verify-
Comment on attachment 8859773 [details] [diff] [review]
reimplement ParamSubstitution

Review of attachment 8859773 [details] [diff] [review]:
-----------------------------------------------------------------

This slipped through the cracks, sorry, LGTM.
Attachment #8859773 - Flags: review?(adw) → review+
Pushed by florian@queze.net:
https://hg.mozilla.org/integration/mozilla-inbound/rev/68e88b3e0e57
reimplement the search service's ParamSubstitution function to avoid doing unnecessary work, r=adw.
https://hg.mozilla.org/mozilla-central/rev/68e88b3e0e57
Status: ASSIGNED → RESOLVED
Closed: 4 years ago
Resolution: --- → FIXED
Target Milestone: --- → Firefox 55
No longer blocks: photon-performance-triage
You need to log in before you can comment on or make changes to this bug.