インスタンス変数
Xtalの仮想マシンの内部実装では、インスタンス変数へのアクセスは名前(文字列)ではなく、番号(整数)でアクセスする実装です。
Vec: class{ _x; // 0番目 _y; // 1番目 _z; // 2番目 _w; // 3番目 initialize: method(){ _x = 0; // 0番目のインスタンス変数に0を代入 _w = 0; // 3番目のインスタンス変数に0を代入 } }
Ruby、Pythonなどはインスタンス変数を名前でアクセスします。
名前でアクセスする実装は、動的にインスタンス変数を追加できるという利点があります。
一方番号でアクセスする実装は
という利点があります。
実際にインスタンス変数のアクセスのベンチマークをとってみました。
次のソースです。
Foo: class{ _inst1: 0; _inst2: 0; _inst3: 0; _inst4: 0; bar: method(){ for(i: 0; i<10000000; ++i){ _inst1 += 1; _inst2 += 2; _inst3 += 3; _inst4 += 4; } return _inst1; } } Foo().bar.p;
class Foo def bar @inst1 = 0 @inst2 = 0 @inst3 = 0 @inst4 = 0 i = 0 while i<10000000 @inst1 += 1 @inst2 += 2 @inst3 += 3 @inst4 += 4 i += 1 end return @inst1 end end puts Foo.new.bar
class Foo: def bar(self): self.inst1 = 0 self.inst2 = 0 self.inst3 = 0 self.inst4 = 0 i = 0 while i<10000000: self.inst1 += 1 self.inst2 += 2 self.inst3 += 3 self.inst4 += 4 i += 1 return self.inst1 print Foo().bar()
結果
- Xtal : 6.805秒
- Python (Python 2.5) : 8.457秒
- Ruby (ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-mswin32]): 16.751秒
このとおり、Xtalが一番速いという結果となりました。