2011-03-10 71 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