Как получить текущий размер страницы памяти MS Windows 7 в C #? - PullRequest
2 голосов
/ 21 октября 2011

Как получить текущий размер страницы памяти MS Windows 7 в C #?

В некоторых случаях нам это нужно для наилучшего распределения памяти.

Спасибо!

ОБНОВЛЕНИЯ: Вот пример кода ... У меня есть некоторые сомнения по поводу строки 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);

Ответы [ 2 ]

11 голосов
/ 21 октября 2011

Если вы используете C # 4.0, есть свойство Environment.SystemPageSize, которое внутренне использует GetSystemInfo.Я никогда не видел его раньше, так как он новый.

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 /ПРИЗВАТЬ, чтобы вызвать GetSystemInfo.Взгляните на http://www.pinvoke.net/default.aspx/kernel32.getsysteminfo

Я также должен добавить, что выделение массива байтов размера страницы не лучший выбор.

Прежде всего, память C # может быть перемещена, C # используеткомпактный сборщик мусора.Информация о том, где будут размещаться данные, отсутствует.

Во-вторых, массивы в C # могут быть образованы несмежной областью памяти!Массивы хранятся непрерывно в виртуальной памяти, но смежная виртуальная память не является непрерывной физической памятью.

В-третьих, структура данных массива в C # занимает на несколько байтов больше, чем сам контент (он хранит размер массива и другую информацию).Если вы выделите размер страницы в байтах, то использование массива переключит страницу почти всегда!

Я думаю, что эта оптимизация может быть неоптимизацией.

Обычно массивы C # работают очень хорошо безнеобходимость разделять память по размеру страницы.

Если вам действительно нужно точное распределение данных, вам нужно использовать закрепленные массивы или распределение Маршала, но это замедлит сборщик мусора.

Я быскажем, лучше использовать массивы, не слишком задумываясь о размере страницы.

2 голосов
/ 21 октября 2011

Используйте pinvoke для вызова GetSystemInfo () и используйте значение dwPageSize. Хотя вы, вероятно, действительно хотите dwAllocationGranularity, который является наименьшим блоком VirtualAlloc () будет выделять вместо него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...