Thanks for the speedy & thoughtful reply!  This helps me quite a
bit....

best-
Peter Keane

On Oct 10, 1:01 pm, "Michael Geary" <[EMAIL PROTECTED]> wrote:
> Your raw JavaScript code has a lot of optimization that is missing in your
> jQuery version. In the raw version, you cache the results of the
> document.getElementById calls. In the jQuery version, you don't do any of
> that, and in fact you repeat the same jQuery selector calls twice each.
>
> It any surprise that the optimized code is faster? :-)
>
> Note that there is quite a bit more optimization you can do in both
> versions. For example, all of the json[eid][type][ascii] references - you
> should be saving references as you go along:
>
>    var jsonEid = json[eid];
>    for (var type in jsonEid) {
>       var jsonType = jsonEid[type];
>       for (var ascii in jsonType) {
>          var jsonAscii = jsonType[ascii];
>          // now use jsonAscii where you were using json[eid][type][ascii]
>
> Keeping references like this saves a lot of name lookups. The same is true
> for $() jQuery selector calls, and even more so. Where you use $('#'+type)
> twice in row, instead do:
>
>    var $type = $('#'+type);
>    var html = $type.html() +...;
>    $type.html( html );
>
> Also, where you use $('#tagsSelect') twice every time through the loop,
> instead add this code OUTSIDE the loop:
>
>    var $tagsSelect = $('#tagsSelect');
>
> And then inside the loop you'll use:
>
>    var all = $tagsSelect.html() +...;
>    $tagsSelect.html( all );
>
> That eliminates the overhead of running the jQuery selector twice every time
> through the loop.
>
> The jQuery code will still be slower than the raw JavaScript, and where
> speed is critical there's nothing wrong with dropping down to straight DOM
> calls. But optimizing your jQuery calls will bring it much closer.
>
> -Mike
>
> > From: pkeane
>
> > Hi folks-
>
> > I am getting some troublesome benchmarks on a bit of code and I wonder
> > if I am missing something.  I am iterating over a JSON object to
> > dynamically create a menu.  The jQuery code consistently takes over
> > 5000 milliseconds (!) to complete and my raw javascript version
> > consistently takes less than 500 milliseconds.  That means jQuery is
> > more than 10 times slower for this code than raw javascript.
>
> > I am including all of the code (both raw javascript and jQuery
> > versions) as well as the sample JSON data that I used.
>
> > any help/advice would be appreciated.
>
> > -Peter Keane
>
> > var tags={};  //used by basic javascript version
> > tags['tagsSelect'] = document.getElementById('tagsSelect'); //used by
> > basic javascript version
>
> > var start = new Date();
>
> > for (var type in json[eid]) {
> >   for (var ascii in json[eid][type]) {
>
> > /* basic javascript version  */
>
> >  tags['tagsSelect'].innerHTML = tags['tagsSelect'].innerHTML + "<input
> > type='checkbox' name='" + ascii + "'> " + json[eid][type][ascii] + "</
> > input><br>\n";
> >  tags[type] = tags[type] ? tags[type] : document.getElementById(type);
> >  if (tags[type]) {
> >    tags[type].innerHTML = tags[type].innerHTML + "<li><a href='" + eid
> > + "/tag/" + ascii + "'>" + json[eid][type][ascii] + "</a></li>\n";
> >  }
>
> > /*  jQuery version */
>
> > var all = $("#tagsSelect").html() + "<input type='checkbox' name='" +
> > ascii + "'> " + json[eid][type][ascii] + "</input><br>\n";
> >   $("#tagsSelect").html(all);
> >   var html = $("#" + type).html() + "<li><a href='" + eid + "/tag/" +
> > ascii + "'>" + json[eid][type][ascii] + "</a></li>\n";
> >  $("#" + type).html(html);
> >                 */
>
> >   }
> > }
>
> > var end = new Date();
> > alert(end - start); //display execution time in milliseconds
>
> > Here is the JSON:
>
> > {"pkeane":
> >   {
> >      "slideshow":
> >      {"educause_no_1":"educause no 1","educause_slides":"educause
> > slides","educause_backups":"educause backups","saved_images":"saved
> > images","tcdl":"tcdl","test_tcdl":"test tcdl","top_hats":"top
> > hats","zoom":"zoom","tddp_mockup":"tddp mockup","tgdp_mocks":"tgdp
> > mocks","dase_workshop":"dase workshop"},
> >      "user_collection":
> >      {"test_20":"test","rebuild_this":"rebuild
> > this!","blues_1":"blues_1","new_test":"new test","ok_new_semester":"ok
> > new semester","ssss":"ssss","matisse":"matisse","ben_shahn":"ben
> > shahn"},"cart":{"keanepj":"My Cart"},
> >      "subscription":
> >      {"texas_politics_feature_of_the_week":"Texas Politics Feature of
> > the
> > Week","aeneid7_8":"Aeneid7-8","agamemnon":"Agamemnon","rome_da
> > y_1":"Rome
> > day 1","alor_charts":"alor charts","frank_lloyd_wright":"Frank Lloyd
> > Wright","tigerfeed":"tigerFeed","clarke_alor_3_1":"Clarke, ALOR 3"
> >      }
> >    }
> > }

Reply via email to