我已經開始嘗試創建以下玩耍:優化批量大小
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