Velocity2013上有一篇演讲说的是static memory of javascript, 是关于emscripten的应用。除了迁移C/C++的lib到javascript之外,还提到一个观点是关于static memory的。由于在C/C++中的内存都是手动分配和释放,所以在emscripten生成的asm.js中会事先分配一个大heap,之后所有的相关内存管理都在这个heap中进行,就没gc啥事了。

好处是避免的gc在意料不到的时候进行, 观点合理的手动分配是最高效的。emscripten在游戏方面还是很有用,很多游戏引擎剥离gpu相关的代码之后都是纯计算的没有io操作,在浏览器中执行没有任何问题,然后就是游戏对于使用的流畅性,gc的无法预知会导致一定是有在某个时刻会开始进行gc而导致性能下降,表现就是卡死。这对网络游戏者来说是致命的。

static memory,管理起来比较麻烦,但是也是说明如果在一个object创建和销毁频繁的情况下,使用object pool是非常有效的。如果在gc上碰到性能瓶颈也可以通过提前预支一块heap来优化。

然后一直在想的一点是javascript和大部分语言不一样的地方是没有struct,只有array能勉强算作struct,对于object之类的内存结构也无法预知内存空间大小。导致在操作数据方面性能比起java,python等处于劣势。这也是为什么新的要替代javascript的语言typescript, dart都会提供class的原因, 至于之后javascript提供的class提供了语法糖但是并没有阻止prototype上在被定义之后添加新的属性。也就是说只有在运行时可以做优化认为是struct,而不能在编译时确认为struct,从而也没法进行内存的优先分配或者脱离prototype机制运行。