JavaScript如何准确测量单个函数运行占用的总内存
如何测量JavaScript单个函数的总内存占用
我在调研JavaScript单个函数占用总内存的测量方法,目前找到了performance.memory API,但注意到该API的usedJSHeapSize字段并非仅统计单个页面的内存,还可能跨标签页汇总数据。我的测试场景始终只打开一个标签页,因此仅需统计当前目标标签页的内存即可。
我了解到函数执行后需要等待一段时间,让垃圾回收器清理所有未使用的内存,据此编写了如下测量方案,但不确定该方案是否合理、内存测量逻辑是否正确,希望得到相关建议:
function wait(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } function fun1() { // 函数逻辑... } function fun2() { // 函数逻辑... } function measureMemory(functionToMeasure) { const memoryStart = performance.memory.usedJSHeapSize; functionToMeasure(); const memoryEnd = performance.memory.usedJSHeapSize; return memoryEnd - memoryStart; } async function runBenchmark() { const totalMemoryUsedByFun1 = measureMemory(fun1); // 等待2分钟确保垃圾回收清理所有未使用内存 await wait(120000); const totalMemoryUsedByFun2 = measureMemory(fun2); }
我想确认两个问题:
- 这种测量函数内存占用的方法是否合理?
- 等待2分钟是否足够让垃圾回收器清理完所有未使用的内存?
我担忧的异常场景示例
function fun1() { // 分配1000KB内存 } function fun2() { // 分配300KB内存 } // 初始堆大小 = 0 const memoryUsedByFun1 = measureMemory(fun1()); // 此时堆大小为1000KB // 假设我不等待GC执行,执行完fun1后仅500KB内存被释放 // 测量fun2前的堆大小为500KB const memoryUsedByFun2 = measureMemory(fun2()); // fun2执行过程中,fun1分配的剩余500KB内存被释放 // 此时计算memoryEnd - memoryStart // 其中memoryStart为500KB,memoryEnd为300KB(因为fun2执行时释放了fun1留下的500KB) // 最终计算结果为500KB - 300KB = 200KB // 这个结果完全不符合实际,因为fun2实际分配了300KB内存
我也了解到存在
measureUserAgentSpecificMemory()API,但即便开启了*#experimental-web-platform-features*实验性平台特性,该API似乎也完全无法正常工作。
内容的提问来源于stack exchange,提问作者Krzysztof Kaczyński
相关产品推荐
相关产品推荐

