aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs
diff options
context:
space:
mode:
authorjhorv <38920027+jhorv@users.noreply.github.com>2023-03-11 15:05:48 -0500
committerGitHub <noreply@github.com>2023-03-11 17:05:48 -0300
commit23c844b2aa84a65e573dcc023d19b8f5294a8baf (patch)
treebf9d41ee0f94b833bb52b6b0016ca99a991cd441 /Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs
parent81691b9e3716c7f7f8b243f0f4ded1d90c526a4e (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.cs23
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;