出于兴趣,是否可以确定JavaScript变量的大小(以字节为单位)?
我有一个在桌面上运行良好但blows up在iPad上运行*的网络应用程序.我猜这是因为iPad Safari中的内存量有限,但我想知道我的应用程序中发生了什么.
我可以根据JSON源的大小估计相对大小,但知道序列化对象的实际大小会更好
这不会直接回答您的问题.JS语言参考没有指定如何存储数据,所以这取决于执行实现的组,在本例中是WebKit团队,我没有看到任何公开的内容.我绝对没有看到任何有关Mobile Safari的WebKit实现的信息.
我要说的是桌面上的东西实际上可能不是很好,只是桌面的速度和大小掩盖了移动设备上出现的"问题".在iOS上,如果我没记错的话,浏览器实例的上限为10MB可以操作,但在实际操作中,你开始在6或7MB左右碰壁.在PC上,当RAM用完时,计算机只会将未使用的内存转储到磁盘上.在iOS上,资源停止加载(例如图像)或浏览器刚刚退出(这可能是您正在经历的).
如果您有Mac,可以使用名为"Instruments"的工具(它是iOS SDK的一部分)窥探Safari,看看它是如何做的.如果您没有Mac或者不想下载SDK,只需打开一个干净的Safari实例,打开Windows的"任务管理器"或Mac的"活动监视器",并观察加载Web应用程序时内存使用情况的变化情况.
保持在6MB的窗口是令人讨厌的.最重要的是尽量避免创建新图像.例如,这种模式在iPhone上是个大问题:
function placeImage(imagename,targetelement) {
var image = new Image();
image.src = imagename;
targetelement.appendChild(image);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,即使您从DOM中删除了图像,即使image是在placeImage其范围内,它也永远不会被释放,此应用程序崩溃浏览器只是时间问题.如果是这种情况,请考虑一次需要显示多少图像,仅为这些元素创建图像对象并回收它们(只需在src需要新图像时重置).
此外,我发现JavaScript的应用程序堆栈比桌面浏览器小得多,因此如果你有很多递归,你会在iOS上看到问题的速度要快得多.发现此问题的方法是在Safari中打开开发人员工具并使用分析器查看最常被调用的函数.
[编辑]我不记得这是否是公开如何通过webkit在内部以不同方式存储数字的确切技术,但我认为是.基本上,你对一百万个随机数进行排序,先用浮点数,然后(如果你取消注释该行)一个整数然后一个大整数.我对键入的语言并不擅长,所以我不确定这证明了什么,除了内部数字根据它们最小的可能表示而被区别对待.
arrTarget = [];
for (var i = 0; i < 1000000; i++) {
arrTarget.push(Math.random() * 16000000);
// arrTarget.push(Math.floor(Math.random() * 16000000));
// arrTarget.push(Math.floor(Math.random() * 1600000000000));
}
// Time how long it takes to sort the array:
var time = new Date().getTime();
arrTarget.sort();
console.log(new Date().getTime() - time);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16577 次 |
| 最近记录: |