这不会直接回答你的问题。 JS语言参考没有指定如何存储数据,所以这取决于执行实现的组,在这种情况下,WebKit团队,我没有看到任何公开的。我绝对没有看到任何关于Mobile Safari的WebKit实现。
我想说的是,桌面上的东西实际上可能不会很好,只是桌面的速度和大小掩盖了移动设备上出现的“问题”。在iOS上,如果我没有记错的话,浏览器实例的上限为10MB,但实际上,您开始在大约6或7MB的范围内打墙。在个人电脑上,当你用完RAM时,电脑只会将未使用的内存转存到磁盘中。在iOS上,资源会停止加载(如图像)或浏览器刚刚退出(这可能是您正在经历的)。
如果你有一台Mac,你可以在Safari上窥探它,看看它是如何使用名为“Instruments”的工具(它是iOS SDK的一部分)。如果您没有Mac或不想下载SDK,只需打开一个干净的Safari实例,打开Windows的任务管理器或Mac的活动监视器,并观察加载Web应用程序时内存使用情况的变化。
保持在6MB窗口内很烦人。最重要的是尽量避免创建新的图像。例如,这种模式是在iPhone上的一个巨大的问题:
function placeImage(imagename,targetelement) {
var image = new Image();
image.src = imagename;
targetelement.appendChild(image);
}
在这种情况下,即使你从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);
请定义...“爆炸”。这就像获取用户错误报告,说:“有错误...” – jondavidjohn
@jondavidjohn:或错误指示灯... – drudge
它真的炸毁了吗?哇!你一定要提交一份错误报告。或者..更好地描述你的错误。好多了。 –