菊池和彦の足跡の文字列比較のパフォーマンスを見て、VB.NETの文字列比較が具体的にどう処理されているのかが気になったのでちょっと調べてみました。
具体的には、Option Compare Binaryの場合と、Option Compare Textの場合で、生成するコードにどのような差があるのか、調べてみました。
Option Compare Textの場合は重い処理になるのはやむを得ないとしても、Option Compare Binaryは軽くても良いのではないか、と思ったのですが。
結果は以下のごとくしです。
両者の相違は、Microsoft.VisualBasic.CompilerServices.StringType::StrCmpを呼び出す引数の値が違うだけ。(相違点を強調で示してあります)
つまり、このメソッド自身の処理は、Option Compare Binaryの方が軽いとしても、呼び出しのオーバーヘッドは同じということになります。C#の==演算子で呼び出す文字列比較メソッドを使う場合よりも、引数が多く、内部で引数の判定も行う必要がある(と思う)ので、それだけ見ても同じ速さにならないのは当然と思われます。
というわけで、力尽きたので、検証はここまで (汗
文字列をバイナリ比較するテスト §
VB.NETソース §
Option Compare Binary
Public Class binaryClass1
Public Function test(ByVal a As String, ByVal b As String)
Return a = b
End Function
End Class
.NET Reflectorによる逆アセンブルリスト §
.method public instance object test(string a, string b) cil managed
{
// Code Size: 22 byte(s)
.maxstack 3
.locals (object V_0)
L_0000: nop
L_0001: ldarg.1
L_0002: ldarg.2
L_0003: ldc.i4.0
L_0004: call int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StringType::StrCmp(string, string, bool)
L_0009: ldc.i4.0
L_000a: ceq
L_000c: box bool
L_0011: stloc.0
L_0012: br.s L_0014
L_0014: ldloc.0
L_0015: ret
}
文字列をTEXT比較するテスト §
VB.NETソース §
Option Compare Text
Public Class textClass1
Public Function test(ByVal a As String, ByVal b As String)
Return a = b
End Function
End Class
.NET Reflectorによる逆アセンブルリスト §
.method public instance object test(string a, string b) cil managed
{
// Code Size: 22 byte(s)
.maxstack 3
.locals (object V_0)
L_0000: nop
L_0001: ldarg.1
L_0002: ldarg.2
L_0003: ldc.i4.1
L_0004: call int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StringType::StrCmp(string, string, bool)
L_0009: ldc.i4.0
L_000a: ceq
L_000c: box bool
L_0011: stloc.0
L_0012: br.s L_0014
L_0014: ldloc.0
L_0015: ret
}