2015-08-03 2 views
3

Мое приложение создает файл размером 2 ГБ и требует выбора самого быстрого накопителя в системе с достаточным пространством. Я пытаюсь вычислить пропускную способность за счет создания файла, установки длины, а затем записывает данные на него последовательно следующим образом:Расчет пропускной способности жесткого диска

FileInfo file = null; 
var drives = DriveInfo.GetDrives(); 
var stats = new List<DriveInfoStatistics>(); 

foreach (var drive in drives) 
{ 
    do 
    { 
     file = new FileInfo(Path.Combine(drive.RootDirectory.FullName, Guid.NewGuid().ToString("D") + ".tmp")); 
    } 
    while (file.Exists); 

    try 
    { 
     using (var stream = file.Open(FileMode.CreateNew, FileAccess.Write, FileShare.None)) 
     { 
      var seconds = 10; 
      var frameRate = 120F; 
      var bytesWritten = 0L; 
      var bytesPerPixel = 1; 
      var watch = new Stopwatch(); 
      var videoSize = new Size(1328, 1048); 
      var buffer = new byte [(int) (videoSize.Width * videoSize.Height * bytesPerPixel)]; 

      stream.SetLength((long) (videoSize.Width * videoSize.Height * bytesPerPixel * frameRate * seconds)); 

      watch.Restart(); 
      for (int i = 0; i < seconds; i++) 
      { 
       for (int j = 0; j < frameRate; j++) 
       { 
        stream.Write(buffer, 0, buffer.Length); 
        bytesWritten += buffer.Length; 
       } 
      } 
      watch.Stop(); 

      stats.Add(new DriveInfoStatistics(drive, bytesWritten/watch.Elapsed.TotalSeconds)); 
     } 
    } 
    catch 
    { 
    } 
    finally 
    { 
     file.Refresh(); 
     if (file.Exists) { try { file.Delete(); } finally { file.Refresh(); } } 
    } 
} 

if (stats.Count == 0) 
{ 
    throw (new Exception("No suitable drives were found.")); 
} 
else 
{ 
    stats.Sort((x, y) => y.DataTransferRate.CompareTo(x.DataTransferRate)); 

    message 
     = "The following drives are suitable candidates (best to worst):" 
     + Environment.NewLine 
     + Environment.NewLine 
     + string.Join(Environment.NewLine, stats.ConvertAll<string>(s => (s.DriveInfo.RootDirectory.FullName.Substring(0, 2).ToUpper() + " " + ConversionUtilities.ToIsuBytesNotation(s.DataTransferRate) + "ps"))) 
     + Environment.NewLine 
     + Environment.NewLine 
     + "Test results may vary based on other applications accessing the drives." 
     + Environment.NewLine 
     + Environment.NewLine 
     + "Try the test with the system configured as it would be in production." 
     ; 

    MessageBox.Show(message); 
} 

Полученные результаты я получаю не имеет смысла:

РАБОЧЕГО

D: 4.15 GBps // SSD. 
F: 4.09 GBps // HDD (5200 RPM). 
E: 4.06 GBps // HDD (7500 RPM). 
C: 4.03 GBps // SSD. 
H: 2.45 GBps // Ram Disk!!! 
  • Прежде всего, SSD и жесткие диски находятся слишком близко друг от друга.
  • Во-вторых, скорости намного быстрее, чем я ожидал.
  • В-третьих, RAM-диск (созданный с помощью RAMDisk) имеет наименьшую пропускную способность. На практике Ram Disk намного превосходит других при записи фактических видеоданных.

LAPTOP

E: 981.24 MBps // Ram Disk. 
C: 100.17 MBps // HDD (5200 RPM). 
D: 055.94 MBps // HDD (5200 RPM). 

Результаты одного и того же кода на моем ноутбуке разработки более правдоподобным.

Есть что-то неправильное с кодом выше? Если нет, как бы вы объяснили пропускную способность 4 ГБ/с для SSD, в то время как диск Ram достигнет 2,5 ГБ/с?

Я понимаю, что существует множество факторов, влияющих на пропускную способность, и что программное обеспечение для тестирования очень сложное. Однако в моем случае критически важным является запись видеофайла размером 2 ГБ со скоростью 120 кадров в секунду без потери кадров, и приведенный выше код должен представить пользователю быструю и грязную рекомендацию о том, какой диск использовать для хранения временных кадров. Кадры позже обрабатываются и транскодируются в видео MP4 всего в несколько мегабайт.

Наконец, я пробовал приведенный выше код рядом с Contig.exe от Sysinternals, чтобы обеспечить непрерывную компоновку для повышения производительности жесткого диска. Однако я не заметил разницы в производительности, что указывает на то, что файл не был достаточно фрагментирован, чтобы начать (после создания).

ответ

1

Если программа записывает данные на диск, там случаются довольно много разных вещей:

Сначала данные записываются в буфер оперативной памяти и операция признаваемых в письменной форме программным способом до данные передаются в следующие этапы.

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

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

Весьма сложно измерить пропускную способность реального с программным обеспечением высокого уровня.

Одна возможность: напишите очень большой файл, который, как ожидается, будет намного больше, чем любые chaches в операционной системе/контроллере/жестком диске. Это дает вам хорошую оценку постоянная скорость записи.

+0

Я думал, что было бы проще, чтобы получить грубое чувство относительной скорости. В моем случае это не настоящая скорость. Я не нашел способ определить, был ли данный диск HDD, SSD или Ram Disk. Эта информация была бы достаточной, без необходимости выполнять фактические тесты на запись. –

+0

Помните все, что может происходить, av, шифрование, сжатие. – BugFinder

+0

Я не много читал по этому вопросу, но http://stackoverflow.com/questions/13726522/what-is-the-easiest-way-in-c-sharp-to-check-if-hard-disk-is -ssd-without-writing обсуждает решение, определяющее, является ли диск ssd или hdd. – prettyvoid

Смежные вопросы