/// <summary> /// 创建对象 /// </summary> /// <param name="name">测试名称</param> /// <param name="threads">线程数</param> /// <param name="iteration">循环数</param> /// <param name="action">测试方法</param> public static void Time(string name, int threads, int iteration, Action action) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("{0} {1}", name, DateTime.Now.ToString("yyyy-M-d hh:mm:ss")); Console.ForegroundColor = ConsoleColor.White; action(); Thread.Sleep(1); // WorkerStat[] statArray = new WorkerStat[threads]; Task[] taskArray = new Task[threads]; WorkerStat mainStat = new WorkerStat { RunCount = threads * iteration }; DateTime before = DateTime.Now; //Stopwatch watch = Stopwatch.StartNew(); for (int i = 0; i < threads; i++) { statArray[i] = new WorkerStat() { RunCount = iteration }; taskArray[i] = Task.Factory.StartNew(new TaskExt(statArray[i], action).Run); } Task.WaitAll(taskArray); TimeSpan timeTaken = DateTime.Now - before; //watch.Stop(); mainStat.Timespan = (long)timeTaken.TotalMilliseconds; WorkerStat totalStat = new WorkerStat(); for (int i = 0; i < threads; i++) { totalStat.RunCount = totalStat.RunCount + statArray[i].RunCount; totalStat.Timespan = totalStat.Timespan + statArray[i].Timespan; } //--- DisplayTestResult(name, threads, iteration, mainStat, totalStat); }
/// <summary> /// 显示测试结果 /// </summary> /// <param name="name"></param> /// <param name="threads"></param> /// <param name="iteration"></param> /// <param name="mainStat"></param> /// <param name="totalStat"></param> private static void DisplayTestResult(string name, int threads, int iteration, WorkerStat mainStat, WorkerStat totalStat) { Console.ForegroundColor = ConsoleColor.White; Display(StringPadLeft("TestName:" + name) + StringPadLeft("threads:" + threads) + StringPadLeft("iteration:" + iteration)); Display(""); //--- Display("Test over!!"); //--- if (mainStat.Timespan == 0 || totalStat.Timespan == 0) { Display("mainStat.Timespan=0 or totalStat.Timespan = 0 测试数据太少!!"); return; } //--- Display("-------Test Result-------"); Display(StringPadLeft("Total Thread") + StringPadLeft("Total Count") + StringPadLeft("Total Time(ms)") + StringPadLeft("TPS")); Console.ForegroundColor = ConsoleColor.Red; Display(StringPadLeft(threads) + StringPadLeft(mainStat.RunCount) + StringPadLeft(mainStat.Timespan) + StringPadLeft(Math.Round(1000 * (mainStat.RunCount / (double)mainStat.Timespan)))); Console.ForegroundColor = ConsoleColor.White; Display("--------------------------------END--------------------------------"); return; #region 显示详细信息 //显示详细信息 Display("Detail Info:"); Display("--------------Total WorkerStat"); Display(StringPadLeft("Thread(" + threads + ")") + StringPadLeft("runs") + StringPadLeft("time(ms)")); Display(StringPadLeft("Total") + StringPadLeft(totalStat.RunCount) + StringPadLeft(totalStat.Timespan)); Display(StringPadLeft("Avg") + StringPadLeft(iteration) + StringPadLeft(totalStat.Timespan / threads)); Display(StringPadLeft("TPS") + StringPadLeft("--") + StringPadLeft(1000 * (totalStat.RunCount / (double)totalStat.Timespan))); Display("--------------Main WorkerStat"); Display(StringPadLeft("Main") + StringPadLeft(mainStat.RunCount) + StringPadLeft(mainStat.Timespan)); Display(StringPadLeft("TPS") + StringPadLeft("--") + StringPadLeft(1000 * (mainStat.RunCount / (double)mainStat.Timespan))); Display("--------------------------------END--------------------------------"); #endregion }
public TaskExt(WorkerStat workerStat, Action action) { _workerStat = workerStat; _action = action; }