Pipelining vs Dosierung bei Stackexchange.Redis

Ich versuche zu legen, die eine große(-ish) Anzahl der Elemente in der kürzest möglichen Zeit und ich habe versucht, diese beiden alternativen:

1) Pipelining:

List<Task> addTasks = new List<Task>();
for (int i = 0; i < table.Rows.Count; i++)
{
    DataRow row = table.Rows[i];
    Task<bool> addAsync = redisDB.SetAddAsync(string.Format(keyFormat, row.Field<int>("Id")), row.Field<int>("Value"));
    addTasks.Add(addAsync);
}
Task[] tasks = addTasks.ToArray();
Task.WaitAll(tasks);

2) Dosierung:

List<Task> addTasks = new List<Task>();
IBatch batch = redisDB.CreateBatch();
for (int i = 0; i < table.Rows.Count; i++)
{
    DataRow row = table.Rows[i];
    Task<bool> addAsync = batch.SetAddAsync(string.Format(keyFormat, row.Field<int>("Id")), row.Field<int>("Value"));
    addTasks.Add(addAsync);
}
batch.Execute();
Task[] tasks = addTasks.ToArray();
Task.WaitAll(tasks);

Ich bin nicht bemerken keine signifikante Zeitdifferenz (eigentlich habe ich erwartet, dass die batch-Methode schneller zu sein): für ca 250K-Einsätze, die ich bekommen ca 7 sec für pipelining vs ca 8 sec für die Batchverarbeitung.

Lesung aus der Dokumentation auf pipelining,

"Mit pipelining ermöglicht es uns, sowohl die Anforderungen an das Netzwerk
sofort, wodurch die meisten die Latenz. Darüber hinaus wird es auch
hilft bei der Reduzierung Paket-Fragmentierung: 20 Anfragen individuell
(Wartezeit für jede Antwort), benötigen Sie mindestens 20 Pakete, aber 20
Anfragen, die gesendet werden in eine Rohrleitung, die passen könnte in viel weniger Pakete (vielleicht
sogar nur eins)."

Mir, das klingt wie eine Menge, die eine Dosierungs-Verhalten. Ich Frage mich, ob hinter den kulissen, es gibt einen großen Unterschied zwischen den beiden, da bei einem einfachen check mit procmon ich sehe fast die gleiche Anzahl von TCP Sends auf beiden Versionen.

InformationsquelleAutor CyberDude | 2015-01-06
Schreibe einen Kommentar