Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.248.47] |
|
Сообщ.
#1
,
|
|
|
Изучаю скоростные параметры купленного SSD диска WDS500G3X0C-00SJG0 (465 ГБ)
Написал программку для измерения скорости записи и чтения диска. При копировании файла 20ГБ в пределах SSD диска средствами Windows 10, скорость записи и чтения в пределах 2 ГБ/сек. Но моя программка показывает другую скорость: Скорость чтения = 1 228 мегабайт в секунду Скорость записи = 827 мегабайт в секунду В чем причина уменьшения скорости? Проект в прикрепленном файле. Вот текст программки: #include "stdafx.h" #include "PrecisionTimer.h" #include <locale.h> #include <iostream> #include <fstream> using namespace std; int main() { wstring Im = _T("C:\\TestSkorost.bin"); wstring ImR = _T("Результат.txt"); int i; std::locale Loc = std::locale::global(std::locale("russian")); __int64 DlNew = 1024; DlNew = DlNew * 1024; DlNew = DlNew * 1024; DlNew = DlNew * 20; char *buf = NULL; try { buf = new char[DlNew]; } catch (...) { wcout << _T("Ошибка выделения памяти для буфера. Введите любое число:"); wcin >> i; return 0; }; wcout << _T("Началась работа:\n"); ofstream os(Im, std::ios::binary); if (!os){wcout<< _T("Ошибка открытия файла: C:\\TestSkorost.bin для записи."); wcin >> i; return 0;}; CPrecisionTimer p; p.Start(); double tnw = p.GetMsCurrentTime(); os.write(buf, DlNew); double tkw = p.GetMsCurrentTime(); os.close(); ifstream is(Im, std::ios::binary); if (!is) { wcout << _T("Ошибка открытия файла:C:\\TestSkorost.bin для чтения"); wcin >> i; return 0;}; double tnr = p.GetMsCurrentTime(); is.read(buf, DlNew); double tkr = p.GetMsCurrentTime(); is.close(); delete[] buf; double Tr = (tkr - tnr), Tw = tkw - tnw; double SkorR = (DlNew / Tr) / 1000, SkorW = (DlNew / Tw) / 1000; wofstream osR(ImR); if (!osR) { wcout << _T("Ошибка открытия файла результата:'Результат.txt' для записи."); wcin >> i; return 0; }; osR << _T(" Скорость чтения = ") << (int)SkorR << _T(" мегабайт в секунду\n") << _T("Скорость записи = ") << (int)SkorW << _T(" мегабайт в секунду"); osR.close(); wcout<<_T("Файл результата записан, введите любое число:"); wcin >> i; return 0; } Прикреплённый файлSkorostReadWriteSSD.rar (132,69 Кбайт, скачиваний: 192) |
Сообщ.
#2
,
|
|
|
__int64 DlNew = 1024; DlNew = DlNew * 1024; DlNew = DlNew * 1024; DlNew = DlNew * 20;
Это буфер в 20Гб. У вас есть столько оперативки? Если нет, то все идет в своп.... Надо делать маленький буфер, например, при 16Гб ОЗУ, сделать его 1Гб, слишком мелкий тоже делать нельзя. Читать/писать в цикле. |
Сообщ.
#3
,
|
|
|
Цитата Black_Dragon @ __int64 DlNew = 1024; DlNew = DlNew * 1024; DlNew = DlNew * 1024; DlNew = DlNew * 20; Это буфер в 20Гб. У вас есть столько оперативки? Да, у меня 32 ГБ оперативки. Гаджет "Индикатор ЦП", показывающий и загрузку ОП, показывает 60-70% использования памяти. Своп в системе отключен. Почему такая разница в скорости? |
Сообщ.
#4
,
|
|
|
Пока трудно сказать.
А что диспетчер задач показывает на дисках при копировании через вашу программу? |
Сообщ.
#5
,
|
|
|
Цитата Black_Dragon @ А что диспетчер задач показывает на дисках при копировании через вашу программу? Сто пудово через System передача идёт. Надо кэширование на запись отключить(или наоборот включить). Иначе у вас при записи данные копируются из вашей программы в незанятою ОЗУ, а от туда на диск. Это съедает время. Цитата a_n_y_a @ показывает 60-70% использования памяти. С выходом Винды 10 о счетчиках можно забыть. Они работают криво. Там под кэш используются ваши 30-40% которые учитываются как свободные, а надели там ваши файл за кэшировался. Да еще и не влез. Цитата Своп в системе отключен. Отключение Свопа не отключает алгоритм сжатия страниц. |
Сообщ.
#6
,
|
|
|
Отключил кеширование. Скорость копирования системой почти не изменилась, а скорость записи и чтения моей программой уменьшилась в два раза:
Скорость чтения = 535 мегабайт в секунду Скорость записи = 493 мегабайт в секунду |
Сообщ.
#7
,
|
|
|
1 228 и 827 в сумме как-то подозрительно эти самые 2 048 напоминают...
|
Сообщ.
#8
,
|
|
|
Цитата Qraizer @ 1 228 и 827 в сумме как-то подозрительно эти самые 2 048 напоминают... Тогда копирование средствами ОС показывалось бы 800-900, так как это было бы узким местом... Я скорость чтения проверяю Far manager-ом: копированием в nul А за сколько по времени то проходит копирование/чтение? При малых значениях, результаты могут быть не точными, так как может что-то стороннее влиять. Может надо по 10 раз подряд операцию сделать... |
Сообщ.
#9
,
|
|
|
Копирование гигабайтами - это бред. Буфер больше 16Мб не имеет смысла делать. В теории для некоторых SSD может помочь распараллеливание: один поток пишет текущую порцию данных, а другой в это время уже считывает следующую.
Добавлено По поводу отдельных операций я бы для начала сделал порционное чтение файла блоками. Внезапно, скорость может возрасти и тому есть объективные причины. Добавлено Можно отобразить файл на память, некоторые люди утверждаю, что для Винды это самый быстры способ прочитать все данные (не проверял). |