Tengo una cola en la que se colocan las solicitudes de transformación de Fourier pendientes (operaciones comparativamente lentas), podríamos obtener miles de solicitudes de transformación por segundo en algunos casos, por lo que debe ser rápido.Manera más eficiente de procesar una cola con hilos
Estoy actualizando el código anterior para usar .net 4, así como la migración a TPL. Me pregunto cómo es la forma más eficiente (rendimiento más rápido) de manejar esta cola. Me gustaría usar todos los núcleos disponibles.
Actualmente estoy experimentando con un BlockingCollection. Creo una clase de manejador de colas que genera 4 tareas, que bloquean en BlockingCollection y esperan el trabajo entrante. Luego procesan esa transformación pendiente. Código:
public class IncomingPacketQueue : IDisposable
{
BlockingCollection<IncomingPacket> _packetQ = new BlockingCollection<IncomingPacket>();
public IncomingPacketQueue(int workerCount)
{
for (int i = 0; i < workerCount; i++)
{
Task.Factory.StartNew(Consume);
}
}
public void EnqueueSweep(IncomingPacket incoming)
{
_packetQ.Add(incoming);
}
private void Consume()
{
foreach (var sweep in _packetQ.GetConsumingEnumerable())
{
//do stuff
var worker = new IfftWorker();
Trace.WriteLine(" Thread {0} picking up a pending ifft".With(Thread.CurrentThread.ManagedThreadId));
worker.DoIfft(sweep);
}
}
public int QueueCount
{
get
{
return _packetQ.Count;
}
}
#region IDisposable Members
public void Dispose()
{
_packetQ.CompleteAdding();
}
#endregion
}
¿Esto parece una buena solución? Parece que se agotan todos los núcleos, aunque actualmente no estoy seguro de cuántos trabajadores debería generar en mi constructor.
En una nota lateral, también se puede utilizar el Intel IPP para speedup la transformada de Fourier de trabajo (cada hilo que se ejecuta en un núcleo utilizará entonces instrucciones SSE a hacer el trabajo), pero luego tiene el placer de la interoperabilidad ;-) –