Potrzebuję zaimplementować kolejkę FIFO dla wiadomości na serwerze gry, więc musi być tak szybko jak to możliwe. Dla każdego użytkownika będzie kolejka.Jaka jest najszybsza kolekcja w języku C# do wdrożenia kolejki priorytetyzacji?
Kolejka będzie miała maksymalny rozmiar (powiedzmy 2000). Rozmiar nie zmieni się podczas uruchamiania.
Muszę TYLKO nadać priorytet wiadomościom, jeśli kolejka osiągnie maksymalny rozmiar, pracując wstecz i usuwając komunikat o niższym priorytecie (jeśli taki istnieje) przed dodaniem nowej wiadomości.
priorytet jest int z możliwych wartości o 1, 3, 5, 7, 10.
może istnieć wiele wiadomości z tym samym priorytecie.
Po przydzieleniu wiadomość nie może zmienić swojego priorytetu.
Aplikacja jest asynchroniczna, dlatego dostęp do kolejki musi być zablokowany.
W tej chwili implementuję go przy użyciu obiektu LinkedList jako bazowego magazynu, ale mam obawy, że wyszukiwanie i usuwanie węzłów pozostanie zablokowane przez zbyt długi czas.
Herezje kod podstawowy Mam w tej chwili:
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;
}
}
Za mało informacji w mojej opinii. Czy priorytety są ograniczone lub nieograniczone? Czy twoja kolejka pomieści kilka 10 lub przedmioty lub potencjalnie 10 z 1000? Czy potrzebujesz zmiennej kolejki priorytetowej lub niezmiennej? Czy możesz wymienić niektóre obsługiwane operacje i pożądaną złożoność obliczeniową? Czy potrzebujesz obsługiwać operacje w czasie rzeczywistym, czy amortyzujesz O (1) do zaakceptowania? itp. – Juliet
Czy są to ustalone priorytety i jaki jest ich zakres? – RBarryYoung
@ Julia: Ha. Pytam ludzi w wywiadach "Jak zaimplementować priorytetową kolejkę?" cały czas. Większość ludzi to załatwia, ale nigdy nie pytają o zakres priorytetów, liczbę przedmiotów ani to, jakie operacje kosztowe muszą mieć. Ty, mój przyjacielu, jesteś zatrudniony! :) –