42章:チュートリアル41:VBでの演算能力の検証(VB)

    作成2013.04.08

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

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

  2. VBでの演算能力の検証
     完成ファイルは下記からダウンロードできます。
     ダウンロード後は解凍してから使用してください。
      [VBでの演算能力の検証]をダウンロードする。
     解凍すると「42GetPeData」フォルダーがあります。
    注(1)「42GetPeData」フォルダーの「GetPeData.sln」ファイルをダブルクリックすると「Microsoft Visual Basic 2010 Express」が起動します。
    注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
    注(3)「ソリューションエクスプローラ」ウインドウ内の「MainWindow.xaml」をダブルクリックすると「デザイン」と「XAML」が表示されます。
    注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
    注(5)「42GetPeData」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。


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


  4. プロジェクトの構成
    (1)Form1.vbとそのコードで構成されます。


  5. XAMLの全コード
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="401" Width="522">
        <Grid>
            <Grid Name="Grid1" Margin="0,25,0,0">
                <Ellipse Height="50" HorizontalAlignment="Left" Margin="65,91,0,0" Name="Ellipse1" Stroke="Black" VerticalAlignment="Top" Width="93" Fill="BlueViolet" />
                <Label Content="Label" Height="28" HorizontalAlignment="Left" Margin="225,167,0,0" Name="Label1" VerticalAlignment="Top" />
                <Rectangle Height="56" HorizontalAlignment="Left" Margin="264,85,0,0" Name="Rectangle1" Stroke="Black" VerticalAlignment="Top" Width="101" Fill="Magenta" />
            </Grid>
            <StackPanel Height="25" HorizontalAlignment="Left" Name="StackPanel1" VerticalAlignment="Top">
                <Button Content="印刷" Height="23" Name="Button1" Width="75" />
            </StackPanel>
        </Grid>
    </Window>
    


  6. XAMLのポイント
    (1)一般的な記載のみです。


  7. Class MainWindowクラスの全コード
    Imports System.Reflection
    
    Public Class Form1
        Private Sub button1_Click(sender As System.Object, e As System.EventArgs) Handles button1.Click
            ' プラットフォームのポインタサイズを取得する
            Dim str As String = vbNullString
            str = str & "IntPtr.Size=" & System.IntPtr.Size.ToString() & vbCrLf
    
            ' 現在実行中のアセンブリを構成するモジュールコレクションを取得する
            Dim moduleArray As System.Reflection.Module() = _
        Assembly.GetExecutingAssembly().GetModules()
    
            ' モジュールを列挙する
            For Each md As System.Reflection.Module In moduleArray
                ' モジュールのアセンブリ名を取得する
                Dim myAssembly As Assembly = md.Assembly
                str = str & "Asm=" & myAssembly.FullName & vbCrLf
    
                ' モジュール(EXE/DLL) がもつ属性を取得する
                Dim pekind As PortableExecutableKinds = New PortableExecutableKinds()
                Dim ifm As ImageFileMachine = New ImageFileMachine()
                md.GetPEKind(pekind, ifm)
    
                str = str & "pekind =" & pekind.ToString() & vbCrLf
                str = str & "ImageFileMachine=" & ifm.ToString() & vbCrLf
                textBox1.Text = str
            Next
    
            Dim i As Integer
            Dim x As Double = Math.Sqrt(2)
            Dim y As Double = Math.PI
            Dim z As Double
            Me.dateTimePicker1.Format = DateTimePickerFormat.Time
            Me.dateTimePicker1.ShowUpDown = True
            For i = 0 To 1000000000 Step 1
                z = x + y
                z = y - x
                z = x * y
                z = x / y
            Next i
            Me.dateTimePicker2.Format = DateTimePickerFormat.Time
            Me.dateTimePicker2.ShowUpDown = True
        End Sub
    End Class
    


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


  9. 評価条件
    Windows7 Home Premium
    Intel(R) Pentium(R) CPU G630 @2.70GHz
    RAM 4GB 命令セット64-bit


  10. 評価結果
    (1)x64リリースモード
    実行時間8s
    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リリースモード
    実行時間8s
    IntPtr.Size=4
    Asm=GetPeData, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    pekind =ILOnly, Required32Bit
    ImageFileMachine=I386

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


  11. 捕捉説明
    (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)VBにおいては全てのモードで四則演算の処理時間は同じとなった。デバッグモードとリリースモードで差がないのはなぜだろうか?X86モードとX64モードで差が無いのはなぜだろうか?
    (2)VBとC#の差はあるのだろうか?これも気になる課題です。VBとC#のコード変換は簡単ですので試してみました。
    (3)総合比較結果では、C#のX86モードのリリースモードが最も高速で、それ以外の処理時間は全て同じ結果となりました。(なぜだろうか?)
    (4)四則演算を1G回も繰り返すことはまれであり、実用的には処理時間の差は気にならないと思います。






43章:チュートリアル42:WPFでの印刷(4) (VB)に行く。

トップページに戻る。