Quali ottimizzazioni possono essere eseguite per codice soft in tempo reale in C #?

8

Sto scrivendo un'applicazione soft in tempo reale in C #. Alcune attività, come rispondere alle richieste hardware provenienti da una rete, devono essere terminate entro una certa quantità di millisecondi; tuttavia non è mission-critical al 100% farlo (cioè possiamo tollerare che sia puntuale per la maggior parte del tempo, e l'1% è indesiderabile ma non un fallimento), quindi la parte "soft".

Ora mi rendo conto che C # è un linguaggio gestito e le lingue gestite non sono particolarmente adatte per le applicazioni in tempo reale. Tuttavia, la velocità con cui possiamo fare le cose in C #, così come le funzionalità linguistiche, come la riflessione e la gestione della memoria, rendono il compito di creare questa applicazione molto più facilmente.

Esistono ottimizzazioni o strategie di progettazione che è possibile adottare per ridurre la quantità di costi generali e aumentare il determinismo? Idealmente avrei i seguenti obiettivi

  • Ritarda la garbage collection finché non è "sicura"
  • Permetti al garbage collector di funzionare senza interferire con i processi in tempo reale
  • Discussione / elaborazione delle priorità per diversi compiti

Ci sono dei modi per farlo in C # e ci sono altre cose da tenere in considerazione in tempo reale quando si usa C #?

L'obiettivo della piattaforma per l'applicazione è .NET 4.0 Client Profile su Windows 7 64-bit, con. L'ho impostato al momento sul profilo del cliente ma questa era solo l'opzione predefinita e non è stata scelta per nessun motivo particolare.

    
posta 9a3eedi 27.08.2014 - 02:42
fonte

4 risposte

7

L'ottimizzazione che soddisfa i tuoi primi due proiettili è denominata Pool di oggetti . Funziona con

  1. creazione di un pool di oggetti all'avvio del programma
  2. mantenere i riferimenti a quegli oggetti in un elenco in modo che non vengano raccolti dati inutili,
  3. consegna gli oggetti al tuo programma dal pool, se necessario, e
  4. restituire gli oggetti al pool quando hai finito di usarli.

È possibile trovare una classe di esempio che implementa un pool di oggetti utilizzando un ConcurrentBag qui .

La priorità del thread / processo può essere facilmente impostata in fase di esecuzione. La Classe discussione ha metodi e proprietà che ti consente di impostare la priorità e l'affinità del processore. La Classe di processo contiene strutture simili.

    
risposta data 27.08.2014 - 04:11
fonte
3

Delay the garbage collection until it is "safe"

Puoi farlo impostando la modalità di latenza del GC a LowLatency . Per ulteriori informazioni, vedi questa risposta su SO .

    
risposta data 01.09.2014 - 00:55
fonte
2

Adotta lo stesso approccio che lo sviluppo dei giochi fa in un ambiente gestito e cerca di minimizzare la creazione / morte degli oggetti fino al minimo assoluto.

es. Prova a creare ossessivamente tutti gli oggetti che potrebbero essere richiesti all'inizio e alla piscina passa per ref ove possibile, evita operazioni che creano oggetti intermedi di breve durata

    
risposta data 27.08.2014 - 03:28
fonte
0

Ricorda che l'ambiente di destinazione (Windows) è un O / S pre-emptive multi-tasking. In altre parole, il tuo processo soft in tempo reale sarà inevitabilmente anticipato in un momento o nell'altro, il che introdurrà altre latenze oltre alla garbage collection di .NET. È possibile attenuarlo riducendo il valore della fetta temporale (valore predefinito è qualcosa come 16 ms) e elevando la priorità del processo (ma esistono dei limiti pratici), ma le pre-emption devono ancora verificarsi perché altri processi essenziali hanno ancora bisogno di fare cose Tutto ciò non ha nulla a che fare con il linguaggio di programmazione; è fondamentale per l'O / S.

Problemi GC a parte, la tua applicazione in esecuzione su una macchina Windows pronta all'uso sarà probabilmente in grado di fornire latenze di pochi millisecondi. Di certo non può essere garantito il 100% delle volte o qualcosa di simile. Anche con l'accordatura (breve quantum, alta priorità), avrai comunque occasionali latenze elevate. È la natura della bestia.

In conclusione: se hai bisogno di tempi di risposta garantiti, soprattutto dell'ordine di pochi millisecondi, Windows probabilmente non è la scelta migliore per la consegna O / S.

    
risposta data 14.09.2016 - 03:26
fonte

Leggi altre domande sui tag