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
-~----------~----~----~----~------~----~------~--~---

Reply via email to