From 87e2d7f75a23b2dc2aad5fadca2ccc5e6c94db23 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Fri, 15 Apr 2016 12:59:45 +0200
Subject: [PATCH] improve lookup time for full-load curves

---
 .../SimulationComponent/Data/FullLoadCurve.cs | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs
index 3be1412483..6b46f9eca9 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs
@@ -51,6 +51,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 
 		[Required, ValidateObject] internal List<FullLoadCurveEntry> FullLoadEntries;
 
+		private SortedList<PerSecond, int> _quickLookup;
+
 		[Required] internal LookupData<PerSecond, Second> PT1Data;
 
 		/// <summary>
@@ -223,7 +225,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 			if (angularVelocity > FullLoadEntries.Last().EngineSpeed) {
 				return FullLoadEntries.Count - 1;
 			}
-			for (var index = 1; index < FullLoadEntries.Count; index++) {
+
+			if (_quickLookup == null) {
+				_quickLookup = new SortedList<PerSecond, int>();
+				var i = 10;
+				for (; i < FullLoadEntries.Count; i += 10) {
+					_quickLookup.Add(FullLoadEntries[i].EngineSpeed, Math.Max(1, i - 10));
+				}
+				_quickLookup.Add(FullLoadEntries.Last().EngineSpeed + 0.1.SI<PerSecond>(), Math.Max(1, i - 10));
+			}
+			var start = 1;
+			foreach (var lookup in _quickLookup.Where(lookup => angularVelocity < lookup.Key)) {
+				start = lookup.Value;
+				break;
+			}
+
+			for (var index = start; index < FullLoadEntries.Count; index++) {
 				if (angularVelocity >= FullLoadEntries[index - 1].EngineSpeed &&
 					angularVelocity <= FullLoadEntries[index].EngineSpeed) {
 					return index;
-- 
GitLab