インスタンス変数

Xtal仮想マシンの内部実装では、インスタンス変数へのアクセスは名前(文字列)ではなく、番号(整数)でアクセスする実装です。

Vec: class{
  _x; // 0番目
  _y; // 1番目
  _z; // 2番目
  _w; // 3番目

  initialize: method(){
    _x = 0; // 0番目のインスタンス変数に0を代入
   _w = 0; // 3番目のインスタンス変数に0を代入
  }
}

RubyPythonなどはインスタンス変数を名前でアクセスします。

名前でアクセスする実装は、動的にインスタンス変数を追加できるという利点があります。

一方番号でアクセスする実装は

  • アクセスが早い
  • メモリ使用量が少なくてすむ (HashMapじゃなくて、Arrayで保持できる)
  • インスタンス変数名をミスタイプした場合、コンパイルエラーでわかる

という利点があります。


実際にインスタンス変数のアクセスのベンチマークをとってみました。
次のソースです。

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が一番速いという結果となりました。