posts - 185,  comments - 1070,  trackbacks - 43

       这段时间在编写基于CodeDom动太操作对象属性的组件,为了证明一下效率于是和反射操作进行简单的测试比较。测试主要分为两部分:属性设置和属性获取。分别测试了硬编码、CodeDom动态调和反射三种情况比较。

       属性设置测试:

              测试代码:

                     Console.SetOut(new System.IO.StreamWriter("c:\\Test.log"));

            NorthWind.Entities.Employees emp = new NorthWind.Entities.Employees();

            PropertyInfo id = typeof(NorthWind.Entities.Employees).GetProperty("EmployeeID");

            PropertyInfo fn = typeof(NorthWind.Entities.Employees).GetProperty("FirstName");

            DynamicInvokes.PropertyCollection pas = DynamicInvokes.Invoker.GetProperties(typeof(NorthWind.Entities.Employees));

            System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();

            emp.FirstName = "FAN";

           

            for (int i = 0; i < 10; i++)

            {

                Console.WriteLine("-------------------------属性设置("+i+")---------------------------");

                watch.Reset();

                watch.Start();

                emp.EmployeeID = 2;

                watch.Stop();

                Console.WriteLine("更编码:\t\t" + watch.ElapsedTicks);

 

                watch.Reset();

                watch.Start();

                pas[id][emp] = 2;

                watch.Stop();

                Console.WriteLine( "CodeDom:\t" + watch.ElapsedTicks);

 

                watch.Reset();

                watch.Start();

                id.SetValue(emp, 2, null);

                watch.Stop();

                Console.WriteLine( "反射:\t\t" + watch.ElapsedTicks);

               

             

 

               

            }

              测试结果(1100毫微秒,不要头尾结果)

-------------------------属性设置(1)---------------------------

更编码:          69

CodeDom:      117

反射:             100

-------------------------属性设置(2)---------------------------

更编码:          70

CodeDom:      71

反射:             94

-------------------------属性设置(3)---------------------------

更编码:          73

CodeDom:      70

反射:             96

-------------------------属性设置(4)---------------------------

更编码:          65

CodeDom:      70

反射:             92

-------------------------属性设置(5)---------------------------

更编码:          66

CodeDom:      70

反射:             96

-------------------------属性设置(6)---------------------------

更编码:          67

CodeDom:      70

反射:             95

-------------------------属性设置(7)---------------------------

更编码:          68

CodeDom:      70

反射:             93

-------------------------属性设置(8)---------------------------

更编码:          68

CodeDom:      71

反射:             94

 

属性获取测试:

       测试代码:

               object getvalue;

            for (int i = 0; i < 10; i++)

            {

                Console.WriteLine("-------------------------获取设置(" + i + ")---------------------------");

                watch.Reset();

                watch.Start();

                getvalue = emp.FirstName;

                watch.Stop();

                Console.WriteLine("更编码:\t\t" + watch.ElapsedTicks);

 

                watch.Reset();

                watch.Start();

                getvalue = pas[fn][emp];

                watch.Stop();

                Console.WriteLine("CodeDom:\t" + watch.ElapsedTicks);

 

                watch.Reset();

                watch.Start();

                getvalue= fn.GetValue(emp, null);

                watch.Stop();

                Console.WriteLine("反射:\t\t" + watch.ElapsedTicks);

 

            }

       测试结果(1100毫微秒,不要头尾结果)

-------------------------获取设置(1)---------------------------

更编码:          69

CodeDom:      113

反射:             90

-------------------------获取设置(2)---------------------------

更编码:          68

CodeDom:      75

反射:             88

-------------------------获取设置(3)---------------------------

更编码:          68

CodeDom:      69

反射:             88

-------------------------获取设置(4)---------------------------

更编码:          69

CodeDom:      72

反射:             88

-------------------------获取设置(5)---------------------------

更编码:          68

CodeDom:      72

反射:             90

-------------------------获取设置(6)---------------------------

更编码:          69

CodeDom:      73

反射:             90

-------------------------获取设置(7)---------------------------

更编码:          67

CodeDom:      72

反射:             88

-------------------------获取设置(8)---------------------------

更编码:          66

CodeDom:      73

反射:             87

 

 

根据lone描述场景测试结果:

       测试代码

             for (int i = 0; i < 10; i++)

            {

                Console.WriteLine("-------------------------硬编码属性设置(" + i + ")---------------------------");

                watch.Reset();

                watch.Start();

                for (int k = 0; k < 1000; k++)

                {

                    emp = new NorthWind.Entities.Employees();

                    emp.EmployeeID = k;

                    emp.FirstName ="henry" + k;

                }

                watch.Stop();

                Console.WriteLine(watch.ElapsedTicks);

 

            }

 

 for (int i = 0; i < 10; i++)

            {

                Console.WriteLine("-------------------------CodeDom属性设置(" + i + ")---------------------------");

                watch.Reset();

                watch.Start();

                for (int k = 0; k < 1000; k++)

                {

                    emp = new NorthWind.Entities.Employees();

                    pas[id][emp] = k;

                    pas[fn][emp] = "henry" + k;

                }

                watch.Stop();

                Console.WriteLine(watch.ElapsedTicks);

 

            }

 

            for (int i = 0; i < 10; i++)

            {

                Console.WriteLine("-------------------------反射属性设置(" + i + ")---------------------------");

                watch.Reset();

                watch.Start();

                for (int k = 0; k < 1000; k++)

                {

                    emp = new NorthWind.Entities.Employees();

                    id.SetValue(emp, k, null);

                    fn.SetValue(emp, "henry" + k, null);

                }

                watch.Stop();

                Console.WriteLine(watch.ElapsedTicks);

 

            }

       测试结果(1100毫微秒,不要头尾结果)

------------------------属性设置(1)---------------------------

3864硬编码

8249 CodeDom

36580反射

-------------------------属性设置(2)---------------------------

3770 硬编码

8259 CodeDom

38693 反射

-------------------------属性设置(3)---------------------------

3803 硬编码

8569 CodeDom

36047 反射

-------------------------属性设置(4)---------------------------

3780 硬编码

8404 CodeDom

36452 反射

-------------------------属性设置(5)---------------------------

3755 硬编码

8253 CodeDom

44152 反射

-------------------------属性设置(6)---------------------------

3896 硬编码

13130 CodeDom

34827 反射

-------------------------属性设置(7)---------------------------

3782 硬编码

8321 CodeDom

34637 反射

-------------------------属性设置(8)---------------------------

3864 硬编码

8360 CodeDom

40850 反射

 

 

posted on 2006-10-13 12:56 henry 阅读(1817) 评论(4)  编辑 收藏 网摘

FeedBack:
2006-10-13 15:55 | lone[未注册用户]
一般来说我们需要的不是这样的操作:
1000次设置或者读取某个 Property

而是:
循环创建一个对象,并动态设置值

ex:
for (int i=0 ; i<1000;i++)
{
Employee employee = new Employee();
employee.Id = i;
employee.Name = "";
}

好像做你这样的循环设置某一对象值的测试意义不是太大吧?

  回复  引用    
2006-10-13 16:02 | lone[未注册用户]
ex:
for (int i=0 ; i<1000;i++)
{
Employee employee = new Employee();
employee.Id = i;
employee.Name = "";
}

or

for (int i=0 ; i<1000;i++)
{
Employee employee = new Employee();
id.SetValue(emp, 2, null);
usernam.SetValue(emp, 2, null);
}
这样的对比不是更有意义?


  回复  引用    
#3楼[楼主]
2006-10-13 16:20 | henry      
@lone
是的,其实我只要相关测试两种方式的效率上的差别。
你描述的更符合实际应用场景。
根据你描述的用例补充结果。

  回复  引用  查看    
2006-10-13 16:40 | lone[未注册用户]
我也很想知道你的结果
呵呵,根据我以前测试的印象
循环三千次,使用反射,codedom 跟直接 赋值
性能差异不大,创建这个Employee对象
Employee employee = new Employee();
就要花费相当的时间
看看得出的结论是什么····

  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 528174




相关文章:

相关链接:
<2006年10月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

与我联系

搜索

 

常用链接

留言簿

我参加的小组

我的标签

随笔分类

最新评论

60天内阅读排行