http://blogs.wankuma.com/andochin/archive/2009/04/27/172138.aspx
以下のことは思考実験くらいに思って下さいね。実際の業務で使うべきかどうかとはまた別の話。
static void null_check()
{
object p = func1();
if (p != null)
{
p = func2(p);
if (p != null)
{
p = func3(p);
}
}
}
static void null_check()
{
object p = func1();
00000000 sub rsp,48h
00000004 mov qword ptr [rsp+20h],0
0000000d mov rax,7FF001E1F28h
00000017 mov eax,dword ptr [rax]
00000019 test eax,eax
0000001b je 0000000000000022
0000001d call FFFFFFFFF2DAEF00
00000022 call FFFFFFFFFFEC94F0
00000027 mov qword ptr [rsp+28h],rax
0000002c mov rax,qword ptr [rsp+28h]
00000031 mov qword ptr [rsp+20h],rax
if (p != null)
00000036 cmp qword ptr [rsp+20h],0
0000003c je 0000000000000078
{
p = func2(p);
0000003e mov rcx,qword ptr [rsp+20h]
00000043 call FFFFFFFFFFEC94E8
00000048 mov qword ptr [rsp+30h],rax
0000004d mov rax,qword ptr [rsp+30h]
00000052 mov qword ptr [rsp+20h],rax
if (p != null)
00000057 cmp qword ptr [rsp+20h],0
0000005d je 0000000000000078
{
p = func3(p);
0000005f mov rcx,qword ptr [rsp+20h]
00000064 call FFFFFFFFFFEC94E0
00000069 mov qword ptr [rsp+38h],rax
0000006e mov rax,qword ptr [rsp+38h]
00000073 mov qword ptr [rsp+20h],rax
}
}
}
private static void null_check2()
{
try
{
object p = func1();
p = func2(p);
p = func3(p);
}
catch
{
throw new Exception();
}
}
private static void null_check2()
{
try
{
object p = func1();
00000000 push rbp
00000001 sub rsp,60h
00000005 lea rbp,[rsp+20h]
0000000a mov qword ptr [rbp],rsp
0000000e mov qword ptr [rbp+8],0
00000016 mov rax,7FF001E1F28h
00000020 mov eax,dword ptr [rax]
00000022 test eax,eax
00000024 je 000000000000002B
00000026 call FFFFFFFFF2DAF140
0000002b nop
0000002c call FFFFFFFFFFEC9730
00000031 mov qword ptr [rbp+10h],rax
00000035 mov rax,qword ptr [rbp+10h]
00000039 mov qword ptr [rbp+8],rax
p = func2(p);
0000003d mov rcx,qword ptr [rbp+8]
00000041 call FFFFFFFFFFEC9728
00000046 mov qword ptr [rbp+18h],rax
0000004a mov rax,qword ptr [rbp+18h]
0000004e mov qword ptr [rbp+8],rax
p = func3(p);
00000052 mov rcx,qword ptr [rbp+8]
00000056 call FFFFFFFFFFEC9720
0000005b mov qword ptr [rbp+20h],rax
0000005f mov rax,qword ptr [rbp+20h]
00000063 mov qword ptr [rbp+8],rax
00000067 jmp 0000000000000069
}
}
あきらかにCのコードに比べて汚いんだけど、どこをどう見てもNULLチェックしない分だけ2の方が速いですよ。
cmp qword ptr [rsp+20h],0
je 0000000000000078
NULLチェックと言ってもここの部分ですけどね。
実際にこのコードではNULLならスルーしてるだけですが、例外の場合には例外をはき直してます。
それよりここ無駄なんじゃ・・・
00000048 mov qword ptr [rsp+30h],rax
0000004d mov rax,qword ptr [rsp+30h]
アセンブリもうちょっと勉強しないと。