add a destroy() method
authorDan Vanderkam <danvdk@gmail.com>
Fri, 19 Feb 2010 07:48:50 +0000 (23:48 -0800)
committerDan Vanderkam <danvdk@gmail.com>
Fri, 19 Feb 2010 07:48:50 +0000 (23:48 -0800)
dygraph.js
tests/perf.html

index 5e824ae..504cee7 100644 (file)
@@ -351,7 +351,35 @@ Dygraph.prototype.createInterface_ = function() {
   this.createStatusMessage_();
   this.createRollInterface_();
   this.createDragInterface_();
-}
+};
+
+/**
+ * Detach DOM elements in the dygraph and null out all data references.
+ * Calling this when you're done with a dygraph can dramatically reduce memory
+ * usage. See, e.g., the tests/perf.html example.
+ */
+Dygraph.prototype.destroy = function() {
+  var removeRecursive = function(node) {
+    while (node.hasChildNodes()) {
+      removeRecursive(node.firstChild);
+      node.removeChild(node.firstChild);
+    }
+  };
+  removeRecursive(this.maindiv_);
+
+  var nullOut = function(obj) {
+    for (var n in obj) {
+      if (typeof(obj[n]) === 'object') {
+        obj[n] = null;
+      }
+    }
+  };
+
+  // These may not all be necessary, but it can't hurt...
+  nullOut(this.layout_);
+  nullOut(this.plotter_);
+  nullOut(this);
+};
 
 /**
  * Creates the canvas containing the PlotKit graph. Only plotkit ever draws on
index 6515dee..e0f487c 100644 (file)
     <div id="status"></div>
 
     <script type="text/javascript">
-      var num_tests = 100;
+      var num_tests = 250;
       var times = [];
       var start = new Date;
 
       for (var i = 0; i < num_tests; i++) {
         var this_start = new Date;
+        // Calling destroy() here reduces the memory usage in Chrome by
+        // ~1.2MB/instantiation.
+        if (i) g.destroy();
         g = new Dygraph(
               document.getElementById("div_g"),
               NoisyData, {
@@ -34,7 +37,7 @@
       var end = new Date;
 
       document.getElementById("status").innerHTML = "Elapsed time: " + (end - start)/num_tests + " ms/instantiation";
-      new Dygraph(
+      perf = new Dygraph(
         document.getElementById("div_g"),
         times, {
           labels: [ "Iteration", "Time (ms)" ]