В указанном коде, если убрать махинации с курсором файла, скорость записи мегабайта составляет 20мс. Но если записывать блоки случайно, тогда запись мегабайта происходит за не приличные 800мс, почти секунда и это при то что у меня навороченный SSD. Не помогает даже шаманство с FileOptions.RandomAccess. При последовательной записи тоже меняется Position, почему если я его меняю вручную, тогда так сильно падает производительность. Разница в 40 раз. Посоветуйте что нибудь плз.
static string path = @"...\ConsoleApplication10\bin\Debug\1.dat";
static int count = 1;
static int len = 1024 * 1024;
static void Test()
{
var rnd = new Random();
var sw = Stopwatch.StartNew();
var b = new byte[4];
var fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 4096, FileOptions.RandomAccess | FileOptions.SequentialScan);
if (fs.Length == 0)
{
fs.SetLength(len);
}
Console.WriteLine("Test started");
for (var i = 0; i < len / 4; ++i)
{
var ind = 20;
b[0] = (byte)ind;
b[1] = (byte)(ind >> 8);
b[2] = (byte)(ind >> 16);
b[3] = (byte)(ind >> 24);
//fs.Position = i * 4;
//fs.Seek(i * 4, SeekOrigin.Begin);
fs.Seek(rnd.Next(0, len / 4) * 4, SeekOrigin.Begin);
fs.Write(b, 0, 4);
}
fs.Close();
Console.WriteLine("Test end time - " + sw.ElapsedMilliseconds);
}