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

Project1

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

[已经解决] 关于RPG Maker全系列Ruby脚本执行效率求解

[复制链接]

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

跳转到指定楼层
1
发表于 2011-12-2 20:40:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 熊猫 于 2011-12-2 20:40 编辑

据说VX使用了更新的Ruby版本,比XP的执行效率好得多。可是……
近来做了一个脚本性能的小测试,只针对一个方面。
首先代码是:
  1. a = Time.now
  2. e = ""
  3. f = ""
  4. for i in 0...10000000
  5. e = "aaa"
  6. f = e
  7. e = "bbb"
  8. end
  9. b = Time.now

  10. p b - a
复制代码
参赛选手:
  1. .NET 4.0
  2. RPG Maker XP
  3. RPG Maker VX
  4. RPG Maker VX Ace
复制代码
成绩嘛:
  1. .NET
  2. 0.04s
  3. Ruby:
  4. XP 3.8s
  5. VX 6.5s
  6. ACE 9.5s
复制代码
咱CPU渣,跑得慢了点……不过从时间对比上来看,结论很明显啊。
单纯字符操作一千万+1次循环来看,Ruby完败.NET,这个倒不是出乎意料。
我在意的是……XP VX VXACE一代比一代慢,而且灰常明显……

不管RGSS引擎,就Ruby来讲……版本肯定是新了的,为什么慢了呢?
VX比起XP新的Ruby脚本解释引擎到底优秀在哪里?

点评

Ace 则跳到了 1.9.2 。  发表于 2012-1-7 19:24
VX 从来都没有更新过 Ruby 版本。  发表于 2012-1-7 19:24
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3263
在线时间
3616 小时
注册时间
2006-9-6
帖子
37399

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

2
发表于 2011-12-2 20:48:29 | 只看该作者
VXms没有使用新版本的ruby只是改了rgss……

点评

ace确实是新版本无误(  发表于 2011-12-2 21:24
ACE好像是有新版本的  发表于 2011-12-2 21:14
0.0!新版本真的是谣言吗?这么说脚本效率不会比RMXP高?  发表于 2011-12-2 21:04

评分

参与人数 1星屑 +30 收起 理由
熊猫 + 30 我终于知道了,嗯……

查看全部评分

回复

使用道具 举报

Lv2.观梦者

(?????)

梦石
0
星屑
700
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

3
发表于 2011-12-2 22:16:38 | 只看该作者
本帖最后由 各种压力的猫君 于 2011-12-2 22:35 编辑

XP 1.02(事件):2.364
XP 1.02(脚本):1.884

XP 1.03(事件):2.343
XP 1.03(脚本):1.561

VX 1.02(事件):3.867
VX 1.02(脚本):3.921

VX Ace 1.00 trail(事件):3.982
VX Ace 1.00 trail(脚本):2.538

.Net 未作测试

测试平台:
i7 2600k
Windows 7 x64

以上测试结果均测试5次去掉最高、最低值后取算术平均值。
“事件”指事件指令中的脚本输入测试代码,
“脚本”指在脚本编辑器最顶端添加TEST脚本输入测试代码。

VX Ace 脚本测试结果略优于 VX,但是VX和VX Ace都完败给XP……这是为何?!

拿RGSS和.Net比效率的话……不具可比性啊……
Ruby是靠虚拟机运行的,.Net最后总说还有个编译器不是。

评分

参与人数 1星屑 +250 收起 理由
熊猫 + 250 感谢测试并积极回答

查看全部评分

回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1045
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

4
发表于 2011-12-2 22:32:58 | 只看该作者
你还真不了解Ruby啊……

评分

参与人数 1星屑 +10 收起 理由
熊猫 + 10 召唤DK回来看答案……

查看全部评分


See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复

使用道具 举报

Lv1.梦旅人

尽头

梦石
0
星屑
119
在线时间
278 小时
注册时间
2010-6-20
帖子
1280
5
发表于 2011-12-2 22:47:07 | 只看该作者
我猜是ruby先是给C编译再给机器运行。所以ruby的速度是慢不奇怪。

点评

貌似Ruby是纯解释无编译。  发表于 2011-12-3 09:44
俨然不是= =  发表于 2011-12-2 23:43

评分

参与人数 1星屑 +20 收起 理由
熊猫 + 20 谢谢参与讨论

查看全部评分

回复

使用道具 举报

Lv2.观梦者

(?????)

梦石
0
星屑
700
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

6
发表于 2011-12-2 22:52:36 | 只看该作者
本帖最后由 各种压力的猫君 于 2011-12-2 22:53 编辑



平均值是去掉5次的最高值和最低值之后做算术平均得出的。
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

7
 楼主| 发表于 2011-12-2 23:38:47 | 只看该作者
各种压力的猫君 发表于 2011-12-2 22:52
平均值是去掉5次的最高值和最低值之后做算术平均得出的。

嗯,如果猫君在各个RM中测试的代码是一样的话,是不是可以得出这个结论:
单纯循环操作字符来看RMXP比较强。
近似总体的操作(猫君的线性插值测试,具体我也不知道是神马~)来看Ace倒是一匹黑马。
但是RMVX两项测试都处于最后。
所以RMVX脚本性能优于RMXP不成立。ACE仍有待考证。

点评

本来应该是一系列的浮点运算……但是考虑到效率问题我化作整数处理了。 基本上是2次浮点运算+像素数量×2次整数运算……相当吃时间的一个过程……   发表于 2011-12-2 23:42
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
732
在线时间
1270 小时
注册时间
2011-2-14
帖子
5589
8
发表于 2011-12-3 07:46:10 | 只看该作者
貌似只是位图的处理效率比较高

点评

表示去掉和位图有关的语句仅执行计算依旧是Ace快于VX。  发表于 2011-12-5 01:59

评分

参与人数 1星屑 +30 收起 理由
熊猫 + 30 谢谢参与讨论

查看全部评分

回复

使用道具 举报

Lv5.捕梦者 (版主)

梦石
28
星屑
10170
在线时间
4673 小时
注册时间
2011-8-22
帖子
1279

开拓者

9
发表于 2011-12-3 11:06:41 | 只看该作者
builder.c
"
do sth
"
貌似可以这样用0 0?

评分

参与人数 1星屑 +20 收起 理由
熊猫 + 20 谢谢参与讨论

查看全部评分

回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
163 小时
注册时间
2011-11-12
帖子
56
10
发表于 2011-12-3 13:43:45 | 只看该作者
Ruby 1.9 加入了 Enumerator(枚舉器)的功能,默認情況下調用 #each 會在每次迭代過程中也同時進行枚舉器的處理,這是 1.8 沒有的開銷。你把這個 for 循環換成 while 應該就能看到速度的提升了(這裡的 for 循環調用的是 Range#each)。當然,這段代碼最終也不會和 1.8 有太大差距,因為這段代碼測的只不過是 Ruby 的堆和 GC 性能罷了,而在這兩個方面 Ruby 1.9 並沒有多大改進。

有興趣的話可以看 1.9 源 range.c 中有關 Range#each 的部分:
  1. static VALUE
  2. range_each(VALUE range)
  3. {
  4.     VALUE beg, end;

  5.     RETURN_ENUMERATOR(range, 0, 0);

  6.     beg = RANGE_BEG(range);
  7.     end = RANGE_END(range);
  8.     ...
  9. }
复制代码
其中 RETURN_ENUMERATOR 就是額外的開銷。

VX比起XP新的Ruby脚本解释引擎到底优秀在哪里?

VX 和 XP 用的 Ruby 版本是相同的,都是 1.8.1。VX Ace 升級到了 1.9.2,這個可以在幫助菜單裏查到,或是自行在腳本中打印 RUBY_VERSION 這個常量的值。

@各种压力的猫君
Ruby是靠虚拟机运行的,.Net最后总说还有个编译器不是。

Ruby 1.9 之前的實現是純粹的抽象語法樹求值器,也就是純解釋性實現,直到 1.9 才有了虛擬機 YARV。.NET 在微軟平臺下的虛擬機是 CLR,但它和 YARV 面向的語言完全不同,YARV 主要是服務 Smalltalk 式(類 Smalltalk 面向對象模型)高度動態語言的,而 CLR 的模型更類似於 JVM。前者在執行效率上很難超過後者,但後者在動態性能上(如各種元編程能力)也別想超過前者。

评分

参与人数 5星屑 +306 收起 理由
DeathKing + 176 所以有些时候就是要找老板
⑨姐姐 + 10 谢谢前辈的说
R-零 + 20 凑不了整就……
各种压力的猫君 + 50 原来如此!受教了
熊猫 + 50 认可答案追加奖励

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-27 03:27

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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