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

 

 

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