Получите производительность Harddrrive под Windows, используя C ++ - PullRequest
0 голосов
/ 18 ноября 2018

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

Это было бы в основном похоже на использование производительности в диспетчере задач в окнах, как показано на следующем рисунке: enter image description here

, но вместо скорости чтения фактическое число для чтения / записибайтов.

Я выполнил некоторые инструкции, чтобы получить следующий код:

HANDLE OpenTarget(PCWSTR lpName)
{
    HANDLE hTarget;
    hTarget = CreateFile(lpName,
        0,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);

    return hTarget;
}

long total_disk_read() noexcept {
    HANDLE hTarget = OpenTarget(wszDrive);

    if (hTarget == INVALID_HANDLE_VALUE)
    {
        LOG(error) << "Failed to get Disk info, code: " << GetLastError();
        return 0 ;
    }

    DISK_PERFORMANCE dp = { 0 };
    DWORD cbOutBufferSize = sizeof(DISK_PERFORMANCE);
    DWORD cbBytesReturned = 0;
    LPVOID lpOutBuffer = (LPVOID)&dp;

    if (!DeviceIoControl(hTarget, IOCTL_DISK_PERFORMANCE, NULL, 0, lpOutBuffer, cbOutBufferSize, &cbBytesReturned, NULL))
    {
        LOG(error) << "Failed to get Disk Performance info, code: " << GetLastError();
        CloseHandle(hTarget);
        return 0 ;
    }
    else {
        CloseHandle(hTarget);
        return dp.BytesRead.QuadPart;
    }
}

Теперь у меня два вопроса:

1- Iпонимать, что dp.BytesRead возвращает long_integer, определенный в lib.h windows.Я использую это долго, чтобы зарезервировать результаты.Есть ли лучший формат для использования.2- Я заметил, что каждый раз, когда возвращаемое чтение увеличивается, это означает, что счетчик чтения не сбрасывается при каждом чтении.Это правильно?и как это решить?

Заранее спасибо.

1 Ответ

0 голосов
/ 18 ноября 2018

Самое безопасное, чтобы ваша функция возвращала LARGE_INTEGER или int64_t (поскольку LARGE_INTEGER - это 64-разрядное целое число со знаком).

Сохранить значение предыдущего чтения и уменьшить возвращаемое значение на это значение.

int64_t disk_read_since_last_check() noexcept {
    static int64_t previous_read=0;
    //...
    int64_t rv = dp.BytesRead.QuadPart - previous_read;
    previous_read = dp.BytesRead.QuadPart;
    return rv;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...