2011-10-21 13 views
2

メモリの現在のページサイズを取得する方法C#のMS Windows 7?メモリの現在のページサイズを取得する方法C#のMS Windows 7?

場合によっては、メモリを最適な方法で割り当てる必要があります。

ありがとうございました!

更新:ここで私はGetSystemInfo()を呼び出してdwPageSize値を使用するために使用のPInvoke byte[] buffer = new byte[4096];

// Assign values to these objects here so that they can 
// be referenced in the finally block 
Stream remoteStream = null; 
Stream localStream = null; 
WebResponse response = null; 

try 
{ 
    response = request.EndGetResponse(result); 

    if (response != null) 
    { 
     // Once the WebResponse object has been retrieved, get the stream object associated with the response's data 
     remoteStream = response.GetResponseStream(); 

     // Create the local file 
     string pathToSaveFile = Path.Combine(FileManager.GetFolderContent(), TaskResult.ContentItem.FileName); 
     localStream = File.Create(pathToSaveFile); 

     // Allocate a 1k buffer http://en.wikipedia.org/wiki/Page_(computer_memory) 
     byte[] buffer = new byte[4096];  
     int bytesRead; 

     // Simple do/while loop to read from stream until no bytes are returned 
     do 
     { 
      // Read data (up to 1k) from the stream 
      bytesRead = remoteStream.Read(buffer, 0, buffer.Length); 
+8

あなたは本当に**ページサイズを知っていると、あなたのメモリをどのように割り当てるかについてより良い選択をすることができますか?その場合は、C#がソリューションを開発するための最善の技術であると確信していますか?あなたは、ページサイズがあなたのメモリ配分に恩恵を受けるという事例を投稿してもいいですか? –

+0

サンプルコードをご覧ください。ここからわかるように、byte [] buffer = new byte [4096]; 4096はハードコードされています。私はここMS Windows 7のx86とx64の場合などの正しい値をここで使用する必要があります –

答えて

11

C#4.0を使用している場合は、内部的にGetSystemInfoを使用するEnvironment.SystemPageSizeプロパティがあります。私はそれが新しいから以前はそれを見たことがありません。

http://msdn.microsoft.com/en-us/library/system.environment.systempagesize.aspx

Cでは、あなたはこのような何かを書くことができます。

#include <windows.h> 
int main(void) { 
    SYSTEM_INFO si; 
    GetSystemInfo(&si); 

    printf("The page size for this system is %u bytes.\n", si.dwPageSize); 

    return 0; 
} 

次に、P/INVOKEを使用してGetSystemInfoを呼び出すことができます。 http://www.pinvoke.net/default.aspx/kernel32.getsysteminfo

また、ページサイズのバイトの配列を割り当てることが最善の選択ではないことを追加する必要があります。

まず、C#メモリは移動できますが、C#では世代別ガベージコレクタを使用しています。 データの配置場所に関する情報はありません。

第2に、C#の配列は、非連続領域のメモリによって形成することができます。配列は仮想メモリに連続して格納されますが、連続した仮想メモリは連続した物理メモリではありません。

第3に、C#の配列データ構造は、コンテンツ自体(配列のサイズやその他の情報を格納する)よりも数バイト多くを占めています。ページサイズのバイト数を割り当てると、配列を使用するとほとんどのページが切り替わります!

この最適化は非最適化と考えることができます。

通常、C#配列は、ページサイズを使用してメモリを分割する必要はありません。

実際にデータの正確な割り当てが必要な場合は、固定配列またはマーシャル割り当てを使用する必要がありますが、ガベージコレクタが遅くなります。

ページサイズについてあまり考慮せずに配列を使用するほうがよいと言います。

2

ライン上でいくつかの疑問を持っている...サンプルコードです。おそらく本当にdwAllocationGranularityが必要ですが、最小のブロックVirtualAlloc()が代わりに割り当てられます。

+0

ありがとう!それはまさに私が求めているものです! http://www.pinvoke.net/default.aspx/kernel32.getsysteminfoこれで私はこれを行うことができます... WinApi.SYSTEM_INFO sysinfo = new WinApi。システム情報(); WinApi.GetSystemInfo(ref sysinfo); //バッファを割り当てます。 byte [] buffer =新しいバイト[int.Parse(sysinfo.dwPageSize.ToString())]; –

関連する問題