TPL-Datenfluss beschleunigen?

Ich frage mich, ob der folgende Code für eine schnellere Ausführung optimiert werden kann. Momentan scheine ich ungefähr 1,4 Millionen einfache Nachrichten pro Sekunde in einer ziemlich einfachen Datenflussstruktur maximal zu nutzen. Mir ist bekannt, dass dieser Beispielprozess Nachrichten synchron weitergibt / transformiert. Derzeit teste ich TPL Dataflow als möglichen Ersatz für meine eigene benutzerdefinierte Lösung, die auf Aufgaben und gleichzeitigen Sammlungen basiert. Ich weiß, dass die Begriffe "gleichzeitig" bereits besagen, dass ich Dinge parallel laufen lasse, aber zu aktuellen Testzwecken habe ich Nachrichten auf meiner eigenen Lösung synchron durchgeschoben und erhalte ungefähr 5,1 Millionen Nachrichten pro Sekunde. Was ich hier vermisse, ist, dass ich gelesen habe, dass TPL Dataflow als Lösung mit hohem Durchsatz und geringer Latenz gepusht wurde, aber bisher muss ich Leistungsverbesserungen übersehen. Wer könnte mich bitte in die richtige Richtung weisen?

class TPLDataFlowExperiments
{
    public TPLDataFlowExperiments()
    {
        var buf1 = new BufferBlock<int>();

        var transform = new TransformBlock<int, string>(t =>
            {
                return "";
            });

        var action = new ActionBlock<string>(s =>
            {
                //Thread.Sleep(100);
                //Console.WriteLine(s);
            });

        buf1.LinkTo(transform);
        transform.LinkTo(action);

        //Propagate all Completions down the flow
        buf1.Completion.ContinueWith(t =>
        {
            transform.Complete();
            transform.Completion.ContinueWith(u =>
            {
                action.Complete();
            });
        });

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

        int cap = 10000000;
        for (int i = 0; i < cap; i++)
        {
            buf1.Post(i);
        }

        //Mark Buffer as Complete
        buf1.Complete();

        action.Completion.ContinueWith(t =>
            {
                watch.Stop();

                Console.WriteLine("All Blocks finished processing");
                Console.WriteLine("Units processed per second: " + cap / watch.ElapsedMilliseconds * 1000);
            });

        Console.ReadLine();
    }
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage