Optimize siblings getter

This commit is contained in:
ReinUsesLisp 2018-09-23 20:02:59 -03:00
commit a07c4b3156

View file

@ -62,7 +62,7 @@ namespace Ryujinx.Graphics
public TValue CreateOrRecycle(TKey Params) public TValue CreateOrRecycle(TKey Params)
{ {
LinkedList<TValue> Siblings = GetOrAddEntry(Params); LinkedList<TValue> Siblings = GetOrAddSiblings(Params);
foreach (TValue RecycledValue in Siblings) foreach (TValue RecycledValue in Siblings)
{ {
@ -119,19 +119,24 @@ namespace Ryujinx.Graphics
} }
} }
private LinkedList<TValue> GetOrAddEntry(TKey Params) private LinkedList<TValue> GetOrAddSiblings(TKey Params)
{ {
foreach ((TKey MyParams, LinkedList<TValue> Resources) Tuple in Entries) LinkedListNode<(TKey, LinkedList<TValue>)> Node = Entries.First;
while (Node != null)
{ {
if (Tuple.MyParams.IsCompatible(Params)) (TKey Params, LinkedList<TValue> Resources) Tuple = Node.Value;
if (Tuple.Params.IsCompatible(Params))
{ {
//Move accessed siblings to the top of the list, for faster access in the future Entries.Remove(Node);
Entries.Remove(Tuple);
Entries.AddFirst(Tuple); Entries.AddFirst(Tuple);
return Tuple.Resources; return Tuple.Resources;
} }
Node = Node.Next;
} }
LinkedList<TValue> Siblings = new LinkedList<TValue>(); LinkedList<TValue> Siblings = new LinkedList<TValue>();