1. Processar blocos enviados por eventos (interrupções)
2. Configurar a prioridade do processo para tempo real
Existem também outros items que podem se provar úteis
3. Armazenar os dados em um buffer.
4. Configurar a afinidade do processo para apenas um core em uma máquina de múltiplos processadores.
As razões para cada um dos items é explicada a seguir:
1. Interrupções: O processamento deve ser feita em uma thread paralela ao recebimento para que o primeiro não interrompa o segundo. O método de melhor perfomance com este fim é o desenvolvimento orientado a eventos.
2. O Windows escalona os processos de acordo com sua prioridade, se nosso processo de tempo real não estiverem configurados com a prioridade máxima haverão outros processos escalonados antes deles e haverão demoras no processamento. Mas atenção, antes de habilitar este modo tenha certeza de que sua aplicação não possui loops infinitos, ou seja, que ela seja orientada a eventos conforme o passo 1, senão ela tomará conta do processador e não liberará pra nenhuma aplicação de prioridade inferior. Em C# é possível mudar a prioridade do processo atual da seguinte forma
var process = Process.GetCurrentProcess();3. O buffer pode ser uma opção viável quando a necessidade de um fluxo contínuo é superior a necessidade de que este fluxo seja processado o mais cedo possível.
process.PriorityClass = ProcessPriorityClass.RealTime;
4. A afinidade de processador pode trazer um maior controle sobre a ordenação dos pacotes de saída caso haja um jitter no processamento. Em C# isso é feito assim:
var process = Process.GetCurrentProcess();Onde 1 é o primeiro core, 2 seria o segundo core, 3 ambos (sem afinidade), num computador de 2 cores.
process.ProcessorAffinity = (IntPtr)1;
Nenhum comentário:
Postar um comentário