Я начал играть с попыткой создать следующее:Оптимизация размера партии на основе истекшего времени между последовательными вызовами
public static IEnumerable<List<T>> OptimizedBatches<T>(this IEnumerable<T> items)
Затем клиент этого метода расширения будет использовать его как это:
foreach (var list in extracter.EnumerateAll().OptimizedBatches())
{
// at some unknown batch size, process time starts to
// increase at an exponential rate
}
Вот пример:
batch length time
1 100ms
2 102ms
4 110ms
8 111ms
16 118ms
32 119ms
64 134ms
128 500ms <-- doubled length but time it took more than doubled
256 1100ms <-- oh no!!
Исходя из вышеизложенного, лучшая длина пакетная 64, потому что 64/134 - наилучшее соотношение длины/времени.
Итак, вопрос в том, какой алгоритм использовать для автоматического выбора оптимальной длины партии на основе последовательных времен между шагами итератора?
Вот что я до сих пор - это еще не сделано ...
class LengthOptimizer
{
private Stopwatch sw;
private int length = 1;
private List<RateRecord> rateRecords = new List<RateRecord>();
public int Length
{
get
{
if (sw == null)
{
length = 1;
sw = new Stopwatch();
}
else
{
sw.Stop();
rateRecords.Add(new RateRecord { Length = length, ElapsedMilliseconds = sw.ElapsedMilliseconds });
length = rateRecords.OrderByDescending(c => c.Rate).First().Length;
}
sw.Start();
return length;
}
}
}
struct RateRecord
{
public int Length { get; set; }
public long ElapsedMilliseconds { get; set; }
public float Rate { get { return ((float)Length)/ElapsedMilliseconds; } }
}
Не могли бы вы разъяснить на то, что «оптимальная длина партии» означает к вашей проблеме? – Romoku
Я пытаюсь получить лучшее соотношение длины/времени –
Вы оптимизируетесь по длине или времени? – Romoku