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

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: 熊猫
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

小小的百鬼夜行<

梦石
0
星屑
54
在线时间
579 小时
注册时间
2010-7-29
帖子
2682

贵宾

11
发表于 2011-12-3 14:23:55 | 只看该作者
XP :17.405
VX :46.437
外带一提,XP不用10S直接被分

点评

=。=,这是什么啊,这么长时间……  发表于 2011-12-4 22:03

评分

参与人数 1星屑 +20 收起 理由
熊猫 + 20 感谢参与测试

查看全部评分

某只PHP/HTML小白鼠→退屈の间


Cause I knew you were trouble when you walked in
So shame is on me now
I flow me to place i ve never been
till you put me down oh
Now Im lying on the cold hard ground
回复

使用道具 举报

Lv1.梦旅人

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

开拓者

12
 楼主| 发表于 2011-12-4 22:13:52 | 只看该作者
第七水螰 发表于 2011-12-3 13:43
Ruby 1.9 加入了 Enumerator(枚舉器)的功能,默認情況下調用 #each 會在每次迭代過程中也同時進行枚舉器 ...
VX 和 XP 用的 Ruby 版本是相同的,都是 1.8.1。VX Ace 升級到了 1.9.2

嗯……VX没有额外的压力还处理得那么慢,果然没有优势。应该很快会被Ace取代吧。


其实,既然是说道了.NET我就多说一句。
.NET应该是对代码有优化的,微软这方面做得比较到位,否则执行10000000次字符处理根本不能是0.04s。

感谢这位仁兄回答,我的问题得到了解决并且学到了很多。

点评

300M内存,1.7GHZ CUP你伤的起吗。不过RUBY的速度[貌似][本来]就比[那种语言]要慢吧- -  发表于 2011-12-5 19:28
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
163 小时
注册时间
2011-11-12
帖子
56
13
发表于 2011-12-5 01:46:47 | 只看该作者
熊猫 发表于 2011-12-4 22:13
嗯……VX没有额外的压力还处理得那么慢,果然没有优势。应该很快会被Ace取代吧。

VX 是怎麼回事還沒想明白。

虛擬機的工作之一就是提供(編譯時、運行時的)代碼優化,這一點無論是 CLR 還是 YARV 都一樣,只是限於語言動態的天性,能達到的優化程度不同而已。就比如這段代碼,如果放到一個不是特別動態的語言中,由於用到的字符串都是常量,編譯器在編譯時就能靜態決定最終三個引用的值,在编译时就可以把有循環優化成沒有循環。然而在 Ruby 中,用戶可以利用猴子補丁隨時重定義 Range#each 這樣的方法,那麼看似是基本語言結構的 for 循環也可以在每次迭代時做一些用戶自定義的事情了,如此一來編譯器就不能確定是否可以移除循環 [1]。這些動態的信息很難被編譯器用靜態的方式分析,所以現在的動態語言虛擬機主要是靠 JIT。主樓這段 Ruby 代碼其實也沒多少「字符串處理」,整個程序的生命週期內做的就三件事:不斷的通過 "..." 字面值形式生成新的字符串對象(這是給 Ruby 堆施加壓力),不斷的把對象賦給某些局部引用變量(這是給虛擬機的內核以及棧施加壓力,但相比於其他開銷來說已是很小),回收失去引用的字符串对象(這是給 Ruby 的 GC 施加壓力)。在 .NET 中如果想測試類似的東西,那就也得讓每次迭代都生成新的對象才行,否則的話使用的字符串就有可能被字符串常量池給緩存了(也就是 string interning)。比如在 C# 中:

  1.             string s1 = "test";
  2.             string s2 = "test";
  3.             string s3 = new StringBuilder("test").ToString();
  4.             Console.WriteLine((Object)s1 == (Object)s2);        // True
  5.             Console.WriteLine((Object)s2 == (Object)s3);        // False
复制代码
可見每當使用字符串字面值時都動用了字串池進行緩存,所以在循環中賦值的時候用 StringBuilder 和字符串常量的開銷是有很大差別的。

[1] 比如,如果重定義 Range#each 為每次迭代輸出一個 1,那麼無論在任何場合下用 for i in range 都會在 for 循環原本執行的內容之餘輸出 range 長度那麼多個 1,而如果把循環移除後這個行為就被抹殺了。
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-7 18:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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