Project1

标题: 关于数组效率的问题 [打印本页]

作者: 冰蓝的马甲    时间: 2010-8-8 12:46
标题: 关于数组效率的问题
一个4800元素的实例变量数组和4800个实例变量(数字)同样刷新,哪个快一些- -
作者: 紫苏    时间: 2010-8-8 15:36
本帖最后由 紫苏 于 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 的读写)时候都会增加硬盘负荷,产生不必要的等待时间
作者: 幻の飞鱼    时间: 2010-8-8 15:46
膜拜一下LS,理解不能
作者: moy    时间: 2010-8-8 16:29
膜拜紫苏殿...受教啊受教
作者: bbaugle    时间: 2010-8-8 16:34
写一个
for  i in 0..1542783
end
我就会卡一两帧。
作者: 冰蓝的马甲    时间: 2010-8-21 17:39
谢紫苏- -
作者: 冰蓝的马甲    时间: 2010-8-21 17:41
回复 紫苏 的帖子

看来我的计划要抽了T T
   
作者: 叶子    时间: 2010-8-21 19:35
回复 紫苏 的帖子

神思  发表于 1 小时前
=。=RUBY的数组应该不是连续的吧。?。。。
貌似应该是连续的
#define ALLOC_N(type,n) (type*)xmalloc(sizeof(type)*(n))
   
作者: 紫苏    时间: 2010-8-22 00:41
数组的一个特性是能在常量时间内随机访问,动态的数组长度的变化通常也是通过 realloc 让长度乘以二或除以二来进行的,所以随机访问仍然是数组最快,但插入和删除则比不上链式结构(树、链表)




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1