78章:10 行でズバリ!! 64 ビット対応 .NET アプリケーションの開発 (C#)

    作成2013.04.11

     VBで作成したプログラムとC#言語で作成したプログラムの演算能力は変わらないのでは?そんな疑問がわきます。ではX86モードとX64モードではどの程度演算能力に差が生じるのだろうか?そんな疑問に10 行でズバリ!! 64 ビット対応 .NET アプリケーションの開発 (C#)が答えてくれます。

  1. 参照元情報
     10 行でズバリ!! 64 ビット対応 .NET アプリケーションの開発 (C#)
    「10 行でズバリ!! 64 ビット対応 .NET アプリケーションの開発 (C#) 」にジャンプする
     演算時間の評価に関しては、上記サンプルに若干の修正を加える必要があります。

  2. 10 行でズバリ!! 64 ビット対応 .NET アプリケーションの開発 (C#)
     完成ファイルは下記からダウンロードできます。
     ダウンロード後は解凍してから使用してください。
      [10 行でズバリ!! 64 ビット対応 .NET アプリケーションの開発 (C#)]をダウンロードする。
     解凍すると「8GetPeData」フォルダーがあります。
    注(1)「8GetPeData」フォルダーの「GetPeData.sln」ファイルをダブルクリックすると「Express 2012 for Windows Desktop」が起動します。
    注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
    注(3)「ソリューションエクスプローラ」ウインドウ内の「Form1.cs」をダブルクリックすると「デザイン」が表示されます。
    注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
    注(5)「GetPeData」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。


  3. GetPeData.slnの実行
    (1)「Express 2012 for Windows Desktop」のデバッグ機能を使用します。
    (2)VBコードでDoubleの足し算、引き算、掛け算、割り算を1G回繰り返すように設定してあります。
    (3)For文の繰り返し回数を少なめに設定してから実行願います。処理時間の様子をみて回数を変更します。
    (4)「デバッグ」_「デバッグ開始」を選択します。
    (5)取得ボタンを押します。
    (6)スタート時刻、終了時刻、解析結果が表示されます。
    (7)クローズボックスで終了します。


  4. Form1の全コード
    using System;
    using System.Windows.Forms;
    using System.Reflection;
    
    namespace GetPeData
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                // プラットフォームのポインタサイズを取得する 
                String str = null;
                str = str + "IntPtr.Size=" + System.IntPtr.Size.ToString() + "\r\n";
    
                // 現在実行中のアセンブリを構成するモジュールコレクションを取得する 
                Module[] moduleArray = Assembly.GetExecutingAssembly().GetModules();
    
                // モジュールを列挙する 
                foreach (Module md in moduleArray)
                {
                    // モジュールのアセンブリ名を取得する 
                    Assembly myAssembly = md.Assembly;
                    str = str + "Asm=" + myAssembly.FullName + "\r\n";
    
                    // モジュール(EXE/DLL) がもつ属性を取得する 
                    PortableExecutableKinds pekind = new PortableExecutableKinds();
                    ImageFileMachine ifm = new ImageFileMachine();
                    md.GetPEKind(out pekind, out ifm);
    
                    str = str + "pekind =" + pekind.ToString() + "\r\n";
                    str = str + "ImageFileMachine=" + ifm.ToString() + "\r\n";
                    textBox1.Text = str;
                }
                long i;
                Double x = Math.Sqrt(2);
                Double y = Math.PI;
                Double z;
                this.dateTimePicker1.Format = DateTimePickerFormat.Time;
                this.dateTimePicker1.ShowUpDown = true;
                for (i = 0; i < 1000000000; i++)
                {
                    z = x + y;
                    z = y - x;
                    z = x * y;
                    z = x / y;
                }
                this.dateTimePicker2.Format = DateTimePickerFormat.Time;
                this.dateTimePicker2.ShowUpDown = true;
            }
        }
    }
    


  5. Form1コードの説明
    (1)using System.Reflection;はAssemblyクラスで必要とします。
    (2)System.IntPtr.Size.ToString()はシステムのポインターサイズを与えます。
    (3)Assembly.GetExecutingAssembly().GetModules()は現在実行中のアセンブリを構成するモジュールコレクションを与えます。
    (4)myAssembly.FullNameはモジュールのアセンブリ名を与えます。
    (5)pekind.ToString()はPortableExecutableKindsの属性を与えます。
    (6)ifm.ToString()はImageFileMachineの属性を与えます。
    (7) this.dateTimePicker1.Format = DateTimePickerFormat.Time;で開始時間を表示します。
    (8)for (i = 0; i < 1000000000; i++)で四則演算を指定回数繰り返します。
    (9)this.dateTimePicker2.Format = DateTimePickerFormat.Time;で終了時間を表示します。


  6. 評価条件
    Windows7 Home Premium
    Intel(R) Pentium(R) CPU G630 @2.70GHz
    RAM 4GB 命令セット64-bit
    ビルド後実行ファイルを直接駆動します。

  7. 評価結果
    (1)x64リリースモード
    実行時間8s
    IntPtr.Size=8
    Asm=GetPeData, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    pekind =ILOnly, PE32Plus
    ImageFileMachine=AMD64
    IntPtr.Size=8 Asm=GetPeData, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null pekind =ILOnly, PE32Plus ImageFileMachine=AMD64
    (2)x64ディバッグモード
    実行時間8s
    IntPtr.Size=8
    Asm=GetPeData, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    pekind =ILOnly, PE32Plus
    ImageFileMachine=AMD64

    (3)x86とAnyCPUのリリースモード
    実行時間2s
    IntPtr.Size=4
    Asm=GetPeData, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    pekind =ILOnly, Required32Bit
    ImageFileMachine=I386

    (4)x86とAnyCPUのディバッグモード
    実行時間8s
    IntPtr.Size=4
    Asm=GetPeData, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    pekind =ILOnly, Required32Bit
    ImageFileMachine=I386


  8. 捕捉説明
    (1)PE32Plus:この実行可能ファイルには 64 ビット プラットフォームが必要です。
    (2)Required32Bit:この実行可能ファイルは 32 ビット プラットフォーム、または 64 ビット
    プラットフォーム上の 32 ビット WOW (Windows on Windows) 環境で実行できます。
    (3)AMD64:64ビットの汎用レジスタを持ち、32ビットのx86より広い物理および仮想のアドレス空間をサポートするため、プログラムが大きいデータをより容易に操作する事が可能である。またx86-64は32ビットのプログラムコードと完全な後方互換性を持つ。全ての32ビットの命・゚セットが、エミュレーションを介在せずにハードウェア上に実装され続けているため、32ビットのx86実行ファイルは、互換性上あるいは性能上の損失なしに稼動できる。
    (4)I386:Intel 80386(またはi386)はインテルの32ビットマイクロプロセッサ(CPU)である。1985年10月に発表され、x86アーキテクチャを32ビットに拡張し、レジスタを強化した。


    感想:
    (1)x86とAnyCPUは同じ結果となります。
    (2)x86とAnyCPUのリリースモードが最も高速で実行時間が2sとなりました。
    (3)その他のモードの実行時間は全て8sとなりました。
    (4)以上のテスト結果では、x86かAnyCPUのリリースモードが大量の数値計算には適するというこになります。
    (5)VBのテスト結果は全てのモードで実行時間は8sとなりましたので、C#のx86かAnyCPUのリリースモードが良いということになります。







9章:ピクチャの描画 : グラフィックスを使用する (C#)に行く。

トップページに戻る。