Nej helt rätt SignalR och transport är ju den största boven i prestandan. Men, då det är en eventdriven design vill jag att den ska vara så snål det går på overhead, men jo det kan vara snudd på suboptimering detta.
Citat:
Att mäta hur många events du får på en viss tid mäter ju inte riktigt skalbarheten då du bara mäter den del där du inte har några lås medan de trådar som lägger till / tar bort prenumerationer inte alls tas i beaktande. Absolut bäst testresultat skulle du ju då få om enbart trådarna som kör () => handler(new MembersEvent()) får CPU-tid,
Helt sant, där av om du kollar den bortkommenterade koden
//for (var i = 0; i < 100; i++)
//{
// eventProxy.Subscribe(CreateHubContext(), typeName, new string[0], null, null);
//}
Där testade jag bara Handle på fyra trådar och lät subscribers vara statiskt till 100 (jag tog bort koden som trådade subscribe). Det testet som är commitat till git är mer för att försöka vara likt verkligheten vilket inte är lätt att simulera eller bencha. Saken är att den skalar inte så bra varken vid statiskt antal subscribe eller trådad subscribe
Helt sant att de borde vara volatile, men då de inte påverkar Benchmarket spelar den ingen större roll för mätvärdet.. men helt klart nått jag ska fixa.
Lol, code review at its best, hade helt missat att den var dubbeldeklarerad, kan förklara varför Resharper test runner gav helt andra tider än Console.Writlline som använder egen mätteknik. Good catch, will fix.
Jo, jag testade faktiskt även med explicita trådar men då det inte påverkade benchen så glömde jag att låta det vara kvar (Har ändrat testet så många ggr). Samt att den borde bara påverka om du har saker som tar lång tid, jag har ju helt stubbad bort SignalR så det enda jag testar är dataklassaserna och trådlogiken.
Benchmarken fungerar såhär
var timer = new System.Timers.Timer(benchmarkTime.TotalMilliseconds);
timer.Elapsed += (s, e) => reset.Set();
var start = DateTime.Now;
timer.Start();
reset.WaitOne();
running = false;
Console.WriteLine("Catched events: {0} in {1}", events.Count, DateTime.Now - start);
Jag har en timer som flaggar för maintråden att avsluta testet, med den stora mätmängden (20 sekunder) borde det inte påverka mätresultatet.