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

Сообщение Re[3]: FileStream, buffer, оптимальное чтение от 23.01.2020 20:57

Изменено 23.01.2020 21:19 alexzzzz

Re[3]: FileStream, buffer, оптимальное чтение
Здравствуйте, romangr, Вы писали:

ltc>>Тут ты упираешься в скорость чтения с диска, а не подсчёт байтиков. Будет ли чтение быстрее в многопотоке — большой вопрос, скорее нет.

R>Для SSD чтение в несколько потоков имеет смысл.

Что в один поток, что в несколько, у меня не получилось разогнаться больше 500 Мб/с.

  Скрытый текст
using System;
using System.Diagnostics;
using System.IO;
using System.IO.MemoryMappedFiles;

internal unsafe class Program
{
    private static void Main()
    {
        var filename = @"C:\Users\alexz\Desktop\H.VHDX"; // ~100 Гб
        var mmf = MemoryMappedFile.CreateFromFile(filename, FileMode.Open);
        var accessor = mmf.CreateViewAccessor();
        var length = accessor.Capacity;

        var handle = accessor.SafeMemoryMappedViewHandle;
        byte* start = default;
        handle.AcquirePointer(ref start);

        var timer = Stopwatch.StartNew();
        var result = CountBytes(0, start, start + length);
        timer.Stop();

        Console.WriteLine(result);
        Console.WriteLine(length * 1000 / timer.ElapsedMilliseconds / 1_000_000 + " Mb/s");
    }

    private static long CountBytes(byte reference, byte* startPointer, byte* endPointer)
    {
        long count = 0;
        byte* pointer = startPointer;
        while (pointer < endPointer)
        {
            if (*pointer++ == reference) count++;
        }
        return count;
    }
}

Если файл уже к кэше, то эта простая программа считает количество нулевых байт со скоростью ~1,1 Гб/с. А если данные приходится читать с накопителя, то загрузка процессора падает и средняя скорость оказывается в районе 400-500 Мб/с, хотя мой NVMe может отдавать 2 Гб/с.

Вероятно, где-то присутствуют какие-то задержки. Может быть, нет упреждающего чтения и его можно как-то включить.
Re[3]: FileStream, buffer, оптимальное чтение
Здравствуйте, romangr, Вы писали:

ltc>>Тут ты упираешься в скорость чтения с диска, а не подсчёт байтиков. Будет ли чтение быстрее в многопотоке — большой вопрос, скорее нет.

R>Для SSD чтение в несколько потоков имеет смысл.

Что в один поток, что в несколько, у меня не получилось разогнаться больше 500 Мб/с.

  Скрытый текст
using System;
using System.Diagnostics;
using System.IO;
using System.IO.MemoryMappedFiles;

internal unsafe class Program
{
    private static void Main()
    {
        var filename = @"C:\Users\alexz\Desktop\H.VHDX"; // ~100 Гб
        var mmf = MemoryMappedFile.CreateFromFile(filename, FileMode.Open);
        var accessor = mmf.CreateViewAccessor();
        var length = accessor.Capacity;

        var handle = accessor.SafeMemoryMappedViewHandle;
        byte* start = default;
        handle.AcquirePointer(ref start);

        var timer = Stopwatch.StartNew();
        var result = CountBytes(0, start, start + length);
        timer.Stop();

        Console.WriteLine(result);
        Console.WriteLine(length * 1000 / timer.ElapsedMilliseconds / 1_000_000 + " Mb/s");
    }

    private static long CountBytes(byte reference, byte* startPointer, byte* endPointer)
    {
        long count = 0;
        byte* pointer = startPointer;
        while (pointer < endPointer)
        {
            if (*pointer++ == reference) count++;
        }
        return count;
    }
}

Если файл уже в кэше, то эта простая программа считает количество нулевых байт со скоростью ~1,1 Гб/с. А если данные приходится читать с накопителя, то загрузка процессора падает и средняя скорость оказывается в районе 400-500 Мб/с, хотя мой NVMe может отдавать 2 Гб/с.

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