using System; using IvyBus; using System.Threading; using System.Globalization; using System.Collections.Specialized; namespace IvyPerf { /// /// Description résumée de IvyPerf. /// mesure des perfo de round trip entre deux applis /// class IvyPerf { static Ivy bus; static double origin = 0; static int nbMsgReceive = 0; static int nbMsgEmit = 0; static int nbMsg = 10; static double minRoundTrip = 1e12; static double maxRoundTrip = 0; static double averageRoundTrip = 0; static double currentTime() // en ms { double time; time = (double)(DateTime.Now.Ticks) / (double)(TimeSpan.TicksPerMillisecond); //time = Environment.TickCount; return time; } [IvyBinding("^ping ts=(.*)")] static void Reply(object sender, IvyMessageEventArgs args) { bus.SendMsg("pong ts={0} tr={1}", args[0], currentTime() - origin ); } [IvyBinding("^pong ts=(.*) tr=(.*)")] static void Pong(object sender, IvyMessageEventArgs args) { nbMsgReceive++; double current = currentTime() - origin; double ts = double.Parse(args[0], bus.Culture ); double tr = double.Parse(args[1], bus.Culture ); double roundtrip1 = tr - ts; double roundtrip2 = current - tr; double roundtrip3 = current - ts; if (roundtrip3 > 50) Console.WriteLine("slow roundtrip[{0}] min {1} av {2} max {3} ms slow={4}", nbMsgReceive, minRoundTrip, averageRoundTrip, maxRoundTrip, roundtrip3); if (roundtrip3 > maxRoundTrip) { maxRoundTrip = roundtrip3; } if ( roundtrip3 < minRoundTrip ) { minRoundTrip = roundtrip3; } averageRoundTrip = (averageRoundTrip * ( nbMsgReceive - 1 ) + roundtrip3) /nbMsgReceive; if ( nbMsg == nbMsgReceive ) { Console.WriteLine("roundtrip[{0}] min {1} av {2} max {3} ms\n", nbMsgReceive, minRoundTrip, averageRoundTrip, maxRoundTrip); //bus->Stop(); } } /// /// Point d'entrée principal de l'application. /// [STAThread] static void Main(string[] args) { int timeout = 200; if (args.Length > 0) timeout = int.Parse(args[0]); if (args.Length > 1) nbMsg = int.Parse(args[1]); bus = new Ivy("IvyPerf", "IvyPref ready"); bus.SentMessageFilter.Add("ping"); bus.SentMessageFilter.Add("pong"); bus.SentMessageFilter.Add("IvyPref"); bus.BindingFilter += new EventHandler(bus_BindingFilter); //TODO auto generation of testtarget ?? how to //bus.BindMsg("test", testtarget); bus.Start(null); origin = currentTime(); Console.WriteLine("Start Sending {0} messages...", nbMsg); while( true ) { Thread.Sleep( timeout ); int count = bus.SendMsg("ping ts={0}", currentTime() - origin ); if (count != 0) nbMsgEmit++; if (nbMsg == nbMsgEmit) { Console.WriteLine("... {0} messages sent ", nbMsg); Thread.Sleep(timeout); break; } } } static void bus_BindingFilter(object sender, IvyEventArgs e) { Console.WriteLine( "The app {0} regexp {1} was Filtred.", e.Client.ApplicationName,e.Argument); } } }