2013-03-05 16 views
28

Sto considerando Haskell per un'app soft in tempo reale. Probabilmente userò gli attori, per quello che vale. Mi chiedo se qualcuno abbia un'idea dello stato attuale del tempo reale con Haskell. In particolare, i problemi con il GC mettono in pausa l'app. Ho cercato su Google ampiamente e ho trovato una grande quantità di discussioni da più di 2 anni, ma niente di attuale. Qui ci sono un paio di riferimenti che ho trovato:Stato attuale di Haskell soft in tempo reale

Using Haskell for sizable real-time systems: how (if?)?

How about Haskell's GC performance for soft realtime application like games?

Gran parte delle cose più vecchio che ho letto suggerisce che la situazione era (al momento) pensato per essere migliorare. Ce l'ha?

Anche più di 2 anni fa, ci sono stati alcuni commenti che suggeriscono che le app Haskell potrebbero essere regolate per mantenere in modo affidabile le pause GC fino a un millisecondo o due. Questo sembra realistico?

+0

non ho visto GC pause effetto esempio xmonad o frammentazione. Gli strumenti di profilazione sono facilmente sufficienti per garantire che non stiate generando molti rifiuti. –

+0

Sarei un po 'diffidente nei confronti degli attori in Haskell, tuttavia i thread GHC sono studiati molto meglio –

+0

Penso che questa domanda sia piuttosto difficile da rispondere empiricamente, ma come dato di solito vedo pause sub-millisecondo in applicazioni soft real-time su hardware di base abbastanza standard. –

risposta

29

Quindi la preoccupazione per "tempo reale" è la latenza introdotta dalle raccolte GC.

GHC utilizza un garbage collector multicore (e c'è a branch con per-thread local heaps). Sviluppato originariamente per migliorare le prestazioni multcore (ogni core can collect independently) riducendo il costo della sincronizzazione frequente stop-the-world, questo accade anche a beneficio del tempo reale in tempo reale per lo stesso motivo. Tuttavia, a partire dal 2013, l'heap locale per-thread non è stato ancora unito al GHC principale, sebbene sia stato utilizzato il GC parallelo.

Per un gioco si dovrebbe essere in grado di sfruttare questo, utilizzando thread e riducendo così la necessità di collezioni locali stop-the-world.

Per oggetti longevi, nell'heap globale, si rischia ancora un GC (ms). Tuttavia, un'attenta profilazione con ad es. ThreadScope rimuoverà gli ostacoli qui. Ho visto in streaming video in tempo reale 1080p attraverso uno stack di rete gestito da GHC senza pause GC evidenti.

E anche senza questi tuneup, le cose "potrebbero funzionare". Frag non aveva quasi bisogno di ottimizzazione ed è stato soft realtime quasi 10 anni fa.

Infine, ci sono molti strumenti e bandiere GHC per migliorare le prestazioni:

E poi c'è la codifica: utilizzare tipi non in scatola (senza GC), minimizzare l'allocazione della struttura pigra. Mantieni i dati a lungo termine in forma compressa. Test e benchmark.

Penso che starai bene.

+1

Don in quale versione GHC sono stati introdotti gli heap per thread? Ci sono dettagli nei documenti GHC? (Ho provato su google, ma non ho trovato nulla di particolare) – Qrilka

+2

Grazie per avermi ricordato di rivisitare questo. In base al rapporto di stato GHC, il GC per thread rimane in un ramo e non è nella linea principale. Mi sono collegato ai rapporti e allo stato. –

2

Non ho riscontrato problemi con le pause GC, purché non si utilizzino elenchi pigri per tutto, non si dovrebbe generare troppo cestino.

Tuttavia, Sky non è così luminoso per le applicazioni multi-thread. GHC non ha ancora un programmatore con priorità di thread, se usi thread per pesanti elaborazioni in background, puoi facilmente far morire di fame il tuo ciclo degli eventi.

+1

Non ho familiarità con l'analisi della severità di GHC (http://www.haskell.org/haskellwiki/Performance/Strictness). La mia comprensione è che in molti casi, essa aggrava automaticamente le cose, incluse le liste. (Supponendo che il livello di ottimizzazione sia sufficientemente elevato). Quindi stai dicendo che dovrei semplicemente assicurarmi di codificare in modo tale che GHC possa rendere le cose rigide laddove appropriato? – rlkw1024

0

GHC 8.2.1 dispone di una funzionalità denominata Regioni compatte che potrebbe essere utile.

Dalla mia comprensione, sembra essere un tipo di gestione della memoria semi-manuale. È possibile archiviare dati di lunga durata in un'area compatta e il programma di raccolta dati obsoleti non li rintraccia. Se ci sono riferimenti a qualcosa nella Regione Compatta, l'intera Regione Compatta viene mantenuta attiva. Una volta che non ci sono riferimenti a qualcosa nella regione, sarà deallocato. Se si apportano aggiornamenti funzionali ai contenuti di una regione, è possibile ridistribuirla in una nuova regione e la vecchia regione verrà liberata.

http://ezyang.com/compact.html
https://hackage.haskell.org/package/compact-0.1.0.1/docs/Data-Compact.html

Problemi correlati