Мне нужно сделать серию записей в один и тот же файл, но в разных местах файла. Я хочу добиться этого с максимально возможной производительностью и поэтому рассмотрел синхронные методы FileStream.Write и асинхронный FileStream.BeginWrite.
Синхронная реализация тривиальна и просто вызывает FileStream. Запишите необходимое количество раз в цикле. Асинхронная версия вызывает FileStream.BeginWrite в цикле, а затем выполняет WaitHandle.WaitAll, чтобы заблокировать, пока все они не будут завершены. К моему удивлению, это работает медленнее, чем простая синхронная версия.
Я создал FileStream, используя правильный конструктор, чтобы я мог запросить асинхронную операцию, и я также протестировал свойство IAsyncResult.CompletedSynchronous, которое указывало на False, и поэтому они действительно работали в асинхронном режиме. Кажется, что единственным преимуществом использования BeginWrite является то, что вы не блокируете свой поток во время записи. Помимо этого преимущества, есть ли смысл использовать асинхронную версию?
Вот тестовый код, который я использовал для игры с асинхронным методом, может быть, есть очевидная ошибка?
// Size of a chunk to be written to file
var chunk = 1024 * 64;
// Number of chunks to write async
var reps = 32;
// Create new file and set length
var fs = new FileStream(@"C:\testfile.dat",
FileMode.Create, FileAccess.ReadWrite,
FileShare.None, chunk, true);
fs.SetLength(chunk * reps);
// Allocate resources
byte[] bytes = new byte[chunk];
WaitHandle[] handles = new WaitHandle[reps];
for (int i = 0; i < reps; i++)
{
fs.Seek(chunk * i, SeekOrigin.Begin);
handles[i] = fs.BeginWrite(bytes, 0, chunk, null, null).AsyncWaitHandle;
}
// Wait for all async operations to complete
WaitHandle.WaitAll(handles);
fs.Flush();
fs.Close();