[英]Performance Memory Management in JavaScript
让我先从问题开始,然后填写原因/背景。
问题:是否有适用于JavaScript的内存分析工具?
问:有没有人在JavaScript中测试性能内存管理?
我想在JavaScript中尝试性能内存管理。 在C / C ++ / Assembly中,我能够在一个巨型块中分配一个内存区域,然后将我的数据结构映射到该区域。 这有几个性能优势,特别是对于数学繁重的应用程序。
我知道我无法分配内存并在JavaScript(或Java)中映射我自己的数据结构。 但是,我可以使用一些预定数量的对象创建堆栈/队列/堆,例如Vector对象。 在处理数字时,我经常在任何时候只需要几个这样的对象,但随着时间的推移会产生大量的数据。 通过重用旧的矢量对象,我可以避免创建/删除时间,不必要的垃圾收集时间,以及等待垃圾收集时可能存在的大量内存占用。 我还假设它们将在内存中保持相当接近,因为它们是在同一时间创建的并且经常被访问。
我想测试一下,但我的内存分析工具很简短。 我尝试过FireBug,但它没有告诉你JavaScript引擎当前分配了多少内存。
我能够编写一个简单的CPU性能测试(见下文)。 我将一个队列与10个“Vector”对象进行比较,每次都使用new / delete。 为了确定我不只是使用空数据,我分配了Vector 6浮点属性,三个值数组(浮点数)和一个18个字符的字符串。 每次我使用任一方法创建一个向量时,我都会将所有值设置为0.0。
结果令人鼓舞。 显式管理方法最初速度更快,但javascript引擎有一些缓存,并且在运行测试几次后它就赶上了。 最有趣的部分是当我尝试在1000万个对象上运行标准的new / delete时,FireBug崩溃了,但是对于我的队列方法工作得很好。
如果我能找到内存分析工具,我想在不同的结构(数组,堆,队列,堆栈)上测试它。 我还想在一个真实的应用程序上测试它,也许是一个超级简单的光线跟踪器(快速编写代码,可以测试非常大的数据集,其中有大量的数学用于很好的分析)。
是的,我在创建这个问题之前就进行了搜索。 我发现的一切都是讨论JavaScript中的内存泄漏或讨论GC与显式管理。
谢谢,JB
标准方法
function setBaseVectorValues(vector) {
vector.x = 0.0;
vector.y = 0.0;
vector.z = 0.0;
vector.theta = 0.0;
vector.phi = 0.0;
vector.magnitude = 0.0;
vector.color = [0.0, 0.0, 0.0];
vector.description = "a blank base vector";
}
function standardCreateObject() {
var vector = new Object();
setBaseVectorValues(vector);
return vector;
}
function standardDeleteObject(obj) {
delete obj;
}
function testStandardMM(count) {
var start = new Date().getTime();
for(i=0; i<count; i++) {
obj = standardCreateObject();
standardDeleteObject(obj);
}
var end = new Date().getTime();
return "Time: " + (end - start)
}
管理方法
我使用了来自http://code.stephenmorley.org/javascript/queues/的JavaScript队列
function newCreateObject() {
var vector = allocateVector();
setBaseVectorValues(vector);
return vector;
}
function newDeleteObject(obj) {
queue.enqueue(obj);
}
function newInitObjects(bufferSize) {
queue = new Queue()
for(i=0; i<bufferSize; i++) {
queue.enqueue(standardCreateObject());
}
}
function allocateVector() {
var vector
if(queue.isEmpty()) {
vector = new Object();
}else {
vector = queue.dequeue();
}
return vector;
}
function testNewMM(count) {
start = new Date().getTime();
newInitObjects(10);
for(i=0; i<count; i++) {
obj = newCreateObject();
newDeleteObject(obj);
obj = null;
}
end = new Date().getTime();
return "Time: " + (end - start) + "Vectors Available: " + queue.getLength();
}
chrome检查器有一个不错的javascript分析工具。 我试试......
我从来没有见过这样的工具,但实际上,javascript [几乎]从不独立运行; 它[几乎]总是托管在另一个应用程序(例如您的浏览器)中。 与特定数据结构相关联的内存并不重要,重要的是主机应用程序的整体内存消耗如何受脚本影响。
我建议为您的操作系统找一个通用的内存分析工具,并将其指向您的浏览器。 运行单个页面并在触发代码之前和之后分析浏览器内存消耗的变化。
我刚才能想到的唯一例外是node.js ...如果您使用的是节点,那么您可以使用process.memoryUsage()
。
编辑: Oooo ...经过一些搜索, Chrome似乎也有一些甜蜜的工具 。 ( Michael Berkompas的+1 )。 我仍然支持我最初的陈述,看看浏览器进程本身的内存使用情况如何受到影响实际上更为重要,但Chrome工具的优雅性令人印象深刻。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.