テストプログラム仕様

 このサイトは FC2 さんですが、使用できるファイルの拡張子に制限があります(無料で 1MB までやってくれますから…)。

 ですから、使用 OK の txt ファイルを使ってソースリストを表現しますので、ご了承ください。

Visual Studio のプロジェクト構成

 一部アセンブラを使っています。x64 環境ではインラインアセンブラが利用できませんから、アセンブラ用の構成を加えて、3つのプロジェクトにしています。

  1.  MASM32
  2.  MASM64
  3.  Sample (VC++ 用メインプロジェクト)

MASM32

 L1 キャッシュをソートデータとは関係のないデータで埋め尽くすために使っています。速度を計測するときに、環境条件を固定するためです。アセンブラの選択は、もちろん 32 ビット用 MASM です。

 ClsCash32.txt

MASM64

 全く同じもの意味で、64 ビット用です。アセンブラの選択は、64 ビット用 MASM です。

 ClsCash64.txt

 もし、64 ビット用のアセンブラが選択肢に表示されないというときは、

  1.  エクスプローラーで、Visual Studuio 内のフォルダで、VC フォルダの中にある VCProjectDefaults フォルダを探し、その中に移動します。
  2.  masm.rules というファイルがあるので、そのファイルをコピーしてファイル名を変更します。例えば masm64.rules にします。
  3.  その変更したファイルをテキストエディタで開き、Name="MASM" の部分を Name="MASM64" などに変更します。この名前が選択肢として表示されることになります。
  4.  その2行下に、CommandLine="ml.exe … という exe を呼び出す部分があります。masm64 の exe は ml64.exe ですから、ここを ml64.exe に書き換えます。変更したら保存終了し、Visual Studio をもう一度起動し直します。

Sample

 メインのプロジェクトで、VC++ です。「空のプロジェクト」の状態から作成したものです。筆者は速度が遅い MFC は全く使いません。もし、MFC ファンの方で、このプログラムをお使いになられる方は適当にご自分で移植してください。

 ちなみにアイコンファイル

BlackCat.ico

 画面項目の変数名は、次のとおりです。

ダイアログそのもの IDD_DIALOG  
アイコン IDI_ICON  
データの種類のコンボボックス IDC_DATATYPE ドロップダウンリスト、Sort = False
ソートの種類のコンボボックス IDC_SORTTYPE ドロップダウンリスト、Sort = False
レコード数のエディットボックス IDC_RECCOUNT Number = True
繰り返しのエディットボックス IDC_REPEATCOUNT Number = True
実行時間表示のエディットボックス IDC_EXECTIME Read Only = True コピーして貼り付けられるようにエディットボックスを使用
実行ボタン IDC_EXEC  
中断ボタン IDC_ABORT   
閉じる IDC_EXIT   

 「♪ドレミファソート」の場合のソースリストです。クイックソートを含めて4種類のソートを収録してあります。

 DoReMiFaSortCpp.txt DoReMiFaSortH.txt DwordArrayCpp.txt DwordArrayH.txt resource..txt Sample.txt stdafx.txt

 DoReMiFaSort の cpp と h が、ソートの部分そのものになります。

 DwordArray の cpp と h は、ソートするテストデータを準備します。このうち、Random32 と Random32R ですが、これは VC や VC++ の rand_s 関数で1億3千万個くらいの4バイトデータをファイル名 RandData.bin で用意しておきます。これを、COMMON_APPDATA の場所に格納しておきます。Windows Vista 以降でしたら、ProgramData の直下になりますし、Windows XP であれば、AllUsers の AppData の直下になります。

 Sample.cpp がメインのファイルになります。もし、ソートの種類を変えるときは、

  1.  新しいソートの cpp ファイルと h ファイルを作成。例えば、BubbleSort.cpp と BubbleSort.h みたいに。
  2.  先頭から 11 行目にある #include "DoReMiFaSort.h" を新しいものに変更
  3.  関数 OnExec の中に switch 〜 case 文があるので、ソートの種類コンボボックスの何番目のインデックス(先頭はゼロ)にどの関数を実行させるかを設定。つまり、実行したい関数名を変数に代入しておきます。この変数の内容が、間接コールされます。
  4.  その OnExec 関数の次に定義してある、OnInitDialog 関数の中に、SendMessage( m_SortType, CB_ADDSTRING, 0, ( LPARAM ) TEXT( "qsort(VC)" ) ); のように、m_SortType (ソートの種類のコンボボックス)に項目をどんどん追加する部分がありますから、適当な種類の名前を入れてコンボボックスの文字列を希望の順番の希望の文字列に設定
  5.  必要に応じて、その先にあるレコード数の初期値 50000000 を減らす。

 という順序で設定します。

 繰り返し回数の意味ですが、例えば3回と指定すると、ソートを3回実行し、その3回のなかで実行時間が一番短かったときの値を表示するという意味です。これは、何回か計測しないと、測定値がばらつくので、このようにしています。もちろん、毎回ソートするデータの配列は、きちんと初期設定されます。

 バブルソートなのに、間違って5千万件のソートをさせちゃったから中断したい、みたいな中断させる事情ができたときは、中断ボタンを押してください。

 この説明画面から抜けるときは、ブラウザの「戻る」のボタンを押してください。

inserted by FC2 system