2009-05-15 13 views
7

Qual è il miglior algoritmo per implementare una semplice libreria di timer. La biblioteca dovrebbe consentire i seguenti:Algoritmo Timer efficiente

  1. Timer essere iniziato
  2. Timer essere fermato
  3. Timer da verificare se sono ancora in esecuzione

Timer scadenza una funzione di callback sarà chiamato.

Il modulo timer consente ai timer di avere una risoluzione temporale di Ns e il modulo deve ricevere un calcio ogni Ns per richiedere al modulo di controllare i timer scaduti.

Molti timer possono essere contemporaneamente attivi.

il miglior algoritmo deve soddisfare i seguenti obiettivi

  1. essere robusto per i timer in fase di avvio/fermato durante l'elaborazione di un timer di callback scadenza
  2. Consenti timer per essere avviato, fermato e controllato rapidamente
  3. Avere un piccolo ingombro di memoria

saluti

+0

In che lingua deve essere la soluzione? –

+0

Sono più interessato all'algoritmo che all'implementazione. Se ti aiuta a sapere che probabilmente lo implementerei in C. Saluti –

risposta

8

miglior algoritmo che ho visto per i timer è una ruota del timer trovato nel documento di ricerca Hashed and Hierarchical Timing Wheels: Data Structures for the Efficient Implementation of a Timer Facility

so in Java esiste un'implementazione con Netty, JBoss e sono sicuro anche altrove che è possibile utilizzare, se si stanno scrivendo in Java.

+1

Il documento di riferimento discute diversi algoritmi del timer e dove possono essere utilizzati in modo appropriato. Se il collegamento dovesse fallire in futuro, potrebbe essere utile sapere che il titolo è "Ruote dentate tratteggiate e gerarchiche: strutture dati per l'implementazione efficiente di un timer" –

+1

Prima di leggere la risposta, non ero a conoscenza della classe NettyIO [ HashedWheelTimer] (http://netty.io/4.0/api/io/netty/util/HashedWheelTimer.html), ma l'implementazione sembra eccellente. Nessun gioco di parole: non reinventare la ruota! – kevinarpe

+1

C'è anche un'implementazione C qui: http://www.25thandclement.com/~william/projects/timeout.c.html – starseeker

1

O n sistemi POSIX-ish, è possibile utilizzare la famiglia di funzioni timer_create/timer_settime per fornire molto "gratuitamente".

+1

Ciao Kristopher, Vedrò questi, ma sono più interessato all'algoritmo di prendere una libreria di magazzino. Cordiali saluti –

2

I timer vengono in genere implementati meglio in un kernel del sistema operativo, a livello di assembly/C, utilizzando, laddove possibile, funzionalità specifiche della piattaforma come i timer APIC.

Si potrebbe dare un'occhiata a http://lwn.net/Articles/167897/ per i dettagli sull'implementazione di Linux e scavare attraverso il codice sorgente di Linux per vedere le implementazioni di lavoro.

Problemi correlati