Ho bisogno di implementare una coda FIFO per i messaggi su un server di gioco, quindi deve essere il più veloce possibile. Ci sarà una coda per ogni utente.Qual è la raccolta più veloce in C# per implementare una coda di priorità?
La coda avrà una dimensione massima (diciamo 2000). La dimensione non cambierà durante il runtime.
Ho bisogno di dare la priorità ai messaggi SOLO se la coda raggiunge la sua dimensione massima lavorando all'indietro e rimuovendo un messaggio con priorità più bassa (se ne esiste uno) prima di aggiungere il nuovo messaggio.
Una priorità è un int con possibili valori di 1, 3, 5, 7, 10.
Ci possono essere più messaggi con la stessa priorità.
Un messaggio non può cambiare la sua priorità una volta assegnato.
L'applicazione è asincrona pertanto è necessario bloccare l'accesso alla coda.
Attualmente lo sto implementando utilizzando una LinkedList come memoria sottostante, ma temo che la ricerca e la rimozione dei nodi la mantengano bloccata troppo a lungo.
Heres il codice di base che ho in questo momento:
public class ActionQueue
{
private LinkedList<ClientAction> _actions = new LinkedList<ClientAction>();
private int _maxSize;
/// <summary>
/// Initializes a new instance of the ActionQueue class.
/// </summary>
public ActionQueue(int maxSize)
{
_maxSize = maxSize;
}
public int Count
{
get { return _actions.Count; }
}
public void Enqueue(ClientAction action)
{
lock (_actions)
{
if (Count < _maxSize)
_actions.AddLast(action);
else
{
LinkedListNode<ClientAction> node = _actions.Last;
while (node != null)
{
if (node.Value.Priority < action.Priority)
{
_actions.Remove(node);
_actions.AddLast(action);
break;
}
node = node.Previous;
}
}
}
}
public ClientAction Dequeue()
{
ClientAction action = null;
lock (_actions)
{
action = _actions.First.Value;
_actions.RemoveFirst();
}
return action;
}
}
Non abbastanza informazioni secondo me. Le priorità sono limitate o illimitate? La tua coda manterrà pochi 10 o articoli o potenzialmente 10s di 1000? Hai bisogno di una coda di priorità mutevole o immutabile? Puoi elencare alcune operazioni supportate e la complessità computazionale desiderata? Avete bisogno di supportare le operazioni in tempo reale, o è ammortizzato O (1) accettabile? ecc. – Juliet
Queste priorità fisse e qual è il loro intervallo? – RBarryYoung
@ Juliet: Ha. Chiedo alle persone nelle interviste "Come implementeresti una coda prioritaria?" tutto il tempo. La maggior parte delle persone lo fa, ma non chiedono mai informazioni sulle priorità, sul numero di articoli o sulle operazioni da effettuare. Tu, amico mio, sei assunto! :) –