Lectura de archivos .NET 4.5 rendimiento sincronizado vs asíncrono

Estamos tratando de medir el rendimiento entre leer una serie de archivos usando métodos de sincronización vs asíncronos. Esperaba tener aproximadamente el mismo tiempo entre los dos, pero resulta que el uso de async es aproximadamente 5.5x más lento.

Esto podría deberse a la sobrecarga de administrar los subprocesos, pero solo quería saber su opinión. Tal vez solo estamos midiendo los tiempos mal.

Estos son los métodos que se están probando:

    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);
            }
        }
    }

Y este es el método que los ejecuta y comienza el cronómetro:

    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);

    }

Que se ejecuta todo desde aquí:

    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();
    }

Y el método de escritura auxiliar:

    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); 
    }

Los resultados:

-Read Contents 574 ms
-Read Contents Async 3160 ms

Realmente apreciaremos si alguien puede arrojar algo de luz sobre esto mientras buscamos en la pila y en la web, pero no podemos encontrar una explicación adecuada.

Respuestas a la pregunta(2)

Su respuesta a la pregunta