2011-03-10 42 views
4

出于兴趣,是否可以确定JavaScript变量的大小(以字节为单位)?JavaScript中变量的大小

我有一个在桌面上运行很好的web应用程序,但在iPad上运行的是blows up *。我猜这是因为iPad Safari中的内存数量有限,但我想了解一下我的应用中发生了什么。

我估计相对大小的基础上,JSON源的大小,但Safari浏览器=减慢它会做得更好知道序列化对象

  • 的实际大小“炸毁”然后屏幕变黑,然后我回到标准的iPad主屏幕。不管那叫什么。在我看来,Safari已经用完了分配给浏览器实例的内存。
+3

请定义...“爆炸”。这就像获取用户错误报告,说:“有错误...” – jondavidjohn

+0

@jondavidjohn:或错误指示灯... – drudge

+0

它真的炸毁了吗?哇!你一定要提交一份错误报告。或者..更好地描述你的错误。好多了。 –

回答

9

这不会直接回答你的问题。 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); 
+0

这是一个非常有用的答案。谢谢安德鲁。我们已经尝试过仪器应用程序,但Safari没有显示。我猜想桌面没有出现问题,但没有想到看任务管理器。 6MB对于我所搅动的大量数据听起来是正确的。我正在削减它,但知道有这个限制是非常有用的。我之前看过Profiler,那里有很多动作。我会在早上再看一次。干杯 – TobyEvans

0

这是不是你可以在一般的事,但一些JavaScript对象的大小实现特定的,所以你有一些保证:

  • “的字符串值是String类型的成员,并且是零个或多个16位无符号整数值的有限有序序列。“
  • “类型Number是一组表示数字的值,在ECMAScript中,该值表示双精度64位格式IEEE 754值,包括特殊的”非数字“(NaN)值,正数无限,负无穷。“

Source