Я разрабатываю часть программного обеспечения, где у меня есть список (List<Sample>
в данный момент) образцов, как следующее:Является ли IEnumerable.Max() самым быстрым способом?
public class Sample
{
//...
public double ValueChannel1 { get; set; }
public double ValueChannel2 { get; set; }
//...
}
Эти списки имеют между ~ 100 и несколько тысяч этих образцов и есть около 100 тыс. выборок в секунду.
Теперь мне нужно найти максимальное и минимальное значение из каждого из этих списков, которые я делаю следующим образом на данный момент:
var Ch1Max = task.Samples.Max<Sample>(s => s.ValueChannel1);
var Ch1Min = task.Samples.Min<Sample>(s => s.ValueChannel1);
var Ch2Max = task.Samples.Max<Sample>(s => s.ValueChannel2);
var Ch2Min = task.Samples.Min<Sample>(s => s.ValueChannel2);
Чтобы не удивительно, что это не очень быстро, так что я спрашивал себя: если есть что-то быстрее, но я не мог придумать или найти его?
Кто-нибудь знает более быстрый способ сделать это? Может быть, есть способ найти min и max с «одной петлей» вместо одной для min и для max?
Edit:
Я профилированный текущий код со следующими результатами:
731 задач каждый из которых содержит один из этих списков, необходимых для обработки 845ms и 95% что там, где мин/макс поиска.
У меня нет специального «целевого времени», но поскольку это все время работает в моем приложении (поскольку оно захватывает данные измерений), это должно приводить к как можно меньшей загрузке процессора, чтобы максимально снизить требования к оборудованию. .
Лучшее решение найдено:
В конце концов я выбираю soltuion от Тима, как это было даже немного быстрее, чем Konrad из них:
решения Тима вызвало ускорение на ~ 53% и КОНРАДС лет " только "~ 43%.
Окончательное решение (на данный момент):
double Ch1Max = Double.MinValue, Ch1Min = Double.MaxValue;
double Ch2Max = Double.MinValue, Ch2Min = Double.MaxValue;
var samples = task.Samples.ToArray();
int count = samples.Length;
for (int i = 0; i < count; ++i)
{
var valueChannel1 = samples[i].ValueChannel1; // get only once => faster
if (valueChannel1 > Ch1Max) Ch1Max = valueChannel1;
if (valueChannel1 < Ch1Min) Ch1Min = valueChannel1;
var valueChannel2 = samples[i].ValueChannel2;
if (valueChannel2 > Ch2Max) Ch2Max = valueChannel2;
if (valueChannel2 < Ch2Min) Ch2Min = valueChannel2;
}
Это подводит к скорости план ~ 70% по сравнению с моим исходным раствором ...
Как медленно «не очень быстро»? Вы это оценили? – Arran
Отсутствие каких-либо специфических особенностей по времени/целевому времени? – Voidpaw
Есть способ найти их в одном цикле. Прокрутите их и отслеживайте минимальное и максимальное значение. – MAV