На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Скорость при записи потоком wofstream меньше скорости записи Windows 10 , Пишу файл 20 ГБ на SSD диск потоком wofstream, но скорость меньше скорости записи средствами Windows 10.
    Изучаю скоростные параметры купленного SSD диска WDS500G3X0C-00SJG0 (465 ГБ)
    Написал программку для измерения скорости записи и чтения диска. При копировании файла 20ГБ в пределах
    SSD диска средствами Windows 10, скорость записи и чтения в пределах 2 ГБ/сек. Но моя программка показывает
    другую скорость:
    Скорость чтения = 1 228 мегабайт в секунду
    Скорость записи = 827 мегабайт в секунду
    В чем причина уменьшения скорости? Проект в прикрепленном файле.

    Вот текст программки:
    ExpandedWrap disabled
      #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)
      __int64 DlNew = 1024; DlNew = DlNew * 1024; DlNew = DlNew * 1024; DlNew = DlNew * 20;
      Это буфер в 20Гб. У вас есть столько оперативки?
      Если нет, то все идет в своп....
      Надо делать маленький буфер, например, при 16Гб ОЗУ, сделать его 1Гб, слишком мелкий тоже делать нельзя.
      Читать/писать в цикле.
        Цитата Black_Dragon @
        __int64 DlNew = 1024; DlNew = DlNew * 1024; DlNew = DlNew * 1024; DlNew = DlNew * 20;
        Это буфер в 20Гб. У вас есть столько оперативки?

        Да, у меня 32 ГБ оперативки. Гаджет "Индикатор ЦП", показывающий и загрузку ОП, показывает 60-70% использования памяти. Своп в системе отключен. Почему такая разница в скорости?
          Пока трудно сказать.
          А что диспетчер задач показывает на дисках при копировании через вашу программу?
            Цитата Black_Dragon @
            А что диспетчер задач показывает на дисках при копировании через вашу программу?

            Сто пудово через System передача идёт.

            Надо кэширование на запись отключить(или наоборот включить). Иначе у вас при записи данные копируются из вашей программы в незанятою ОЗУ, а от туда на диск. Это съедает время.

            Цитата a_n_y_a @
            показывает 60-70% использования памяти.

            С выходом Винды 10 о счетчиках можно забыть. Они работают криво. Там под кэш используются ваши 30-40% которые учитываются как свободные, а надели там ваши файл за кэшировался. Да еще и не влез.

            Цитата
            Своп в системе отключен.

            Отключение Свопа не отключает алгоритм сжатия страниц.
              Отключил кеширование. Скорость копирования системой почти не изменилась, а скорость записи и чтения моей программой уменьшилась в два раза:
              Скорость чтения = 535 мегабайт в секунду
              Скорость записи = 493 мегабайт в секунду
                1 228 и 827 в сумме как-то подозрительно эти самые 2 048 напоминают...
                  Цитата Qraizer @
                  1 228 и 827 в сумме как-то подозрительно эти самые 2 048 напоминают...

                  Тогда копирование средствами ОС показывалось бы 800-900, так как это было бы узким местом...

                  Я скорость чтения проверяю Far manager-ом: копированием в nul

                  А за сколько по времени то проходит копирование/чтение?
                  При малых значениях, результаты могут быть не точными, так как может что-то стороннее влиять.
                  Может надо по 10 раз подряд операцию сделать...
                  Сообщение отредактировано: Black_Dragon -
                    Копирование гигабайтами - это бред. Буфер больше 16Мб не имеет смысла делать. В теории для некоторых SSD может помочь распараллеливание: один поток пишет текущую порцию данных, а другой в это время уже считывает следующую.

                    Добавлено
                    По поводу отдельных операций я бы для начала сделал порционное чтение файла блоками. Внезапно, скорость может возрасти и тому есть объективные причины.

                    Добавлено
                    Можно отобразить файл на память, некоторые люди утверждаю, что для Винды это самый быстры способ прочитать все данные (не проверял).
                    Сообщение отредактировано: shm -
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0469 ]   [ 18 queries used ]   [ Generated: 26.04.24, 10:18 GMT ]