I'm happy to commit whatever you guys deem useful for equiv and QUnit.
A patch is perfect, that way I know that it isn't just code you were
trying out.

Thanks
Jörn

On Wed, Oct 22, 2008 at 2:23 PM, Philippe Rathe <[EMAIL PROTECTED]> wrote:
>
> 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