Thanks Markus. That was a nice optimization. All tests passed. It will surely be patch in QUnit soon.
By the way you can download the testsuites and the sources : http://philrathe.com/projects/equiv Download the archive. It is always to latest. Philippe Rathé On 22-Oct-08, at 5:42 AM, markus.staab wrote: > > the first loop has a problem: > > it should read > > // Everything in a should be in b and equivalent and ... > for (var i in a) { > if(a.hasOwnProperty(i)) > { > if (!b.hasOwnProperty(i) || !equiv(a[i], b[i])) > { > return false; > } > } > } > > > this approach would also save the memory for the 2 property stacks you > use in your latest solution. > > On 22 Okt., 11:35, "markus.staab" <[EMAIL PROTECTED]> wrote: >> i came up with another idea: >> >> // Everything in a should be in b and equivalent and ... >> for (var i in a) { >> if (!(a.hasOwnProperty(i) && >> b.hasOwnProperty(i) && >> equiv(a[i], b[i]))) { >> return false; >> } >> } >> >> // is there any property in b left, which doesn't exist >> in >> a? >> for (var i in b) { >> if (b.hasOwnProperty(i) && !a.hasOwnProperty(i)) { >> return false; >> } >> } >> >> maybe you can give it a try and also perform a benchmark (maybe you >> could share your test and benchmark, so I can also test my ideas on >> my >> machine...) >> >> bye, markus >> >> On 22 Okt., 11:14, "markus.staab" <[EMAIL PROTECTED]> wrote: >> >>> hi Philippe, >> >>> in your new code you are doing the following: >> >>> 50 // Stack all property names for a last minute >>> check for >>> two good reasons: >>> 51 // 1) To prevent failing when comparing >>> 52 // a property that have an undefined value >>> 53 // with a property that do not exists. >>> 54 // 2) To allow verifying equivalence in one >>> way (a -> >>> b) >>> 55 // and then comparing both property names >>> to >>> replace >>> 56 // (b -> a) processing. It's faster. >>> 57 var aProperties = [], bProperties = []; >>> 58 >>> 59 // Verify a's properties with b's properties >>> 60 for (i in a) { >>> 61 if (eq) { >>> 62 if (a.hasOwnProperty(i)) { >>> 63 aProperties.push(i); >>> 64 eq = equiv(a[i], b[i]); >>> 65 } >>> 66 } else { >>> 67 return false; >>> 68 } >>> 69 } >>> 70 >>> 71 // Get only b's property names >>> 72 if (eq) { >>> 73 for (i in b) { >>> 74 if (b.hasOwnProperty(i)) { >>> 75 bProperties.push(i); >>> 76 } >>> 77 } >>> 78 } >>> 79 >>> 80 // Finally, ensures also the same property >>> names in >>> both ways. >>> 81 // That will also ensures that no property with >>> undefined value is left behind. >>> 82 return eq && equiv(aProperties, bProperties); >> >>> in this you compare the properties from a and b twice. line 64 >>> should >>> be deleted. the properties are compared in the next recursion >>> anyway. >>> make the 2 "for (x in y)"-loops less complex and only collect the >>> properties. but then it would be optimized for the "eqiv"-case. >> >>> On 21 Okt., 22:55, Philippe Rathe <[EMAIL PROTECTED]> wrote: >> >>>> Please don't use that patch because it breaks the QUnit equiv test >>>> suites. >>>> My explanations can be found in my previous post. >> >>>> For some of the patched code that can be use, some benchmark need >>>> to >>>> be done anyway. >> >>>> Thanks anyway. >> >>>> Philippe Rathé >>>> On 21-Oct-08, at 2:42 PM, markus.staab wrote: >> >>>>> Index: testrunner.js >>>>> = >>>>> ================================================================== >>>>> --- testrunner.js (revision 5901) >>>>> +++ testrunner.js (working copy) >>>>> @@ -428,8 +428,8 @@ >>>>> if (len !== b.length) { // safe and faster >>>>> return false; >>>>> } >>>>> - for (var i = 0; i < len; i++) { >>>>> - eq = eq && equiv(a[i], b[i]); >>>>> + for (var i = 0; i < len && eq; i++) { >>>>> + eq = equiv(a[i], b[i]); >>>>> } >>>>> return eq; >>>>> } >>>>> @@ -447,15 +447,15 @@ >> >>>>> // Everything in a should be in b and equivalent >>>>> and ... >>>>> for (var i in a) { >>>>> - if (a.hasOwnProperty(i)) { >>>>> - eq = eq && equiv(a[i], b[i]); >>>>> + if (!a.hasOwnProperty(i) || !equiv(a[i], b[i])) { >>>>> + return false; >>>>> } >>>>> } >> >>>>> // ... everything in b should be in a and equivalent >>>>> for (var i in b) { >>>>> - if (b.hasOwnProperty(i)) { >>>>> - eq = eq && equiv(b[i], a[i]); >>>>> + if (!b.hasOwnProperty(i) || !equiv(b[i], a[i])) { >>>>> + return false; >>>>> } >>>>> } >> >>>>> On 21 Okt., 19:47, "Jörn Zaefferer" >>>>> <[EMAIL PROTECTED]> >>>>> wrote: >>>>>> Could you provide these as patches against the current >>>>>> revision?http://jqueryjs.googlecode.com/svn/trunk/qunit/testrunner.js >> >>>>>> Thanks >>>>>> Jörn >> >>>>>> On Tue, Oct 21, 2008 at 7:35 PM, markus.staab >>>>>> <[EMAIL PROTECTED]> wrote: >> >>>>>>> even shorter >> >>>>>>> 52 for (var i in a) { >>>>>>> 53 if (!a.hasOwnProperty(i) || !equiv(a[i], >>>>>>> b[i])) { >>>>>>> 54 return false; >>>>>>> 55 } >>>>>>> 56 } >> >>>>>>> On 21 Okt., 19:07, "markus.staab" <[EMAIL PROTECTED]> >>>>>>> wrote: >>>>>>>> taking a second look at the for (x in y) loops, we could also >>>>>>>> do >>>>>>>> some >>>>>>>> further optimization: >> >>>>>>>> 52 for (var i in a) { >>>>>>>> 53 if (a.hasOwnProperty(i)) { >>>>>>>> 54 if(!equiv(a[i], b[i])) >>>>>>>> return false; >>>>>>>> 55 } else { >>>>>>>> return false; >>>>>>>> } >>>>>>>> 56 } >> >>>>>>>> markus.staab schrieb: >> >>>>>>>>> in reply to the article athttp://philrathe.com/articles/equiv: >> >>>>>>>>> in the equiv method there is several times a loop like >> >>>>>>>>> 34 for (var i = 0; i < len; i++) { >>>>>>>>> 35 eq = eq && equiv(a[i], b[i]); >>>>>>>>> 36 } >>>>>>>>> 37 return eq; >> >>>>>>>>> this could be optimized, because if one of the elements is not >>>>>>>>> equal, >>>>>>>>> you found, that the origin elements aren't equal.. >> >>>>>>>>> so better use >> >>>>>>>>> 34 for (var i = 0; i < len && eq; i++) { >>>>>>>>> 35 eq = eq && equiv(a[i], b[i]); >>>>>>>>> 36 } >>>>>>>>> 37 return eq; >> >>>>>>>>> see the additional abort condition in the for loop... >>>>>>>>> This little "trick" could be applied in several places of the >>>>>>>>> function, e.g. >> >>>>>>>>> 52 for (var i in a) { >>>>>>>>> 53 if (a.hasOwnProperty(i)) { >>>>>>>>> 54 eq = eq && equiv(a[i], b[i]); >>>>>>>>> 55 } >>>>>>>>> 56 } >> >>>>>>>>> 59 for (var i in b) { >>>>>>>>> 60 if (b.hasOwnProperty(i)) { >>>>>>>>> 61 eq = eq && equiv(b[i], a[i]); >>>>>>>>> 62 } >>>>>>>>> 63 } >> >>>>>>>>> in the for(x in y) there should be a break, since there is no >>>>>>>>> abort >>>>>>>>> condition. >> >>>>>>>>> greets, markus > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "jQuery Development" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/jquery-dev?hl=en -~----------~----~----~----~------~----~------~--~---
