diff options
author | jhorv <38920027+jhorv@users.noreply.github.com> | 2023-03-11 15:05:48 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-11 17:05:48 -0300 |
commit | 23c844b2aa84a65e573dcc023d19b8f5294a8baf (patch) | |
tree | bf9d41ee0f94b833bb52b6b0016ca99a991cd441 /Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs | |
parent | 81691b9e3716c7f7f8b243f0f4ded1d90c526a4e (diff) |
Misc performance tweaks (#4509)1.1.657
* use Array.Empty() where instead of allocating new zero-length arrays
* structure for loops in a way that the JIT will elide array/Span bounds checking
* avoiding function calls in for loop condition tests
* avoid LINQ in a hot path
* conform with code style
* fix mistake in GetNextWaitingObject()
* fix GetNextWaitingObject() possibility of returning null if all list items have TimePoint == long.MaxValue
* make GetNextWaitingObject() behave FIFO behavior for multiple items with the same TimePoint
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs')
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs b/Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs index 020048f4..030a314f 100644 --- a/Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs +++ b/Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs @@ -1,7 +1,6 @@ using Ryujinx.Common; using System; using System.Collections.Generic; -using System.Linq; using System.Threading; namespace Ryujinx.HLE.HOS.Kernel.Common @@ -86,7 +85,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Common { Interlocked.Exchange(ref _enforceWakeupFromSpinWait, 0); - next = _waitingObjects.OrderBy(x => x.TimePoint).FirstOrDefault(); + next = GetNextWaitingObject(); } if (next != null) @@ -140,6 +139,26 @@ namespace Ryujinx.HLE.HOS.Kernel.Common } } + private WaitingObject GetNextWaitingObject() + { + WaitingObject selected = null; + + long lowestTimePoint = long.MaxValue; + + for (int index = _waitingObjects.Count - 1; index >= 0; index--) + { + WaitingObject current = _waitingObjects[index]; + + if (current.TimePoint <= lowestTimePoint) + { + selected = current; + lowestTimePoint = current.TimePoint; + } + } + + return selected; + } + public static long ConvertNanosecondsToMilliseconds(long time) { time /= 1000000; |