机器环境:
前言
最近实体框架很流行,不过缺点也多,我列一下:
1.不支持sql2000
2.增删改很麻烦,增加,带多个外键的,要查数据库,修改与删除也要查,这样对性能影响大打折扣,而且编码也麻烦,至少比代码生成麻烦
3.linq to entity中,有些语句是不支持的,如intArr.Contains等方法,必需用e-sql query.Where("it.ID IN {1,2,3,4}")才行
4.要支持外键值的话,要用ef2.0,即是.net4.0的平台,.net4.0太庞大了,近两三年应该也用不起来。
所以我还是用普通的ado.net算了。时间很紧迫,项目很乱,而且我还只有一个星期对住一堆超乱的代码进行重构,还不知做不做得来。所以为了解决这个难题,要一步一步验证自己未能确定的问题。
现在我的思路是,代码效率+性能+维护方便
如果牺牲10%-20%的性能,能增加1-2倍的生产效率的话,那我很乐意去做。
ef1.0,好像在100万条数据的情况下,不能满足吧。这种查法,不过现在放弃使用,就暂不做相关的测试了。
正题
最近在研究属于自己的架构,所以有必要做一下这方面的性能测试
主要有两个问题要搞清楚
1.在DAL层里,是否需要共用一个Connection?
2.在赋值过程中,能否通过一个规范来实现接口,然后拿数据,像DataReader赋值的操作,用循环就搞店,不用一行一行属性来赋值。
所以就有两个问题
1.用连接池开关连接与不用连接池开关连接,时间上有多大差异?
2.用索引器的方式赋值,与普通手写代码赋值,时间上又有多大差异?
于是模拟最实际的环境(我想是挺实际的)就用以下在代码来做测试:
是一个控制台应用程序,连接sql2005数据库(开始向sql2005转了,不过现在还在用sql2000,客户要求,没办法的事)
结果如下:
测试用连接池与不用连接池开关连接所用时间:
------------------------------------------------
次数 | 连接池 | 不用连接池 |
1000 | 00:00:00.0781250 | 00:00:03.0156250 |
2000 | 00:00:00 | 00:00:05.9531250 |
3000 | 00:00:00.0156250 | 连接出错 |
4000 | 00:00:00.0312500 | 连接出错 |
5000 | 00:00:00.0312500 | 连接出错 |
6000 | 00:00:00.0468750 | 连接出错 |
7000 | 00:00:00.0468750 | 连接出错 |
8000 | 00:00:00.0468750 | 连接出错 |
9000 | 00:00:00.0468750 | 连接出错 |
10000 | 00:00:00.0625000 | 连接出错 |
11000 | 00:00:00.0625000 | 连接出错 |
12000 | 00:00:00.0625000 | 连接出错 |
13000 | 00:00:00.0781250 | 连接出错 |
14000 | 00:00:00.1093750 | 连接出错 |
15000 | 00:00:00.0937500 | 连接出错 |
16000 | 00:00:00.0937500 | 连接出错 |
17000 | 00:00:00.0937500 | 连接出错 |
18000 | 00:00:00.0937500 | 连接出错 |
19000 | 00:00:00.0937500 | 连接出错 |
20000 | 00:00:00.1093750 | 连接出错 |
------------------------------------------------
------------------------------------------------
------------------------------------------------
测试字符串判断赋值与直接赋值时间比较
------------------------------------------------
次数 | 判断赋值 | 赋值 |
1000 | 00:00:00 | 00:00:00 |
2000 | 00:00:00 | 00:00:00.0156250 |
3000 | 00:00:00.0156250 | 00:00:00 |
4000 | 00:00:00.0156250 | 00:00:00.0156250 |
5000 | 00:00:00 | 00:00:00 |
6000 | 00:00:00.0312500 | 00:00:00.0156250 |
7000 | 00:00:00.0156250 | 00:00:00.0156250 |
8000 | 00:00:00.0156250 | 00:00:00.0156250 |
9000 | 00:00:00.0312500 | 00:00:00.0312500 |
10000 | 00:00:00.0156250 | 00:00:00.0468750 |
11000 | 00:00:00.0312500 | 00:00:00.0312500 |
12000 | 00:00:00.0312500 | 00:00:00.0312500 |
13000 | 00:00:00.0312500 | 00:00:00.0156250 |
14000 | 00:00:00.0312500 | 00:00:00.0156250 |
15000 | 00:00:00.0312500 | 00:00:00.0312500 |
16000 | 00:00:00.0312500 | 00:00:00.0468750 |
17000 | 00:00:00.0312500 | 00:00:00.0312500 |
18000 | 00:00:00.0937500 | 00:00:00.0625000 |
19000 | 00:00:00.0781250 | 00:00:00.0468750 |
20000 | 00:00:00.0625000 | 00:00:00.0625000 |
21000 | 00:00:00.0781250 | 00:00:00.0468750 |
22000 | 00:00:00.0781250 | 00:00:00.0312500 |
23000 | 00:00:00.0468750 | 00:00:00.0781250 |
24000 | 00:00:00.0625000 | 00:00:00.0937500 |
25000 | 00:00:00.0468750 | 00:00:00.0625000 |
26000 | 00:00:00.0937500 | 00:00:00.0781250 |
27000 | 00:00:00.0781250 | 00:00:00.0937500 |
28000 | 00:00:00.0781250 | 00:00:00.0781250 |
29000 | 00:00:00.0781250 | 00:00:00.0937500 |
30000 | 00:00:00.0937500 | 00:00:00.0937500 |
31000 | 00:00:00.1562500 | 00:00:00.0625000 |
32000 | 00:00:00.1250000 | 00:00:00.0781250 |
33000 | 00:00:00.0937500 | 00:00:00.1093750 |
34000 | 00:00:00.0937500 | 00:00:00.0781250 |
35000 | 00:00:00.1562500 | 00:00:00.0937500 |
36000 | 00:00:00.1093750 | 00:00:00.0937500 |
37000 | 00:00:00.1250000 | 00:00:00.0781250 |
38000 | 00:00:00.1093750 | 00:00:00.1093750 |
39000 | 00:00:00.1406250 | 00:00:00.1250000 |
40000 | 00:00:00.1718750 | 00:00:00.0781250 |
41000 | 00:00:00.1250000 | 00:00:00.0937500 |
42000 | 00:00:00.1250000 | 00:00:00.1718750 |
43000 | 00:00:00.1250000 | 00:00:00.1718750 |
44000 | 00:00:00.1250000 | 00:00:00.1718750 |
45000 | 00:00:00.1250000 | 00:00:00.1093750 |
46000 | 00:00:00.2031250 | 00:00:00.1093750 |
47000 | 00:00:00.2031250 | 00:00:00.1093750 |
48000 | 00:00:00.1562500 | 00:00:00.1406250 |
49000 | 00:00:00.1718750 | 00:00:00.1093750 |
50000 | 00:00:00.2187500 | 00:00:00.1250000 |
51000 | 00:00:00.1406250 | 00:00:00.2031250 |
52000 | 00:00:00.1406250 | 00:00:00.1250000 |
53000 | 00:00:00.1562500 | 00:00:00.1562500 |
54000 | 00:00:00.1718750 | 00:00:00.1250000 |
55000 | 00:00:00.1875000 | 00:00:00.1250000 |
56000 | 00:00:00.1562500 | 00:00:00.1562500 |
57000 | 00:00:00.1562500 | 00:00:00.1718750 |
58000 | 00:00:00.1718750 | 00:00:00.1250000 |
59000 | 00:00:00.1875000 | 00:00:00.2031250 |
60000 | 00:00:00.1875000 | 00:00:00.1562500 |
61000 | 00:00:00.1718750 | 00:00:00.1875000 |
62000 | 00:00:00.2031250 | 00:00:00.1562500 |
63000 | 00:00:00.2343750 | 00:00:00.1875000 |
64000 | 00:00:00.2031250 | 00:00:00.2031250 |
65000 | 00:00:00.2656250 | 00:00:00.1562500 |
66000 | 00:00:00.2031250 | 00:00:00.1718750 |
67000 | 00:00:00.2031250 | 00:00:00.2187500 |
68000 | 00:00:00.2812500 | 00:00:00.1562500 |
69000 | 00:00:00.2187500 | 00:00:00.2031250 |
70000 | 00:00:00.2187500 | 00:00:00.2500000 |
71000 | 00:00:00.2343750 | 00:00:00.2812500 |
72000 | 00:00:00.2500000 | 00:00:00.2031250 |
73000 | 00:00:00.2812500 | 00:00:00.2812500 |
74000 | 00:00:00.2343750 | 00:00:00.2031250 |
75000 | 00:00:00.2500000 | 00:00:00.1875000 |
76000 | 00:00:00.2656250 | 00:00:00.2656250 |
77000 | 00:00:00.2968750 | 00:00:00.2187500 |
78000 | 00:00:00.2343750 | 00:00:00.2656250 |
79000 | 00:00:00.2812500 | 00:00:00.2031250 |
80000 | 00:00:00.2812500 | 00:00:00.2968750 |
81000 | 00:00:00.3281250 | 00:00:00.2343750 |
82000 | 00:00:00.3437500 | 00:00:00.2187500 |
83000 | 00:00:00.2968750 | 00:00:00.2031250 |
84000 | 00:00:00.2968750 | 00:00:00.2343750 |
85000 | 00:00:00.2500000 | 00:00:00.2968750 |
86000 | 00:00:00.3281250 | 00:00:00.2500000 |
87000 | 00:00:00.3281250 | 00:00:00.2812500 |
88000 | 00:00:00.3125000 | 00:00:00.2187500 |
89000 | 00:00:00.3125000 | 00:00:00.2187500 |
90000 | 00:00:00.3437500 | 00:00:00.2812500 |
91000 | 00:00:00.3281250 | 00:00:00.2656250 |
92000 | 00:00:00.4062500 | 00:00:00.3593750 |
93000 | 00:00:00.3281250 | 00:00:00.2656250 |
94000 | 00:00:00.2968750 | 00:00:00.2812500 |
95000 | 00:00:00.3906250 | 00:00:00.3437500 |
96000 | 00:00:00.3906250 | 00:00:00.2656250 |
97000 | 00:00:00.3593750 | 00:00:00.3125000 |
98000 | 00:00:00.3437500 | 00:00:00.2968750 |
99000 | 00:00:00.3906250 | 00:00:00.2656250 |
100000 | 00:00:00.3281250 | 00:00:00.2656250 |
------------------------------------------------
就上面来看,我可以得出结论了:
1.DAL不用共享连接,因为开关连接的时间太短可以忽略不计
2.用代码生成的方式生成索引器的代码,然后从dr拿值时,直接while(reader.Read()),再加一循环来拿值就行
因为对比的时间,相差也不大,那1ms,10万次的赋值,不算什么。