[前][次][番号順一覧][スレッド一覧][生データ]

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  ]