yarv-dev:444
From: Hiroki Asakawa <ml asakawa.net>
Date: Sun, 6 Mar 2005 14:23:05 +0900
Subject: [yarv-dev:444] Re: Ruby.NET Compiler
淺川です。 > > 継承していたとしても、一番下のクラスからアクセスできるすべてのメソッド > > を2分検索しますので、検索するメソッド数が多くなるだけで、 > > 遅くはなりません。メソッド数によって、速度が大きく変わることは > > ないようです。 > > > ふと、swwitch 命令でしないのは何故だろうと思いました。 ILの switch はですね、0 からの連続した自然数でしか分岐できないのです。 この場合に switch で分岐させようとすると、穴ぼこだらけのかなり大きな テーブルになってしまうので止めました。 > なるほど、配列を作る方法を取ったんですね。私はそれが嫌だからなんとか > ならんかなぁ、と粘ってみたので、微妙に仕様を満たせていません。 いちいち配列を作るのもどうかなぁと思ったので、 いろいろ考えては見たのですが、うまく作れそうにないので妥協しています。 > なるほど、そういう意味だったんですね。ちなみに、スコープルールはどう > なりますか。トップレベルスコープも変わったり変わらなかったりですが。 > > ---------- > a.rb: > a = 1 > require 'b' > p a > ---------- > b.rb: > a = 2 > ---------- require 'b' の位置に b.rb の内容がペーストされますので この場合 2 が出力されます。スコープルールが違いますね。 > なるほど。ちなみに、一時的に利用するだけなら、要素数ごとに配列を用意 > しなくても、一個大きな配列があればいいんじゃないのでしょうか(型の制約 > とかあるのかな) 配列のサイズを見るだけで、要素数が分かるからという理由で 要素数ごとに配列を用意しています。 これだと、要素数を調べるのに一命令ですむのです。 でも言われてみれば、そんなにたいした意味はないですね。 > > よく分からないですけど、やたら早いですね。 > > 検証していないので理由が分かりません。 > > インライン化とかそういうことしてるんじゃないかしらん、とか思うので、 > コンパイルした結果を見せてもらえるといいと思うのですが、どうでしょうか。 長くなりますが、tarai メソッド部分のコンパイル結果を乗せます。 コード自体にたいして特徴はないと思います。 単純なメソッド呼び出しは Ruby.NET のほうが早いですし、 小さな同じような数しか出てこないので、Fixnum の生成 コストもかからないからではないかと思います。 JIT も強力ですし。 .method public virtual instance class [RubyLibrary]RubyLibrary.IObject tarai(class [RubyLibrary]RubyLibrary.IObject[] A_1, class [RubyLibrary]RubyLibrary.IObject A_2) cil managed { // コード サイズ 423 (0x1a7) .maxstack 27 .locals init ([0] class [RubyLibrary]RubyLibrary.IObject V_0, [1] class [RubyLibrary]RubyLibrary.IObject V_1, [2] class [RubyLibrary]RubyLibrary.IObject V_2, [3] class [RubyLibrary]RubyLibrary.IObject[] V_3, [4] class [RubyLibrary]RubyLibrary.IObject V_4, [5] class [RubyLibrary]RubyLibrary.IObject V_5, [6] class [RubyLibrary]RubyLibrary.IObject V_6) IL_0000: ldsfld class [RubyLibrary]RubyLibrary.Object [RubyLibrary]RubyLibrary.Object::nil_ IL_0005: dup IL_0006: stloc.0 IL_0007: dup IL_0008: stloc.1 IL_0009: dup IL_000a: stloc.2 IL_000b: pop IL_000c: ldarg.1 IL_000d: brfalse IL_0059 IL_0012: ldarg.1 IL_0013: ldlen IL_0014: ldc.i4 0x3 IL_0019: bgt.s IL_0024 IL_001b: ldarg.1 IL_001c: ldlen IL_001d: ldc.i4 0x3 IL_0022: bge.s IL_003b IL_0024: ldstr "in `tarai': wrong number of arguments({0} for 3)" IL_0029: ldarg.1 IL_002a: ldlen IL_002b: box [mscorlib]System.Int32 IL_0030: call string [mscorlib]System.String::Format(string, object) IL_0035: newobj instance void ArgumentError::.ctor(string) IL_003a: throw IL_003b: ldarg.1 IL_003c: ldc.i4 0x0 IL_0041: ldelem.ref IL_0042: dup IL_0043: stloc.0 IL_0044: pop IL_0045: ldarg.1 IL_0046: ldc.i4 0x1 IL_004b: ldelem.ref IL_004c: dup IL_004d: stloc.1 IL_004e: pop IL_004f: ldarg.1 IL_0050: ldc.i4 0x2 IL_0055: ldelem.ref IL_0056: dup IL_0057: stloc.2 IL_0058: pop IL_0059: ldsfld class [RubyLibrary]RubyLibrary.Object [RubyLibrary]RubyLibrary.Object::nil_ IL_005e: dup IL_005f: stloc.s V_4 IL_0061: stloc.s V_5 IL_0063: ldloc.0 IL_0064: ldloc.1 IL_0065: stloc.s V_6 IL_0067: ldsfld class [RubyLibrary]RubyLibrary.IObject[] [RubyLibrary]RubyLibrary.Object::args1_ IL_006c: dup IL_006d: ldc.i4.0 IL_006e: ldloc.s V_6 IL_0070: stelem.ref IL_0071: ldnull IL_0072: callvirt instance class [RubyLibrary]RubyLibrary.IObject [RubyLibrary]RubyLibrary.IObject::___op_LE(class [RubyLibrary]RubyLibrary.IObject[], class [RubyLibrary]RubyLibrary.IObject) IL_0077: dup IL_0078: ldsfld class [RubyLibrary]RubyLibrary.Object [RubyLibrary]RubyLibrary.Object::nil_ IL_007d: ceq IL_007f: brfalse.s IL_0087 IL_0081: pop IL_0082: br IL_0099 IL_0087: ldsfld class [RubyLibrary]RubyLibrary.Object [RubyLibrary]RubyLibrary.Object::false_ IL_008c: ceq IL_008e: brtrue IL_0099 IL_0093: ldloc.1 IL_0094: br IL_01a6 IL_0099: ldarg.0 IL_009a: ldc.i4 0x111 IL_009f: ldstr "tarai" IL_00a4: ldc.i4.1 IL_00a5: ldsfld class [RubyLibrary]RubyLibrary.IObject[] [RubyLibrary]RubyLibrary.Object::args3_ IL_00aa: dup IL_00ab: ldc.i4 0x0 IL_00b0: ldarg.0 IL_00b1: ldc.i4 0x111 IL_00b6: ldstr "tarai" IL_00bb: ldc.i4.1 IL_00bc: ldsfld class [RubyLibrary]RubyLibrary.IObject[] [RubyLibrary]RubyLibrary.Object::args3_ IL_00c1: dup IL_00c2: ldc.i4 0x0 IL_00c7: ldloc.0 IL_00c8: ldc.i4 0x1 IL_00cd: call class [RubyLibrary]RubyLibrary.Fixnum [RubyLibrary]RubyLibrary.Object::GetFixnum(int32) IL_00d2: stloc.s V_6 IL_00d4: ldsfld class [RubyLibrary]RubyLibrary.IObject[] [RubyLibrary]RubyLibrary.Object::args1_ IL_00d9: dup IL_00da: ldc.i4.0 IL_00db: ldloc.s V_6 IL_00dd: stelem.ref IL_00de: ldnull IL_00df: callvirt instance class [RubyLibrary]RubyLibrary.IObject [RubyLibrary]RubyLibrary.IObject::___op_Sub(class [RubyLibrary]RubyLibrary.IObject[], class [RubyLibrary]RubyLibrary.IObject) IL_00e4: stelem.ref IL_00e5: dup IL_00e6: ldc.i4 0x1 IL_00eb: ldloc.1 IL_00ec: stelem.ref IL_00ed: dup IL_00ee: ldc.i4 0x2 IL_00f3: ldloc.2 IL_00f4: stelem.ref IL_00f5: ldnull IL_00f6: callvirt instance class [RubyLibrary]RubyLibrary.IObject [RubyLibrary]RubyLibrary.IObject::___send(int32, string, int32, class [RubyLibrary]RubyLibrary.IObject[], class [RubyLibrary]RubyLibrary.IObject) IL_00fb: stelem.ref IL_00fc: dup IL_00fd: ldc.i4 0x1 IL_0102: ldarg.0 IL_0103: ldc.i4 0x111 IL_0108: ldstr "tarai" IL_010d: ldc.i4.1 IL_010e: ldsfld class [RubyLibrary]RubyLibrary.IObject[] [RubyLibrary]RubyLibrary.Object::args3_ IL_0113: dup IL_0114: ldc.i4 0x0 IL_0119: ldloc.1 IL_011a: ldc.i4 0x1 IL_011f: call class [RubyLibrary]RubyLibrary.Fixnum [RubyLibrary]RubyLibrary.Object::GetFixnum(int32) IL_0124: stloc.s V_6 IL_0126: ldsfld class [RubyLibrary]RubyLibrary.IObject[] [RubyLibrary]RubyLibrary.Object::args1_ IL_012b: dup IL_012c: ldc.i4.0 IL_012d: ldloc.s V_6 IL_012f: stelem.ref IL_0130: ldnull IL_0131: callvirt instance class [RubyLibrary]RubyLibrary.IObject [RubyLibrary]RubyLibrary.IObject::___op_Sub(class [RubyLibrary]RubyLibrary.IObject[], class [RubyLibrary]RubyLibrary.IObject) IL_0136: stelem.ref IL_0137: dup IL_0138: ldc.i4 0x1 IL_013d: ldloc.2 IL_013e: stelem.ref IL_013f: dup IL_0140: ldc.i4 0x2 IL_0145: ldloc.0 IL_0146: stelem.ref IL_0147: ldnull IL_0148: callvirt instance class [RubyLibrary]RubyLibrary.IObject [RubyLibrary]RubyLibrary.IObject::___send(int32, string, int32, class [RubyLibrary]RubyLibrary.IObject[], class [RubyLibrary]RubyLibrary.IObject) IL_014d: stelem.ref IL_014e: dup IL_014f: ldc.i4 0x2 IL_0154: ldarg.0 IL_0155: ldc.i4 0x111 IL_015a: ldstr "tarai" IL_015f: ldc.i4.1 IL_0160: ldsfld class [RubyLibrary]RubyLibrary.IObject[] [RubyLibrary]RubyLibrary.Object::args3_ IL_0165: dup IL_0166: ldc.i4 0x0 IL_016b: ldloc.2 IL_016c: ldc.i4 0x1 IL_0171: call class [RubyLibrary]RubyLibrary.Fixnum [RubyLibrary]RubyLibrary.Object::GetFixnum(int32) IL_0176: stloc.s V_6 IL_0178: ldsfld class [RubyLibrary]RubyLibrary.IObject[] [RubyLibrary]RubyLibrary.Object::args1_ IL_017d: dup IL_017e: ldc.i4.0 IL_017f: ldloc.s V_6 IL_0181: stelem.ref IL_0182: ldnull IL_0183: callvirt instance class [RubyLibrary]RubyLibrary.IObject [RubyLibrary]RubyLibrary.IObject::___op_Sub(class [RubyLibrary]RubyLibrary.IObject[], class [RubyLibrary]RubyLibrary.IObject) IL_0188: stelem.ref IL_0189: dup IL_018a: ldc.i4 0x1 IL_018f: ldloc.0 IL_0190: stelem.ref IL_0191: dup IL_0192: ldc.i4 0x2 IL_0197: ldloc.1 IL_0198: stelem.ref IL_0199: ldnull IL_019a: callvirt instance class [RubyLibrary]RubyLibrary.IObject [RubyLibrary]RubyLibrary.IObject::___send(int32, string, int32, class [RubyLibrary]RubyLibrary.IObject[], class [RubyLibrary]RubyLibrary.IObject) IL_019f: stelem.ref IL_01a0: ldnull IL_01a1: callvirt instance class [RubyLibrary]RubyLibrary.IObject [RubyLibrary]RubyLibrary.IObject::___send(int32, string, int32, class [RubyLibrary]RubyLibrary.IObject[], class [RubyLibrary]RubyLibrary.IObject) IL_01a6: ret } // end of method main::tarai w Σ+ )_ Hiroki Asakawa 〜〜( __/〜 mailto:hiroki asakawa.net 〜〜〜〜〜 http://www.asakawa.net -- ML: yarv-dev quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
427 2005-02-23 15:12 [ko1 atdot.net ] Ruby.NET Compiler 428 2005-02-24 00:41 ┗[ko1 atdot.net ] 429 2005-02-26 16:35 ┗[ml asakawa.net ] 430 2005-02-27 16:13 ┗[ml asakawa.net ] 431 2005-02-28 23:43 ┗[ml asakawa.net ] 436 2005-03-05 19:36 ┣[ko1 atdot.net ] 438 2005-03-05 21:18 ┃┣[ml asakawa.net ] 440 2005-03-06 01:03 ┃┃┣[ko1 atdot.net ] -> 444 2005-03-06 14:23 ┃┃┃┗[ml asakawa.net ] 445 2005-03-06 16:45 ┃┃┃ ┣[ko1 atdot.net ] 452 2005-03-06 22:26 ┃┃┃ ┗[shudo computer.org ] 454 2005-03-06 23:28 ┃┃┃ ┗[ko1 atdot.net ] 447 2005-03-06 17:33 ┃┃┗[zn mbf.nifty.com ] 439 2005-03-06 00:27 ┃┗[matz ruby-lang.org ] 441 2005-03-06 01:11 ┃ ┗[ko1 atdot.net ] 453 2005-03-06 22:41 ┗[shudo computer.org ]