diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-11-29 12:09:06 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-11-29 12:09:06 -0800 |
commit | 92d360734cb85851aaa3a328ebe3ffa67700cf06 (patch) | |
tree | 78d4bb7ebc9354f5fc8fe74bc6dc2e55103c9507 | |
parent | 7b6798ecf48622d5c9fe9b20a5950bd5c3f13bb7 (diff) |
more memory debugging tools and minor optimizations
-rw-r--r-- | src/framework.js | 31 | ||||
-rw-r--r-- | src/jsifier.js | 8 |
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 |