javascript性能分析

1、存儲單位:1GB = 1024MB, 1MB=1024KB,1KB=1024B,1B=8bit,1bit = 0/1。4B區分的最大數是(2^8)^4 = 2^32 = 4294967296 ,約42億

2、js的標量一般放在棧區中,如字符串和數字,對象放在堆區中。一個變量引用標量值時,會先查找這個標量在棧區有沒有,沒有則創建,然後返回引用,這個引用佔用內存一般是4B大小。

3、數組檢驗:創建1個空數組,開始一個10000次的循環,再內嵌一個10000次的循環用於新建一個內容都爲2的數組,然後放進該數組。執行完,通過瀏覽器自帶任務管理器可以查看,新增內存佔用約450MB,計算得一個數佔4B,索引約0.7B,將內容換成任意長的一個字符串,佔用不變。通過將內容換成一個變量,這個變量是new Number(2)創建的數字對象,佔用依舊不變。換成不一樣的浮點數,如10000 * i + j + 0.55,則內存直接翻倍,可見浮點數佔用8B,v8引擎對整數做了優化。  到這裏可以知道佔用內存大小  引用 = 整數 = 已存在的任意字符串 = 已存在的浮點數 = 4B,數組索引0.7B。 若將內容換成 10000 *  i + j + '',則內存直接爆炸,超過8G。單個字符,因爲是utf-8編碼,所以一般爲2B,存儲時ASCII只佔1B,所以瀏覽器控制檯輸出長字符串時顯示的大小一般大了一倍。   可知6萬長,內容爲2萬的長的0數組的數組佔用內存約5.25G(每長度4.7B),轉成json字符串存儲佔約2.21G(每長度爲1數字加逗號 * 1 =  2B,若爲字符串還要加兩個1B的冒號  )。  前面是小長度數組情況,當是單個數組很長時,索引將佔4B大小。

4、4294967295也是js數組的最大長度,長度超出或length超出就會報錯invalid array length。但是經過我實測(不斷push),實際上,瀏覽器裏數組最大長度是112813858,(1億),若先申請長度,再賦值,還小於這個長度。這個限制來自v8的對單個堆1Gb最大大小的限制,通過選項,例如--max-heap-size, --max_old_space_size, --max-semi-space-size,是不能夠解決的,這個問題早在2014年就被提出在這https://bugs.chromium.org/p/v8/issues/detail?id=3505

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章