赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
本帖最后由 紫苏 于 2010-8-8 15:38 编辑
如果你并没有进行数组插入或删除操作的话,用数组需要的额外时间是:
1、生成数组:需要在堆中分配内存,这个过程在如今比较主流的 CPU Cache + OS MMU + DDR 系列内存芯片条件下基本上可以看成没有任何时间效率损失;
2、随机访问:这个过程仅仅是一个指针偏移计算,所以也没有时间效率损失;
如果一个对象有 4800 个实例变量,那么:
1、底层用来组织对象成员的虚表就有 4800 的体积,增加了散列表的空间负荷,多少降低了进行再散列时的效率;
2、这 4800 个实例变量的定义占用了大量脚本篇幅,增加了解释器的符号表、文法树的体积,这是一个空间上的损失;由于文法树的递归性质,解释器在解释的时候会因为文法树复杂度变高使得递归层次加深,降低了解释效率,这是一个空间以及速度上的损失;
3、使用一个数组用到的,除了一些数组的属性以外,需要的内存分配点只是一个内存首地址,之后的是分配好的连续内存数据;而 4800 个实例变量,由于是虚表管理,所以被分配在不同的地方,需要 4800 个分配点,直接后果就是增加了内存碎片,复杂化了内存分配,降低了 Cache 命中率,从而间接导致时间效率的损失
以上是运行时的理论分析,可能 4800 在现在的硬件条件下还真看不出来什么,你不妨尝试下比较 48万、480万数据量的两者的区别
从设计角度来讲,4800 个实例变量既然能被整合到数组中,那么显式地定义每一个实例变量就是代码冗余的一种表现,不符合 DRY 原则,不方便浏览、整体修改,且在每次打开、关闭编辑器(会进行 scripts.rxdata 的读写)时候都会增加硬盘负荷,产生不必要的等待时间 |
评分
-
查看全部评分
|