Информация об изменениях

Сообщение Re[4]: FileStream, buffer, оптимальное чтение от 24.01.2020 0:09

Изменено 24.01.2020 0:10 alexzzzz

Re[4]: FileStream, buffer, оптимальное чтение
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 на максимальной скорости. Он может в два с лишним раза быстрее.
Re[4]: FileStream, buffer, оптимальное чтение
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 на максимальной скорости. Он может в два с лишним раза быстрее.