xml地图|网站地图|网站标签 [设为首页] [加入收藏]

您的位置:亚洲必赢 > 计算机尝试 > 占用内存大小,PHP数组实际占用内存大小的分析

占用内存大小,PHP数组实际占用内存大小的分析

发布时间:2019-06-26 21:26编辑:计算机尝试浏览(184)

    咱俩日常编写制定的Objective-C代码本质上实在都是透过尾部的CC 占用内存大小,PHP数组实际占用内存大小的分析。代码的完毕的,而CC 代码会变卦成汇编语言,最终被计算机解释成能识其他机器语言。

    图片 1image正因为OC底层是经过CC 言语完毕,故大家得以因此clang编译器将OC代码转变到CC 语言

    仿效资料

    Android开拓绕可是的坑:你的Bitmap究竟占多大内部存款和储蓄器?

    咱俩在头里的php高效写法提到,尽量不要复制变量,特别是数组。一般的话,PHP数组的内存利用率唯有1/10, 也等于说,贰个在C语言里面100M 内部存款和储蓄器的数组,在PHP里面将要1G。上面大家得以回顾的估算PHP数组占用内部存款和储蓄器的分寸,首先大家测试1000个要素的卡尺头占用的内存:

     xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的cpp文件
    

    相关因素

    Bitmap 在内部存款和储蓄器个中攻下的大大小小其实在于:

    • 色彩格式,前边大家早就涉嫌,要是是 ARAV4GB8888 那么正是一个像素4个字节,如果是 奥迪Q5GB565 那正是2个字节
    • 原来文件存放的财富目录
    • 目的显示屏的密度(所以同等条件下,OPPO在财富方面消耗的内部存款和储蓄器确定是要小于三星(Samsung)S6的)
    <?php        echo memory_get_usage() , '<br>';        $start = memory_get_usage();        $a = Array();        for ($i=0; $i<1000; $i  ) {        $a[$i] = $i   $i;        }        $mid =  memory_get_usage();        echo memory_get_usage() , '<br>';        for ($i=1000; $i<2000; $i  ) {        $a[$i] = $i   $i;        }        $end =  memory_get_usage();        echo memory_get_usage() , '<br>';        echo 'argv:', ($mid - $start)/1024 ,'kb' , '<br>';        echo 'argv:',($end - $mid)/1024 ,'kb' , '<br>';    
    

    假使急需链接别的框架,使用-framework参数。比如-framework UIKit

    总括公式

    int realWidth = (int) (rawWidth * targetDensity / (float) rawDensity   0.5f)
    int realHeight = (int) (rawHeight * targetDensity / (float) rawDensity   0.5f) 
    int memory = realWidth * realHeight * bytes_for_current_colorMode;
    
    • rawWidth正是财富图形的本来面目宽度
    • targetDensity就是眼前显示器的density
    • rawDensity就是能源图形所在的能源文件夹对应的density
    • bytes_for_current_colorMode正是时下色彩格式下各样像素对应的字节数

    BitmapFactory.Options:

    If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory.

    输出是:

    透过上述转变之后很轻巧找到 NSObject 类的真的落实

    350752
    435248
    519424
    argv:84.416byte
    argv:84.176byte

    struct NSObject_IMPL { Class isa; }
    

    大约明白壹仟 个要素的卡尺头数组要求占用 82k 内部存款和储蓄器,平均每一种成分占用 八十二个字节。而纯 C 中完全只供给 4k(一个整型占用4byte * 1000 )。memory_get_usage() 重回的结果并不是全部都以被数组占用了,还要包含部分 PHP 运维本身分配的局地布局,大概用内置函数生成的数组更近乎实际的空间:

    咱俩开掘在NSObject_IMPL中只有贰个名字为 isa 的 Class 实例。那些Class又是多少个怎么事物吗?

    <?php        $start = memory_get_usage(true);        $a = array_fill(0, 10000, 1);        $mid = memory_get_usage(true); //10k elements array;         echo 'argv:', ($mid - $start )/10000,'byte' , '<br>';        $b = array_fill(0, 10000, 1);        $end = memory_get_usage(true); //10k elements array;         echo 'argv:', ($end - $mid)/10000 ,'byte' , '<br>';    
    
    /// An opaque type that represents an typedef struct objc_class *Class;
    

    得到:
    argv:54.5792byte
    argv:54.5792byte

    发掘 Class 实际上是二个针对 objc_class 的结构体指针,其实NSObject末尾是三个对准结构体 objc_class的名为isa的结构体指针。

    从那么些结果来看犹如二个数组元素大致占用了伍拾八个左右的字节。再看看数组在Zend里面包车型大巴C结构,PHP中的数组变量,首先要求三个zval 结构:
    struct _zval_struct {
       zvalue_value value;
       zend_uint refcount__gc;
       zend_uchar type;
       zend_uchar is_ref__gc;
    };
    zvalue_value 是一个union:
    typedef union _zvalue_value {
       long lval;
       double dval;
       struct {
           char *val;
           int len;
       } str;
       HashTable *ht;
       zend_object_value obj;
    } zvalue_value;

    接下去大家经过Runtime中 的class_getInstanceSize来查看下NSObject这几个类的实例对象的分子变量的尺寸

    本文由亚洲必赢发布于计算机尝试,转载请注明出处:占用内存大小,PHP数组实际占用内存大小的分析

    关键词: 内存大小 NSObject Android开发

上一篇:插件详解

下一篇:没有了