aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-11-29 12:09:06 -0800
committerAlon Zakai <alonzakai@gmail.com>2011-11-29 12:09:06 -0800
commit92d360734cb85851aaa3a328ebe3ffa67700cf06 (patch)
tree78d4bb7ebc9354f5fc8fe74bc6dc2e55103c9507
parent7b6798ecf48622d5c9fe9b20a5950bd5c3f13bb7 (diff)
more memory debugging tools and minor optimizations
-rw-r--r--src/framework.js31
-rw-r--r--src/jsifier.js8
2 files changed, 28 insertions, 11 deletions
diff --git a/src/framework.js b/src/framework.js
index 495d0167..0f9e70d0 100644
--- a/src/framework.js
+++ b/src/framework.js
@@ -17,9 +17,19 @@ var DEBUG = 0;
var DEBUG_MEMORY = 0;
var MemoryDebugger = {
- time: Date.now(),
- datas: {},
- last: 0,
+ clear: function() {
+ MemoryDebugger.time = Date.now();
+ MemoryDebugger.datas = {};
+ var info = MemoryDebugger.doGC();
+ MemoryDebugger.last = info[2];
+ MemoryDebugger.tick('--clear--');
+ },
+
+ doGC: function() {
+ var raw = gc().replace('\n', '');
+ print('zz raw gc info: ' + raw);
+ return /before (\d+), after (\d+),.*/.exec(raw);
+ },
tick: function(name) {
var now = Date.now();
@@ -30,14 +40,14 @@ var MemoryDebugger = {
// assume |name| exists from now on
- print('zzz timer gc...');
var raw = gc().replace('\n', '');
- print('zzz gc: ' + raw);
- var info = /before (\d+), after (\d+),.*/.exec(raw);
+ var info = MemoryDebugger.doGC();
var before = info[1];
var after = info[2];
+ // A GC not called by us may have done some work 'silently'
var garbage = before - after;
var real = after - MemoryDebugger.last;
+ print('zz gc stats changes: ' + [name, real, garbage]);
MemoryDebugger.last = after;
if (Math.abs(garbage) + Math.abs(real) > 0) {
@@ -52,6 +62,7 @@ var MemoryDebugger = {
}
data.garbage += garbage;
data.real += real;
+ data.count++;
}
MemoryDebugger.dump();
@@ -61,13 +72,15 @@ var MemoryDebugger = {
var vals = values(MemoryDebugger.datas);
print('zz real:');
vals.sort(function(x, y) { return y.real - x.real });
- vals.forEach(function(v) { if (v.real > 1024*1024) print('zz ' + v.name + ' real = ' + (v.real/(1024*1024)).toFixed(3) + ' mb'); });
+ vals.forEach(function(v) { if (Math.abs(v.real) > 1024*1024) print('zz ' + v.name + ' real = ' + (v.real/(1024*1024)).toFixed(3) + ' mb'); });
print('zz garbage:');
vals.sort(function(x, y) { return y.garbage - x.garbage });
- vals.forEach(function(v) { if (v.garbage > 1024*1024) print('zz ' + v.name + ' garbage = ' + (v.garbage/(1024*1024)).toFixed(3) + ' mb'); });
+ vals.forEach(function(v) { if (Math.abs(v.garbage) > 1024*1024) print('zz ' + v.name + ' garbage = ' + (v.garbage/(1024*1024)).toFixed(3) + ' mb'); });
}
}
+if (DEBUG_MEMORY) MemoryDebugger.clear();
+
Substrate = function(name_) {
this.name_ = name_;
this.actors = {};
@@ -121,6 +134,8 @@ Substrate.prototype = {
solve: function() {
dprint('framework', "// Solving " + this.name_ + "...");
+ if (DEBUG_MEMORY) MemoryDebugger.tick('pre-run substrate ' + this.name_ + ' (priors may be cleaned)');
+
var startTime = Date.now();
var midTime = startTime;
var that = this;
diff --git a/src/jsifier.js b/src/jsifier.js
index 48fb7968..099fa4c6 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -99,12 +99,14 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
for (var i = 0; i < data.unparsedFunctions.length; i++) {
var func = data.unparsedFunctions[i];
+ // We don't need to save anything past here
+ data.unparsedFunctions[i] = null;
dprint('unparsedFunctions', '====================\n// Processing |' + func.ident + '|, ' + i + '/' + data.unparsedFunctions.length);
+ if (DEBUG_MEMORY) MemoryDebugger.tick('pre-func ' + func.ident);
JSify(analyzer(intertyper(func.lines, true, func.lineNum-1)), true, Functions, GLOBAL_VARIABLES);
- // We don't need to save anything here, the function has printed itself out and can now be forgotten
- data.unparsedFunctions[i] = null;
- //if (DEBUG_MEMORY) MemoryDebugger.tick('func ' + i + '|' + func.ident + (i == 0 ? ' <first>' : ''));
+ if (DEBUG_MEMORY) MemoryDebugger.tick('func ' + func.ident);
}
+ func = null; // Do not hold on to anything from inside that loop (JS function scoping..)
// Actors