TPL Dataflow Speedup?
Me pregunto si el siguiente código puede optimizarse para ejecutarse más rápido. Parece que actualmente me alcance un máximo de alrededor de 1.4 millones de mensajes simples por segundo en una estructura de flujo de datos bastante simple. Soy consciente de que este proceso de muestra pasa / transforma los mensajes de manera sincrónica, sin embargo, actualmente pruebo TPL Dataflow como un posible reemplazo para mi propia solución personalizada basada en Tareas y colecciones concurrentes. Sé que los términos "concurrente" ya sugieren que corro cosas en paralelo, pero para los propósitos de las pruebas actuales, puse los mensajes en mi propia solución de forma síncrona y llegué a aproximadamente 5,1 millones de mensajes por segundo. Lo que me falta aquí es que leí que el flujo de datos TPL se introdujo como una solución de alto rendimiento y baja latencia, pero hasta ahora debo pasar por alto los ajustes de rendimiento. ¿Alguien que pueda indicarme la dirección correcta, por favor?
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();
}
}