Closed
Bug 99253
Opened 23 years ago
Closed 23 years ago
Optimization on sort in pref-languages.js
Categories
(Core :: Internationalization, defect, P3)
Core
Internationalization
Tracking
()
VERIFIED
FIXED
mozilla0.9.5
People
(Reporter: jrgmorrison, Assigned: jbetak)
References
()
Details
(Keywords: perf)
Attachments
(1 file)
778 bytes,
patch
|
alecf
:
superreview+
|
Details | Diff | Splinter Review |
After tracking down an issue with loading an HTML page (bug 98012), and digging into the JS Array.sort() method, I decided to have a look if there were other places in the UI that might benefit from the following. Basically, if you have an Array of Array's, and call .sort() on that, then JS will call .toString() on each sub-array to flatten the list, and then do the compare based on that string in its quicksort. However, if you are really only interested in the sort occurring on the first element in each sub-array, then it can be _much_ faster, on a medium length list, to pass a comparison function into the .sort() method. It seems that the sort in pref-languages.js benefits from this change below. Without this patch, sort times were taking 47 msec for the first view of that panel, and typically over 200msec for a subsequent view (on win2k/500MHz; current CVS trunk build). [I'm not sure why it takes more time on a subsequent view. Ideas?] With this simple change, the sort took no more than 16 msec on any occasion, often reporting '0' [n.b. win2k timers have a resolution of 16ms]. Index: prefwindow/resources/content/pref-languages.js =================================================================== RCS file: /cvsroot/mozilla/xpfe/components/prefwindow/resources/content/pref-languages.js ,v retrieving revision 1.22 diff -u -r1.22 pref-languages.js --- prefwindow/resources/content/pref-languages.js 2001/08/17 22:17:56 1.22 +++ prefwindow/resources/content/pref-languages.js 2001/09/11 06:48:17 @@ -200,7 +200,12 @@ //} //if visible } //if accepted } //while - availLanguageDict.sort(); + availLanguageDict.sort( // sort on first element + function (a, b) { + if (a[0] < b[0]) return -1; + if (a[0] > b[0]) return 1; + return 0; + }); } So, assuming that 'sort on first column' is what you really want after all, then this is a pretty useful optimization [i.e., that panel is already the slowest in prefs; let's make it start to snap for the end-user].
Reporter | ||
Updated•23 years ago
|
Assignee | ||
Comment 1•23 years ago
|
||
I'm glad that someone is looking into the JS's Array.sort(). The sort is currently not locale-aware, which it should be. This was the reason, why I've recently spent some time looking into the possibility of using a compare function. An array sort will only perform an ASCII compare, which is really bad news for localized builds. Since we are not exposing the nsICollation interface to JS, there is no way to construct such locale-aware comparison function, and I didn't spend any time testing such a modification. Thanks for going to the effort of copying parts of the JS manual here - I believe it's more or less obvious that I've used the array sort for convenience. It didn't really occur to me that there might be some dramatic performance improvement in using a comparison function. So, congrats for finding that out! While I'm aware of the poor performance in the "Add Language" popup and welcome this patch, there are some people who believe that this dialog is rarely used, and I've been scheduled to work on other tasks - primarily around startup optimization. Seems like you already did some performance metrics and an effort to change this dialog is well warranted. However, I have to object to your statement "that panel is already the slowest in prefs". The sort is only being used in the "Add Language" popup, not the basic "Languages" pref panel. The collation issue I mentioned above could be solved by generating an RDF template in the core application. See two related bugs: http://bugscape.mcom.com/show_bug.cgi?id=8242 http://bugscape.mcom.com/show_bug.cgi?id=8291 Although, I believe such a change could render any optimization of the existing JS superfluous, your patch might be quite valuable in the meantime -> accepting. Targeting 0.9.5.
Status: NEW → ASSIGNED
Priority: -- → P3
Target Milestone: --- → mozilla0.9.5
Reporter | ||
Comment 2•23 years ago
|
||
Perhaps my comment about 'slowest' wasn't warranted, but I meant no disrespect in it. I realize you have other priorities, and that is why I provided this patch, given that I had already "discovered" that the cost of calling toString in an array sort was relatively high. So, with a simple LXR search, I found another similar pattern, and we get a cheap win. No it's not rocket science. Um, but that sort is used in the main panel 'pref-languages.xul'.
Assignee | ||
Comment 3•23 years ago
|
||
Assignee | ||
Comment 4•23 years ago
|
||
original patch by jrgm, so r=jbetak ben, blake, alecf & blizzard - would anyone have some cycles for a sr? Minor, but interesting change.
Assignee: loadrunner → jbetak
Status: ASSIGNED → NEW
Comment 5•23 years ago
|
||
sr=blizzard
Comment 6•23 years ago
|
||
Comment on attachment 49404 [details] [diff] [review] patch proposed by jrgm sure, sounds good to me. sr=alecf
Attachment #49404 -
Flags: superreview+
Assignee | ||
Comment 7•23 years ago
|
||
fix checked in - thanks everyone!
Status: NEW → RESOLVED
Closed: 23 years ago
Resolution: --- → FIXED
Comment 8•23 years ago
|
||
ftang, can this be verified within development? Otherwise please provide IQA with a test case. Thanks.
QA Contact: andreasb → ftang
Assignee | ||
Comment 9•23 years ago
|
||
clocking ~20% faster pref pane initialization. Marking verified.
Status: RESOLVED → VERIFIED
You need to log in
before you can comment on or make changes to this bug.
Description
•