using System;
using System.Web;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;
namespace MYORM.COMMON
{
public interface IAction
{
void Action();
}
public static class CodeTimer
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetThreadTimes(IntPtr hThread, out long lpCreationTime,
out long lpExitTime, out long lpKernelTime, out long lpUserTime);
[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentThread();
public delegate void ActionDelegate();
private static long GetCurrentThreadTimes()
{
long l;
long kernelTime, userTimer;
GetThreadTimes(GetCurrentThread(), out l, out l, out kernelTime,
out userTimer);
return kernelTime + userTimer;
}
static CodeTimer()
{
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
Thread.CurrentThread.Priority = ThreadPriority.Highest;
}
public static void Time(string name, int iteration, ActionDelegate action)
{
if (String.IsNullOrEmpty(name))
{
return;
}
if (action == null)
{
return;
}
//1. Print name
//ConsoleColor currentForeColor = Console.ForegroundColor;
//Console.ForegroundColor = ConsoleColor.Yellow;
//Console.WriteLine(name);
HttpContext.Current.Response.Write(""+name+" ");
// 2. Record the latest GC counts
//GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.Collect(GC.MaxGeneration);
int[] gcCounts = new int[GC.MaxGeneration + 1];
for (int i = 0; i <= GC.MaxGeneration; i++)
{
gcCounts[i] = GC.CollectionCount(i);
}
// 3. Run action
Stopwatch watch = new Stopwatch();
watch.Start();
long ticksFst = GetCurrentThreadTimes(); //100 nanosecond one tick
for (int i = 0; i < iteration; i++) action();
long ticks = GetCurrentThreadTimes() - ticksFst;
watch.Stop();
// 4. Print CPU
// Console.ForegroundColor = currentForeColor;
HttpContext.Current.Response.Write("全部耗时:tt" +watch.ElapsedMilliseconds.ToString("N0") + "ms ");
HttpContext.Current.Response.Write("执行一次耗时:" +(watch.ElapsedMilliseconds / iteration).ToString("N0") + "ms ");
// HttpContext.Current.Response.Write("CPU time:tt" + (ticks * 100).ToString("N0") + "ns ");
// HttpContext.Current.Response.Write("CPU time (one time):t" + (ticks * 100 / iteration).ToString("N0") + "ns ");
// 5. Print GC
//for (int i = 0; i <= GC.MaxGeneration; i++)
//{
// int count = GC.CollectionCount(i) - gcCounts[i];
// HttpContext.Current.Response.Write("tGen " + i + ": ttt" + count + " ");
//}
HttpContext.Current.Response.Write("
");
}
public static void Time(string name, int iteration, IAction action)
{
if (String.IsNullOrEmpty(name))
{
return;
}
if (action == null)
{
return;
}
//1. Print name
// ConsoleColor currentForeColor = Console.ForegroundColor;
//Console.ForegroundColor = ConsoleColor.Yellow;
HttpContext.Current.Response.Write(name+" ");
// 2. Record the latest GC counts
//GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.Collect(GC.MaxGeneration);
int[] gcCounts = new int[GC.MaxGeneration + 1];
for (int i = 0; i <= GC.MaxGeneration; i++)
{
gcCounts[i] = GC.CollectionCount(i);
}
// 3. Run action
Stopwatch watch = new Stopwatch();
watch.Start();
long ticksFst = GetCurrentThreadTimes(); //100 nanosecond one tick
for (int i = 0; i < iteration; i++) action.Action();
long ticks = GetCurrentThreadTimes() - ticksFst;
watch.Stop();
// 4. Print CPU
//Console.ForegroundColor = currentForeColor;
HttpContext.Current.Response.Write("tTime Elapsed:tt" +
watch.ElapsedMilliseconds.ToString("N0") + "ms ");
HttpContext.Current.Response.Write("tTime Elapsed (one time):" +
(watch.ElapsedMilliseconds / iteration).ToString("N0") + "ms ");
HttpContext.Current.Response.Write("tCPU time:tt" + (ticks * 100).ToString("N0") + "ns ");
Console.WriteLine("tCPU time (one time):t" + (ticks * 100 /
iteration).ToString("N0") + "ns");
// 5. Print GC
for (int i = 0; i <= GC.MaxGeneration; i++)
{
int count = GC.CollectionCount(i) - gcCounts[i];
HttpContext.Current.Response.Write("tGen " + i + ": ttt" + count+" ");
}
}
}
}
|