Hi Jörn,

here it is:

Index: testrunner.js
===================================================================
--- testrunner.js       (revision 5903)
+++ 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;
         }
@@ -443,23 +443,26 @@
         }

         if (typeof a === "object") {
-            // Verify properties equivalence in both ways:
-
-            // 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]);
-                }
-            }
-
-            // ... 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]);
-                }
-            }
-
-            return eq;
+            // With Markus Staab's help
+            // see 
http://groups.google.com/group/jquery-dev/browse_thread/thread/9447a950b40574f
+
+            // Verify a's properties with b's properties equivalence
+            for (i in a) {
+                if (a.hasOwnProperty(i)) {
+                    if (!b.hasOwnProperty(i) || !equiv(a[i], b[i]))
{
+                        return false;
+                    }
+                }
+            }
+
+            // Need only to verify that b's property are also a's
property
+            for (i in b) {
+                if (b.hasOwnProperty(i) && !a.hasOwnProperty(i)) {
+                    return false;
+                }
+            }
+
+            return true;
         }

         if (typeof a === "function") {


Bye, Markus

On 22 Okt., 14:22, "Jörn Zaefferer" <[EMAIL PROTECTED]>
wrote:
> 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