标题: 使用性能计数器检测应用程序的性能!
- zhanqiangz(闲云野鹤) 2007-04-12 22:54 阅读:2649
- 评论:6 查看评论 | 添加评论
 1. 创建一个简单的web service,这个演示程序就是把客户端对web service中的两个webmethod总访问量,每秒访问量,总出错次数,每秒出错次数以及调用延迟的情况在性能计数器中显示出来,web service中的代码相当简单,事实上基本上看不到延迟的存在,这也只是为了演示用。
 1[图片]using System;
 2[图片]using System.Web;
 3[图片]using System.Web.Services;
 4[图片]using System.Web.Services.Protocols;
 5[图片]
 6[图片][WebService(Namespace = "http://tempuri.org/")]
 7[图片][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 8[图片]public class Service : System.Web.Services.WebService
 9[图片][图片][图片]{
10[图片][图片]    public Service () [图片]{
11[图片]
12[图片]        //Uncomment the following line if using designed components 
13[图片]        //InitializeComponent(); 
14[图片]    }
15[图片]
16[图片]    [WebMethod]
17[图片][图片]    public string SayHelloTo(string someBody) [图片]{
18[图片]        return "Hello "+someBody;
19[图片]    }
20[图片]    [WebMethod]
21[图片]    public string SayWelcomeTo(string someBody)
22[图片][图片]    [图片]{
23[图片]        return "Welcome, " + someBody;
24[图片]    }
25[图片]    
26[图片]}
27[图片]

2.   创建性能计数器,这里用一个简单的cs文件替代了installer文件,只需用csc命令讲下面的代码编译成exe文件,然后运行exe文件就可以在系统中创建自己的性能计数器。注意:我们并不需要做总访问次数和时间的除法运算来得到每秒的访问次数,PerformanceCounterType枚举类型专门负责这个,详细的信息请查阅msdn.
 1[图片]using System;
 2[图片]using System.Diagnostics;
 3[图片]
 4[图片]namespace ZZQ.Net.Demo
 5[图片][图片][图片]{
 6[图片]    public class Installer
 7[图片][图片]    [图片]{
 8[图片]
 9[图片]        public static void Main()
10[图片][图片]        [图片]{
11[图片]            try
12[图片][图片]            [图片]{
13[图片]                if (PerformanceCounterCategory.Exists("MyPerfCategory"))
14[图片][图片]                [图片]{
15[图片]                    PerformanceCounterCategory.Delete("MyPerfCategory");
16[图片]                }
17[图片]
18[图片]               
19[图片]                CounterCreationDataCollection counterDatas = new CounterCreationDataCollection();
20[图片]
21[图片]                counterDatas.Add(new CounterCreationData("calls total", "number of service calls",
22[图片]                    PerformanceCounterType.NumberOfItems64));
23[图片]                counterDatas.Add(new CounterCreationData("calls / sec", "number of service calls per second.",
24[图片]                    PerformanceCounterType.RateOfCountsPerSecond64));
25[图片]                counterDatas.Add(new CounterCreationData("errors total",
26[图片]                    "number of errors returned form service to the client.",
27[图片]                    PerformanceCounterType.NumberOfItems64));
28[图片]                counterDatas.Add(new CounterCreationData("errors / sec",
29[图片]                    "number of errors returned form service to the client per second.",
30[图片]                    PerformanceCounterType.RateOfCountsPerSecond64));
31[图片]                counterDatas.Add(new CounterCreationData("average processing time",
32[图片]                    "average call processing time in milliseconds.",
33[图片]                    PerformanceCounterType.AverageCount64));
34[图片]                counterDatas.Add(new CounterCreationData("average processing time base", "",
35[图片]                    PerformanceCounterType.AverageBase));
36[图片]                counterDatas.Add(new CounterCreationData("Processing time latency",
37[图片]                    "Processing time in milliseconds.",
38[图片]                    PerformanceCounterType.NumberOfItems32));
39[图片]
40[图片]                PerformanceCounterCategory.Create("MyPerfCategory", "It is just for demonstration purpose!", PerformanceCounterCategoryType.MultiInstance, counterDatas);
41[图片]
42[图片]
43[图片]            }
44[图片]            catch (Exception ex)
45[图片][图片]            [图片]{
46[图片]                Console.WriteLine("Error occurred: " + ex.ToString());
47[图片]            }
48[图片]            Console.ReadLine();
49[图片]        }
50[图片]    }
51[图片]}
52[图片]

3.客户端的代码使用两个timer在tick事件中生成的随机数做循环调用模拟当前的访问量,并且在每次调用的时候更新计数器,代码很简单。
 1[图片]using System;
 2[图片]using System.Collections.Generic;
 3[图片]using System.ComponentModel;
 4[图片]using System.Data;
 5[图片]using System.Drawing;
 6[图片]using System.Text;
 7[图片]using System.Windows.Forms;
 8[图片]using PerformanceCounterDemo.localhost;
 9[图片]using ZZQ.Net.Demo;
10[图片]
11[图片]
12[图片]namespace PerformanceCounterDemo
13[图片][图片][图片]{
14[图片]    public partial class Demo : Form
15[图片][图片]    [图片]{
16[图片]       
17[图片]        public Demo()
18[图片][图片]        [图片]{
19[图片]            InitializeComponent();
20[图片]        }
21[图片]
22[图片]        private void btnHello_Click(object sender, EventArgs e)
23[图片][图片]        [图片]{
24[图片]            timer1.Enabled = true;
25[图片]        }
26[图片]
27[图片]
28[图片]
29[图片]        private void btnWelcome_Click(object sender, EventArgs e)
30[图片][图片]        [图片]{
31[图片]            timer2.Enabled = true;
32[图片]        }
33[图片]
34[图片]        private void btnStop_Click(object sender, EventArgs e)
35[图片][图片]        [图片]{
36[图片]
37[图片]            timer1.Enabled = false;
38[图片]            timer2.Enabled = false;
39[图片]        }
40[图片]        private void timer1_Tick(object sender, EventArgs e)
41[图片][图片]        [图片]{
42[图片]            Random r = new Random();
43[图片]            int counter = r.Next(30);
44[图片]            CallHello(counter);
45[图片]
46[图片]        }
47[图片]
48[图片]        private void timer2_Tick(object sender, EventArgs e)
49[图片][图片]        [图片]{
50[图片]            Random r = new Random();
51[图片]            int counter = r.Next(30);
52[图片]            CallWelcome(counter);
53[图片]        }
54[图片]
55[图片]
56[图片]        private void CallHello(int counter)
57[图片][图片]        [图片]{
58[图片]            Service s = new Service();
59[图片]            string strResult = string.Empty;
60[图片]            for (int i = 0; i < counter; i++)
61[图片][图片]            [图片]{
62[图片]                DateTime start = DateTime.Now;
63[图片]                strResult += "The " + i.ToString() + " time,return value is " + s.SayHelloTo("zzq" + i.ToString()) + "\r\n";
64[图片]                txtHello.Text = strResult;
65[图片]               TimeSpan span = DateTime.Now.Subtract(start);
66[图片]               PensPerfCounterManager.UpdatePerfCounters("MyPerfCategory", "SayHelloTo", span, true);
67[图片]             
68[图片]            }
69[图片]        }
70[图片]        private void CallWelcome(int counter)
71[图片][图片]        [图片]{
72[图片]            Service s = new Service();
73[图片]            string strResult = string.Empty;
74[图片]
75[图片]            for (int i = 0; i < counter; i++)
76查看评论 | 添加评论
返回顶部 | 返回首页