查看: 2423|回复: 8

[已经解决] 关于数组效率的问题

[复制链接]
梦石
0
星屑
59
在线时间
84 小时
注册时间
2008-4-19
回帖
403
发表于 2010-8-8 12:46:27 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
一个4800元素的实例变量数组和4800个实例变量(数字)同样刷新,哪个快一些- -
梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
回帖
1912
发表于 2010-8-8 15:36:02 | 显示全部楼层
本帖最后由 紫苏 于 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-22 00:46
你应该直接和他说,用Table吧= =||  发表于 2010-8-21 18:58
=。=RUBY的数组应该不是连续的吧。?。。。  发表于 2010-8-21 17:46

评分

参与人数 2星屑 +900 收起 理由
叶子 + 500
六祈 + 400 膜拜紫苏大人

查看全部评分

回复

使用道具 举报

梦石
1
星屑
916
在线时间
101 小时
注册时间
2006-3-27
回帖
1019
发表于 2010-8-8 15:46:58 | 显示全部楼层
膜拜一下LS,理解不能
回复

使用道具 举报

无节操

梦石
0
星屑
608
在线时间
795 小时
注册时间
2009-2-6
回帖
3910

开拓者贵宾

发表于 2010-8-8 16:29:57 | 显示全部楼层
膜拜紫苏殿...受教啊受教
Brandnew day, Brandnew Life
                             规 实在  中
暂为素材区版主,版其  琢磨
应援一下~
RPG制作大师授权素材推广计划
回复

使用道具 举报

尽头

梦石
0
星屑
119
在线时间
278 小时
注册时间
2010-6-20
回帖
1204
发表于 2010-8-8 16:34:26 | 显示全部楼层
写一个
for  i in 0..1542783
end
我就会卡一两帧。
回复

使用道具 举报

梦石
0
星屑
59
在线时间
84 小时
注册时间
2008-4-19
回帖
403
 楼主| 发表于 2010-8-21 17:39:31 | 显示全部楼层
谢紫苏- -
回复

使用道具 举报

梦石
0
星屑
59
在线时间
84 小时
注册时间
2008-4-19
回帖
403
 楼主| 发表于 2010-8-21 17:41:24 | 显示全部楼层
回复 紫苏 的帖子

看来我的计划要抽了T T
   

点评

- -抽了,连贴了  发表于 2010-8-21 17:42
回复

使用道具 举报

梦石
0
星屑
65
在线时间
400 小时
注册时间
2005-10-24
回帖
579
发表于 2010-8-21 19:35:28 | 显示全部楼层
回复 紫苏 的帖子

神思  发表于 1 小时前
=。=RUBY的数组应该不是连续的吧。?。。。
貌似应该是连续的
#define ALLOC_N(type,n) (type*)xmalloc(sizeof(type)*(n))
   
回复

使用道具 举报

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
回帖
1912
发表于 2010-8-22 00:41:38 | 显示全部楼层
数组的一个特性是能在常量时间内随机访问,动态的数组长度的变化通常也是通过 realloc 让长度乘以二或除以二来进行的,所以随机访问仍然是数组最快,但插入和删除则比不上链式结构(树、链表)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部