中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

2009年4月27日 #

例外処理のオーバーヘッド C#

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]

アセンブリもうちょっと勉強しないと。

posted @ 9:07 | Feedback (40)