[PATCH 2 of 2] hgweb: optimize process_dates function
Alexander Plavin
alexander at plav.in
Mon Aug 12 12:36:02 CDT 2013
10.08.2013, 16:57, "Laurens Holst" <laurens.nospam at grauw.nl>:
> Op 08-08-13 15:16, Alexander Plavin schreef:
>
>> # HG changeset patch
>> # User Alexander Plavin <alexander at plav.in>
>> # Date 1374682432 -14400
>> # Wed Jul 24 20:13:52 2013 +0400
>> # Node ID 2e3064b1a8b3719bc896e61a5804fd515a0bc9cb
>> # Parent d2e91a2d576deff3bb97fefc1fe71c2a64d64bb6
>> hgweb: optimize process_dates function
>>
>> This function looped over every node due to getElementsByTagName('*'), instead
>> of using selectors. In this patch we use querySelectorAll('.age') and process
>> only these nodes, which is much faster and also doesn't require extra condition.
>>
>> Browser compatibility isn't sacrificed: IE 8+, FF 3.5+, Opera 10+.
>
> How much do we care about compatibility with IE8?
May be not much, but it's not bad anyway :)
>
>> diff -r d2e91a2d576d -r 2e3064b1a8b3 mercurial/templates/static/mercurial.js
>> --- a/mercurial/templates/static/mercurial.js Wed Jul 24 18:53:55 2013 +0400
>> +++ b/mercurial/templates/static/mercurial.js Wed Jul 24 20:13:52 2013 +0400
>> @@ -245,21 +245,18 @@
>> }
>> }
>>
>> - var nodes = document.getElementsByTagName('*');
>> - var ageclass = new RegExp('\\bage\\b');
>> + var nodes = document.querySelectorAll('.age');
>
> Possibly getElementsByClassName() is more efficient.
Yes, it's more efficient of course, but:
- querying by a selector gives a very easy way to add some scope limit, see http://mercurial.markmail.org/message/kwcml3c6ewwonssr?q=process_dates
- this part (I mean getting list of nodes) is anyway much faster than actual processing of the nodes below
>
> Looks like it’s only supported in IE9 though. (Other browsers actually
> had it *before* querySelectorAll().)
As for me, querySelectorAll is supported for so long that we definitely shouldn't care about this, and this shouldn't be an argument against it.
>
>> var dateclass = new RegExp('\\bdate\\b');
>
> I would use a literal /\bdate\b/ instead of new RegExp().
I would too, but it's not that good to add (I think) to add this change to this patch.
>
>> for (var i=0; i<nodes.length; ++i){
>> var node = nodes[i];
>> var classes = node.className;
>> - if (ageclass.test(classes)){
>> - var agevalue = age(node.textContent);
>> - if (dateclass.test(classes)){
>> - // We want both: date + (age)
>> - node.textContent += ' ('+agevalue+')';
>> - } else {
>> - node.title = node.textContent;
>> - node.textContent = agevalue;
>> - }
>> + var agevalue = age(node.textContent);
>> + if (dateclass.test(classes)){
>
> As you’re using classList elsewhere, I think you could use
> classList.contains() instead of the regexp match?
It's already used (by me :) ) in line wrapping switch, and in my opinion getting readable dates (this place, process_dates) is more important than having the possibility to switch line wrapping dynamically. Also, this part of code existed before this patch, so why change it, what's the reason?
>
> Though MDN tells me it is only supported in IE10 onwards, but if that’s
> an argument then we shouldn’t be using it in the other place either.
>
>> + // We want both: date + (age)
>> + node.textContent += ' ('+agevalue+')';
>> + } else {
>> + node.title = node.textContent;
>> + node.textContent = agevalue;
>> }
>> }
>> }
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at selenic.com
>> http://selenic.com/mailman/listinfo/mercurial-devel
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list