* バイトコードと最適化 [#t4292d88] 生成されるバイトコードの比較。 #contents ** 組み込み型 vs 組み込み型のラッパークラス [#j2458c83] uintとuintをラッパーしたMyUIntクラスの比較。 やはり,組み込み型のほうが圧倒的に軽い。 #code(c,){{ class MyUInt { MyUInt( const uint& in aVal ) { this.mVal = aVal; } uint mVal; }; void cla() { MyUInt i(0); i.mVal += 1; } //----------------------------------------------------------- Temps: 2, 3 0 0 * PUSH 3 - 12,5 - 1 3 * SUSPEND 2 3 * VAR v1 3 4 * SetV4 v2, 0x0 (i:0, f:0) 5 4 * VAR v2 6 5 * GETREF 0 7 5 * GETREF 1 8 5 * ALLOC 0xa8cebf8, 66 - 13,5 - 11 3 * SUSPEND 12 3 * PSF v1 13 4 * CHKREF 14 4 * RDS4 15 4 * ADDSi 16 17 4 * PopRPtr 18 3 * RDR4 v2 19 3 * ADDIi v2, v2, 1 22 3 * WRTV4 v2 - 14,2 - 23 3 * SUSPEND 24 3 * PSF v1 25 4 * FREE 0xa8cebf8 27 3 * 0: 27 0 * RET 0 }} #code(c,){{ void sca() { uint i = 0; i += 1; } //----------------------------------------------------------- Temps: 2 0 0 * PUSH 2 - 18,5 - 1 2 * SUSPEND 2 2 * SetV4 v1, 0x0 (i:0, f:0) - 19,5 - 4 2 * SUSPEND 5 2 * ADDIi v1, v1, 1 - 20,2 - 8 2 * SUSPEND 9 2 * 0: 9 0 * RET 0 }} ** 非メンバ関数コール vs メンバ関数コール [#d676c000] 非メンバ関数とメンバ関数をコールしたときの比較。 メンバ関数コールの場合,Reference確認をするために,2命令追加されるらしい。 #code(c,){{ class Class { void classFunc() { } }; void func() { } void main() { Class obj; obj.classFunc(); func(); } //----------------------------------------------------------- Temps: (main関数) 0 0 * PUSH 1 - 72,5 - 1 1 * SUSPEND 2 1 * PSF v1 3 2 * ALLOC 0xa8c3958, 60 - 74,5 - 6 1 * SUSPEND 7 1 * PSF v1 8 2 * CHKREF 9 2 * RDS4 10 2 * CALL 58 (void Class::classFunc()) - 76,5 - 12 1 * SUSPEND 13 1 * CALL 63 (void func()) - 78,2 - 15 1 * SUSPEND 16 1 * PSF v1 17 2 * FREE 0xa8c3958 19 1 * 0: 19 0 * RET 0 }} ** constメンバ関数コール vs 非constメンバ関数コール [#o338865f] どちらも変わらないようです。 #code(c,){{ class Class { void classFunc() { } void classConstFunc()const { } }; void main() { Class obj; obj.classFunc(); obj.classConstFunc(); } //----------------------------------------------------------- Temps: (main関数) 0 0 * PUSH 1 - 72,5 - 1 1 * SUSPEND 2 1 * PSF v1 3 2 * ALLOC 0xa8c7c48, 60 - 74,5 - 6 1 * SUSPEND 7 1 * PSF v1 8 2 * CHKREF 9 2 * RDS4 10 2 * CALL 58 (void Class::classFunc()) - 76,5 - 12 1 * SUSPEND 13 1 * PSF v1 14 2 * CHKREF 15 2 * RDS4 16 2 * CALL 59 (void Class::classConstFunc()) - 77,2 - 18 1 * SUSPEND 19 1 * PSF v1 20 2 * FREE 0xa8c7c48 22 1 * 0: 22 0 * RET 0 }} }} ** constメンバ関数 vs 非constメンバ関数 [#rcac447c] どちらも一緒。 #code(c,){{ class Class { void classFunc() { } void classConstFunc()const { } }; //----------------------------------------------------------- Class::classFunc() : 0 0 * PshV4 v0 1 1 * CALLSYS 16 (void ?::?()) - 44,6 - 3 0 * SUSPEND 4 0 * 0: 4 0 * PSF v0 5 1 * FREE 0xa8c3958 7 0 * RET 1 //----------------------------------------------------------- Class::classConstFunc() : 0 0 * PshV4 v0 1 1 * CALLSYS 16 (void ?::?()) - 47,6 - 3 0 * SUSPEND 4 0 * 0: 4 0 * PSF v0 5 1 * FREE 0xa8c3958 7 0 * RET 1 }} ** 引数にオブジェクト参照関数 vs 引数のconstオブジェクト参照関数 [#a4d88ce6] どちらも一緒。 #code(c,){{ void funcRef( Class& obj ) { } void funcConstRef( const Class& obj ) { } //----------------------------------------------------------- void funcRef( Class& obj ): - 71,2 - 0 0 * SUSPEND 1 0 * 0: 1 0 * RET 1 //----------------------------------------------------------- void funcConstRef( const Class& obj ): - 75,2 - 0 0 * SUSPEND 1 0 * 0: 1 0 * RET 1 }} #code(c,){{ void funcRef( Class& obj ) { obj.classConstFunc(); } void funcConstRef( const Class& obj ) { obj.classConstFunc(); } //----------------------------------------------------------- void funcRef( Class& obj ) : - 71,5 - 0 0 * SUSPEND 1 0 * PSF v0 2 1 * CHKREF 3 1 * RDS4 4 1 * CALL 59 (void Class::classConstFunc()) - 72,2 - 6 0 * SUSPEND 7 0 * 0: 7 0 * RET 1 //----------------------------------------------------------- void funcConstRef( const Class& obj ) : - 76,5 - 0 0 * SUSPEND 1 0 * PSF v0 2 1 * CHKREF 3 1 * RDS4 4 1 * CALL 59 (void Class::classConstFunc()) - 77,2 - 6 0 * SUSPEND 7 0 * 0: 7 0 * RET 1 }} #code(c,){{ void funcRef( Class& obj ) { obj.classFunc(); } //----------------------------------------------------------- void funcRef( Class& obj ) : - 71,5 - 0 0 * SUSPEND 1 0 * PSF v0 2 1 * CHKREF 3 1 * RDS4 4 1 * CALL 58 (void Class::classFunc()) - 72,2 - 6 0 * SUSPEND 7 0 * 0: 7 0 * RET 1 }} ** 引数にオブジェクト参照をとる関数コール vs 引数にconstオブジェクト参照をとる関数コール [#xf6efc34] やっぱり一緒。ついでにハンドルも比較,それは増えるらしい。 参照カウントを増やすから当たり前か。 #code(c,){{ void funcRef( Class& obj ) { } void funcConstRef( const Class& obj ) { } void funcHandle( Class@ obj ) { } void main() { Class obj; funcRef( obj ); funcConstRef( obj ); funcHandle( @obj ); } //----------------------------------------------------------- Temps: 2 0 0 * PUSH 2 - 84,5 - 1 2 * SUSPEND 2 2 * PSF v1 3 3 * ALLOC 0xa8c7768, 60 - 86,5 - 6 2 * SUSPEND 7 2 * PSF v1 8 3 * CHKREF 9 3 * RDS4 10 3 * CALL 65 (void funcRef(Class&inout)) - 88,5 - 12 2 * SUSPEND 13 2 * PSF v1 14 3 * CHKREF 15 3 * RDS4 16 3 * CALL 66 (void funcConstRef(const Class&inout)) - 90,5 - 18 2 * SUSPEND 19 2 * PSF v1 20 3 * CHKREF 21 3 * RDS4 22 3 * PSF v2 23 4 * REFCPY 0xa8c7768 25 3 * POP 1 26 2 * VAR v2 27 3 * GETOBJ 0 28 3 * CALL 67 (void funcHandle(Class@)) - 92,2 - 30 2 * SUSPEND 31 2 * PSF v1 32 3 * FREE 0xa8c7768 34 2 * 0: 34 0 * RET 0 }} ** 引数に参照オブジェクトをとる関数 vs 引数にハンドルをとる関数 [#p3aa511e] ハンドルを使うと命令が増えるらしい。 ハンドルを使うと命令が増えるらしい。参照カウント増やすからね。 #code(c,){{ void funcRef( Class& obj ) { } void funcHandle( Class@ obj ) { } //----------------------------------------------------------- void funcRef( Class& obj ) : - 71,2 - 0 0 * SUSPEND 1 0 * 0: 1 0 * RET 1 //----------------------------------------------------------- void funcHandle( Class@ obj ) : - 75,2 - 0 0 * SUSPEND 1 0 * 0: 1 0 * PSF v0 2 1 * FREE 0xa8c76a0 4 0 * RET 1 }} |