A>Вероятно, где-то присутствуют какие-то задержки. Может быть, нет упреждающего чтения и его можно как-то включить.
Или 4096-байтные страницы памяти дают слишком большой оверхед и большие двухмегабайтные помогли бы, но не знаю, как ОС об этом сообщить.
Следующий вариант программы работает стабильно быстрее 800 Мб/с. Два буфера ― пока один заполняется данными, во втором ищутся нужные байты, потом буферы меняются местами. Оптимальный размер буферов почему-то в районе сотен килобайт. Если уменьшать или увеличивать, скорость падает. Функцию поиска ускорять нет смысла. Если её вообще убрать, скорость работы не увеличивается.
| Скрытый текст |
| using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
internal class Program
{
private static async Task Main()
{
var filename = @"C:\Users\alexz\Desktop\H.VHDX";
var length = new FileInfo(filename).Length;
var stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
long result = 0;
var timer = Stopwatch.StartNew();
{
const int BUFFER_SIZE = 256 * 1024;
var buffers = new[] { new byte[BUFFER_SIZE], new byte[BUFFER_SIZE] };
var activeBufferIndex = 0;
var bytesRead = 0;
do
{
var task = stream.ReadAsync(buffers[activeBufferIndex], 0, buffers[activeBufferIndex].Length);
result += CountBytes(0, buffers[1 - activeBufferIndex], bytesRead);
bytesRead = await task;
activeBufferIndex = 1 - activeBufferIndex;
} while (bytesRead > 0);
}
timer.Stop();
Console.WriteLine(result);
Console.WriteLine(length * 1000 / timer.ElapsedMilliseconds / 1_000_000 + " Mb/s");
}
private static long CountBytes(byte reference, byte[] buffer, int size)
{
var count = 0;
for (var i = 0; i < size; i++)
{
if (buffer[i] == reference) count++;
}
return count;
}
}
|
| |
Пока не знаю, как заставить читаться данные с моего SSD на максимальной скорости. Он может в два с лишним раза быстрее.