Синхронизация производительности чтения файла .NET 4.5 и асинхронность

Мы пытаемся измерить производительность между чтением ряда файлов с использованием методов синхронизации и асинхронного. Ожидалось, что между ними будет примерно одинаковое время, но, как оказалось, использование асинхронности примерно в 5,5 раз медленнее

Это может быть связано с накладными расходами на управление потоками, но я просто хотел узнать ваше мнение. Может быть, мы просто неправильно измеряем время.

Вот методы, которые тестируются:

    static void ReadAllFile(string filename)
    {
        var content = File.ReadAllBytes(filename);
    }

    static async Task ReadAllFileAsync(string filename)
    {
        using (var file = File.OpenRead(filename))
        {
            using (var ms = new MemoryStream())
            {
                byte[] buff = new byte[file.Length];
                await file.ReadAsync(buff, 0, (int)file.Length);
            }
        }
    }

И это метод, который запускает их и запускает секундомер:

    static void Test(string name, Func<string, Task> gettask, int count)
    {
        Stopwatch sw = new Stopwatch();

        Task[] tasks = new Task[count];
        sw.Start();
        for (int i = 0; i < count; i++)
        {
            string filename = "file" + i + ".bin";
            tasks[i] = gettask(filename);
        }
        Task.WaitAll(tasks);
        sw.Stop();
        Console.WriteLine(name + " {0} ms", sw.ElapsedMilliseconds);

    }

Который все бежит отсюда:

    static void Main(string[] args)
    {
        int count = 10000;

        for (int i = 0; i < count; i++)
        {
            Write("file" + i + ".bin");
        }

        Console.WriteLine("Testing read...!");            

        Test("Read Contents", (filename) => Task.Run(() => ReadAllFile(filename)), count);
        Test("Read Contents Async", (filename) => ReadAllFileAsync(filename), count);

        Console.ReadKey();
    }

И вспомогательный метод записи:

    static void Write(string filename)
    {
        Data obj = new Data()
        {
            Header = "random string size here"
        };
        int size = 1024 * 20; // 1024 * 256;

        obj.Body = new byte[size];

        for (var i = 0; i < size; i++)
        {
            obj.Body[i] = (byte)(i % 256);
        }

        Stopwatch sw = new Stopwatch();
        sw.Start();

        MemoryStream ms = new MemoryStream();
        Serializer.Serialize(ms, obj);
        ms.Position = 0;

        using (var file = File.Create(filename))
        {
            ms.CopyToAsync(file).Wait();
        }

        sw.Stop();
        //Console.WriteLine("Writing file {0}", sw.ElapsedMilliseconds); 
    }

Результаты, достижения:

-Read Contents 574 ms
-Read Contents Async 3160 ms

Буду очень признателен, если кто-нибудь сможет пролить свет на это, когда мы будем искать в стеке и в Интернете, но не сможем найти правильное объяснение.

Ответы на вопрос(2)

Ваш ответ на вопрос