Здравствуйте, 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 Гб/с.
Вероятно, где-то присутствуют какие-то задержки. Может быть, нет упреждающего чтения и его можно как-то включить.