Lexical Scope Memoization

JavaScript performance comparison

Test case created by ForbesLindesay

Info

This tests two versions of lexical scope. The first version does not use memoization, the second one does.

Preparation code

<script src="https://s3-eu-west-1.amazonaws.com/forbes-public/lexical-scope/unmemoized.min.js">
</script>
<script src="https://s3-eu-west-1.amazonaws.com/forbes-public/lexical-scope/memoized.min.js">
</script>
<script id="fixture" type="text/plain">
  function anonymous(locals) {
    var buf = [];
    var locals_ = locals || {},
        report = locals_.report;
    buf.push('<div class="data"><ol id="contents" class="sortable">');
    (function() {
      var $$obj = report;
      if ("number" == typeof $$obj.length) {
        for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
          var item = $$obj[$index];
          if (!item.parent) {
            buf.push("<div><li" + jade.attrs({
              "data-ref": item.id,
              "class": ["chapter"]
            }, {
              "data-ref": true
            }) + "><a" + jade.attrs({
              href: "/admin/report/detail/" + item.id
            }, {
              href: true
            }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
            var chp = item.id; {
              buf.push('<ol class="sortable">');
              (function() {
                var $$obj = report;
                if ("number" == typeof $$obj.length) {
                  for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                    var item = $$obj[$index];
                    if (item.parent === chp && item.type === "section") {
                      buf.push("<div><li" + jade.attrs({
                        "data-ref": item.id,
                        "class": ["section"]
                      }, {
                        "data-ref": true
                      }) + "><a" + jade.attrs({
                        href: "/admin/report/detail/" + item.id
                      }, {
                        href: true
                      }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                      var sec = item.id; {
                        buf.push('<ol class="sortable">');
                        (function() {
                          var $$obj = report;
                          if ("number" == typeof $$obj.length) {
                            for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                              var item = $$obj[$index];
                              if (item.parent === sec && item.type === "page") {
                                buf.push("<div><li" + jade.attrs({
                                  "data-ref": item.id,
                                  "class": ["page"]
                                }, {
                                  "data-ref": true
                                }) + "><a" + jade.attrs({
                                  href: "/admin/report/detail/" + item.id
                                }, {
                                  href: true
                                }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                                var page = item.id; {
                                  buf.push('<ol class="sortable">');
                                  (function() {
                                    var $$obj = report;
                                    if ("number" == typeof $$obj.length) {
                                      for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    } else {
                                      var $$l = 0;
                                      for (var $index in $$obj) {
                                        $$l++;
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    }
                                  }).call(this);
                                  buf.push("</ol>")
                                }
                                buf.push("</div>")
                              }
                            }
                          } else {
                            var $$l = 0;
                            for (var $index in $$obj) {
                              $$l++;
                              var item = $$obj[$index];
                              if (item.parent === sec && item.type === "page") {
                                buf.push("<div><li" + jade.attrs({
                                  "data-ref": item.id,
                                  "class": ["page"]
                                }, {
                                  "data-ref": true
                                }) + "><a" + jade.attrs({
                                  href: "/admin/report/detail/" + item.id
                                }, {
                                  href: true
                                }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                                var page = item.id; {
                                  buf.push('<ol class="sortable">');
                                  (function() {
                                    var $$obj = report;
                                    if ("number" == typeof $$obj.length) {
                                      for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    } else {
                                      var $$l = 0;
                                      for (var $index in $$obj) {
                                        $$l++;
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    }
                                  }).call(this);
                                  buf.push("</ol>")
                                }
                                buf.push("</div>")
                              }
                            }
                          }
                        }).call(this);
                        buf.push("</ol>")
                      }
                      buf.push("</div>")
                    }
                  }
                } else {
                  var $$l = 0;
                  for (var $index in $$obj) {
                    $$l++;
                    var item = $$obj[$index];
                    if (item.parent === chp && item.type === "section") {
                      buf.push("<div><li" + jade.attrs({
                        "data-ref": item.id,
                        "class": ["section"]
                      }, {
                        "data-ref": true
                      }) + "><a" + jade.attrs({
                        href: "/admin/report/detail/" + item.id
                      }, {
                        href: true
                      }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                      var sec = item.id; {
                        buf.push('<ol class="sortable">');
                        (function() {
                          var $$obj = report;
                          if ("number" == typeof $$obj.length) {
                            for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                              var item = $$obj[$index];
                              if (item.parent === sec && item.type === "page") {
                                buf.push("<div><li" + jade.attrs({
                                  "data-ref": item.id,
                                  "class": ["page"]
                                }, {
                                  "data-ref": true
                                }) + "><a" + jade.attrs({
                                  href: "/admin/report/detail/" + item.id
                                }, {
                                  href: true
                                }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                                var page = item.id; {
                                  buf.push('<ol class="sortable">');
                                  (function() {
                                    var $$obj = report;
                                    if ("number" == typeof $$obj.length) {
                                      for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    } else {
                                      var $$l = 0;
                                      for (var $index in $$obj) {
                                        $$l++;
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    }
                                  }).call(this);
                                  buf.push("</ol>")
                                }
                                buf.push("</div>")
                              }
                            }
                          } else {
                            var $$l = 0;
                            for (var $index in $$obj) {
                              $$l++;
                              var item = $$obj[$index];
                              if (item.parent === sec && item.type === "page") {
                                buf.push("<div><li" + jade.attrs({
                                  "data-ref": item.id,
                                  "class": ["page"]
                                }, {
                                  "data-ref": true
                                }) + "><a" + jade.attrs({
                                  href: "/admin/report/detail/" + item.id
                                }, {
                                  href: true
                                }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                                var page = item.id; {
                                  buf.push('<ol class="sortable">');
                                  (function() {
                                    var $$obj = report;
                                    if ("number" == typeof $$obj.length) {
                                      for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    } else {
                                      var $$l = 0;
                                      for (var $index in $$obj) {
                                        $$l++;
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    }
                                  }).call(this);
                                  buf.push("</ol>")
                                }
                                buf.push("</div>")
                              }
                            }
                          }
                        }).call(this);
                        buf.push("</ol>")
                      }
                      buf.push("</div>")
                    }
                  }
                }
              }).call(this);
              buf.push("</ol>")
            }
            buf.push("</div>")
          }
        }
      } else {
        var $$l = 0;
        for (var $index in $$obj) {
          $$l++;
          var item = $$obj[$index];
          if (!item.parent) {
            buf.push("<div><li" + jade.attrs({
              "data-ref": item.id,
              "class": ["chapter"]
            }, {
              "data-ref": true
            }) + "><a" + jade.attrs({
              href: "/admin/report/detail/" + item.id
            }, {
              href: true
            }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
            var chp = item.id; {
              buf.push('<ol class="sortable">');
              (function() {
                var $$obj = report;
                if ("number" == typeof $$obj.length) {
                  for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                    var item = $$obj[$index];
                    if (item.parent === chp && item.type === "section") {
                      buf.push("<div><li" + jade.attrs({
                        "data-ref": item.id,
                        "class": ["section"]
                      }, {
                        "data-ref": true
                      }) + "><a" + jade.attrs({
                        href: "/admin/report/detail/" + item.id
                      }, {
                        href: true
                      }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                      var sec = item.id; {
                        buf.push('<ol class="sortable">');
                        (function() {
                          var $$obj = report;
                          if ("number" == typeof $$obj.length) {
                            for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                              var item = $$obj[$index];
                              if (item.parent === sec && item.type === "page") {
                                buf.push("<div><li" + jade.attrs({
                                  "data-ref": item.id,
                                  "class": ["page"]
                                }, {
                                  "data-ref": true
                                }) + "><a" + jade.attrs({
                                  href: "/admin/report/detail/" + item.id
                                }, {
                                  href: true
                                }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                                var page = item.id; {
                                  buf.push('<ol class="sortable">');
                                  (function() {
                                    var $$obj = report;
                                    if ("number" == typeof $$obj.length) {
                                      for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    } else {
                                      var $$l = 0;
                                      for (var $index in $$obj) {
                                        $$l++;
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    }
                                  }).call(this);
                                  buf.push("</ol>")
                                }
                                buf.push("</div>")
                              }
                            }
                          } else {
                            var $$l = 0;
                            for (var $index in $$obj) {
                              $$l++;
                              var item = $$obj[$index];
                              if (item.parent === sec && item.type === "page") {
                                buf.push("<div><li" + jade.attrs({
                                  "data-ref": item.id,
                                  "class": ["page"]
                                }, {
                                  "data-ref": true
                                }) + "><a" + jade.attrs({
                                  href: "/admin/report/detail/" + item.id
                                }, {
                                  href: true
                                }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                                var page = item.id; {
                                  buf.push('<ol class="sortable">');
                                  (function() {
                                    var $$obj = report;
                                    if ("number" == typeof $$obj.length) {
                                      for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    } else {
                                      var $$l = 0;
                                      for (var $index in $$obj) {
                                        $$l++;
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    }
                                  }).call(this);
                                  buf.push("</ol>")
                                }
                                buf.push("</div>")
                              }
                            }
                          }
                        }).call(this);
                        buf.push("</ol>")
                      }
                      buf.push("</div>")
                    }
                  }
                } else {
                  var $$l = 0;
                  for (var $index in $$obj) {
                    $$l++;
                    var item = $$obj[$index];
                    if (item.parent === chp && item.type === "section") {
                      buf.push("<div><li" + jade.attrs({
                        "data-ref": item.id,
                        "class": ["section"]
                      }, {
                        "data-ref": true
                      }) + "><a" + jade.attrs({
                        href: "/admin/report/detail/" + item.id
                      }, {
                        href: true
                      }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                      var sec = item.id; {
                        buf.push('<ol class="sortable">');
                        (function() {
                          var $$obj = report;
                          if ("number" == typeof $$obj.length) {
                            for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                              var item = $$obj[$index];
                              if (item.parent === sec && item.type === "page") {
                                buf.push("<div><li" + jade.attrs({
                                  "data-ref": item.id,
                                  "class": ["page"]
                                }, {
                                  "data-ref": true
                                }) + "><a" + jade.attrs({
                                  href: "/admin/report/detail/" + item.id
                                }, {
                                  href: true
                                }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                                var page = item.id; {
                                  buf.push('<ol class="sortable">');
                                  (function() {
                                    var $$obj = report;
                                    if ("number" == typeof $$obj.length) {
                                      for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    } else {
                                      var $$l = 0;
                                      for (var $index in $$obj) {
                                        $$l++;
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    }
                                  }).call(this);
                                  buf.push("</ol>")
                                }
                                buf.push("</div>")
                              }
                            }
                          } else {
                            var $$l = 0;
                            for (var $index in $$obj) {
                              $$l++;
                              var item = $$obj[$index];
                              if (item.parent === sec && item.type === "page") {
                                buf.push("<div><li" + jade.attrs({
                                  "data-ref": item.id,
                                  "class": ["page"]
                                }, {
                                  "data-ref": true
                                }) + "><a" + jade.attrs({
                                  href: "/admin/report/detail/" + item.id
                                }, {
                                  href: true
                                }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li>");
                                var page = item.id; {
                                  buf.push('<ol class="sortable">');
                                  (function() {
                                    var $$obj = report;
                                    if ("number" == typeof $$obj.length) {
                                      for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    } else {
                                      var $$l = 0;
                                      for (var $index in $$obj) {
                                        $$l++;
                                        var item = $$obj[$index];
                                        if (item.parent === page && item.type === "subpage") {
                                          buf.push("<div><li" + jade.attrs({
                                            "data-ref": item.id,
                                            "class": ["subpage"]
                                          }, {
                                            "data-ref": true
                                          }) + "><a" + jade.attrs({
                                            href: "/admin/report/detail/" + item.id
                                          }, {
                                            href: true
                                          }) + ">" + jade.escape(null == (jade.interp = item.name) ? "" : jade.interp) + "</a></li></div>")
                                        }
                                      }
                                    }
                                  }).call(this);
                                  buf.push("</ol>")
                                }
                                buf.push("</div>")
                              }
                            }
                          }
                        }).call(this);
                        buf.push("</ol>")
                      }
                      buf.push("</div>")
                    }
                  }
                }
              }).call(this);
              buf.push("</ol>")
            }
            buf.push("</div>")
          }
        }
      }
    }).call(this);
    buf.push("</ol></div>");
    return buf.join("")
  }
</script>
<script>
Benchmark.prototype.setup = function() {
    var src = document.getElementById('fixture').innerHTML
};
</script>

Preparation code output

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
unmemoized
unmemoizedLexicalScope(src)
pending…
memoized
memoizedLexicalScope(src)
pending…

You can edit these tests or add even more tests to this page by appending /edit to the URL.

Compare results of other browsers

0 comments

Add a comment