C# нуб вопрос по производительности
Почему такой код работает значительно дольшекода внутри цикла больше, он хуже влазит целиком в кэш процессора.
4/2 List.Add
4/2 List.Addне понял что ты имел ввиду.
что ты, вообще, кстати хочешь сделать? прореживание? оставить от интервала только min/max, сохранив порядок их появления?
Если ты гоняешь релиз, то ответ очевиден, на самом деле. Во втором варианте flagmaxfirst компилятор считает равным false и поэтому вообще его не проверяет. То есть из цикла выпадают два условия, что должно сильно влиять на работу конвейера.
что ты, вообще, кстати хочешь сделать? прореживание? оставить от интервала только min/max, сохранив порядок их появления?Именно так.
Раздробить входной список на одинаковые интервалы, взять min max в интервалах и добавить в выходной список сохраняя порядок.
Можешь посоветовать как лучше в С# такое реализовать?
Можно еще повыжимать производительность по мелочи: использовать массивы вместо List-а, отдельно обрабатывать (вне цикла) хвостовой интервал и т.д.
public static List<double> ResamplingDown(List<double> values, int count_limit)
{
var result = new List<double>(count_limit); //заранее выделяем память под list
var interval_len = values.Count / (count_limit / 2);
if (interval_len * (count_limit / 2) < values.Count)
interval_len++;
for (var i = 0; i < values.Count; )
{
var interval_end = i + interval_len;
if (values.Count < interval_end)
interval_end = values.Count;
var min = values[i];
var max = values[i];
var isMaxFirst = false;
//выносим по максимуму код из под внутреннего цикла
for (++i; i < interval_end; ++i)
{
var v = values[i];
if (v > max)
{
max = v;
isMaxFirst = false;
}
else if (v < min)
{
min = v;
isMaxFirst = true;
}
}
if (isMaxFirst)
{
result.Add(max);
result.Add(min);
}
else
{
result.Add(min);
result.Add(max);
}
}
return result;
}
про вынос из внутреннего цикла я бы врядли допер.
Оставить комментарий
Kent1331
Почему такой код работает значительно дольшечем этот код
Разница во времени нескольких раз. из-за флага компилятор не может оптимизировать?
Подскажите как оптимальнее всего написать подобную функцию.