让我从问题开始,然后填写原因/背景。
问题:是否有任何用于 JavaScript 的内存分析工具?
问题:有人已经在 JavaScript 中测试过性能内存管理吗?
我想在 JavaScript 中试验性能内存管理。在 C/C++/Assembly 中,我能够在一个巨大的块中分配一个内存区域,然后将我的数据结构映射到该区域。这有几个性能优势,特别是对于数学繁重的应用程序。
我知道我无法在 JavaScript(或 Java)中分配内存和映射我自己的数据结构。但是,我可以使用一些预定数量的对象(例如 Vector 对象)创建堆栈/队列/堆。在处理数字时,我经常在任何时候都只需要几个这样的对象,但随着时间的推移会产生大量的数字。通过重用旧的向量对象,我可以避免创建/删除时间、不必要的垃圾收集时间以及等待垃圾收集时潜在的大内存占用。我还假设它们都将在内存中保持相当接近,因为它们是同时创建的并且经常被访问。
我想对此进行测试,但我缺少内存分析工具。我试过 FireBug,但它没有告诉你 JavaScript 引擎当前分配了多少内存。
我能够编写一个简单的 CPU 性能测试(见下文)。我将一个包含 10 个“矢量”对象的队列与每次使用 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();
}