设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2030|回复: 8
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
49
在线时间
83 小时
注册时间
2008-4-19
帖子
420
跳转到指定楼层
1
发表于 2010-8-8 12:46:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
一个4800元素的实例变量数组和4800个实例变量(数字)同样刷新,哪个快一些- -

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
2
发表于 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 膜拜紫苏大人

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
1
星屑
916
在线时间
101 小时
注册时间
2006-3-27
帖子
1081
3
发表于 2010-8-8 15:46:58 | 只看该作者
膜拜一下LS,理解不能
回复 支持 反对

使用道具 举报

Lv2.观梦者

无节操

梦石
0
星屑
607
在线时间
795 小时
注册时间
2009-2-6
帖子
3939

开拓者贵宾

4
发表于 2010-8-8 16:29:57 | 只看该作者
膜拜紫苏殿...受教啊受教
Brandnew day, Brandnew Life
                              实在  中
暂为素材区版主,版其  琢磨
应援一下~
RPG制作大师授权素材推广计划
回复 支持 反对

使用道具 举报

Lv1.梦旅人

尽头

梦石
0
星屑
119
在线时间
278 小时
注册时间
2010-6-20
帖子
1280
5
发表于 2010-8-8 16:34:26 | 只看该作者
写一个
for  i in 0..1542783
end
我就会卡一两帧。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
49
在线时间
83 小时
注册时间
2008-4-19
帖子
420
6
 楼主| 发表于 2010-8-21 17:39:31 | 只看该作者
谢紫苏- -
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
49
在线时间
83 小时
注册时间
2008-4-19
帖子
420
7
 楼主| 发表于 2010-8-21 17:41:24 | 只看该作者
回复 紫苏 的帖子

看来我的计划要抽了T T
   

点评

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
400 小时
注册时间
2005-10-24
帖子
634
8
发表于 2010-8-21 19:35:28 | 只看该作者
回复 紫苏 的帖子

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

使用道具 举报

Lv1.梦旅人

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

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-2-20 14:34

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表