PDF.NET开发框架性能剖析

前俩天发布了 关于PDF.NET开发框架对Mysql Sqlite PostgreSQL数据库分页支持的个人看法 ,说明了本人对框架的一些介绍和看法。今天我们一起思考一些问题。

1.装箱与拆箱

EntityBase.cs

 1 private object[] values;
2 /// <summary>
3 /// 属性值列表
4 /// </summary>
5 public virtual object[] PropertyValues
6 {
7 get
8 {
9 if (values == null)
10 {
11 values = new object[PropertyNames.Length];
12 }
13 return values;
14 }
15 protected internal set { values = value; }
16 }

每个实体类对象,一般情况下相当于表中的一行数据。把属性里封装的字段放在数组中,字段有值类型(tinyint int double...) 引用类型,为了满足各种类型只能由object类型出厂,这样会导致值类型频繁进行拆箱(引用类型到值类型--get)/装箱(值类型到引用类型--set)操作.这在一定程度上,对性能造成了损耗。

2.for与foreach

CommonDB.cs

 1 if (parameters != null)
2 for (int i = 0; i < parameters.Length; i++)
3 if (parameters[i] != null)
4 {
5 if (commandType != CommandType.StoredProcedure)
6 {
7 //IDataParameter para = (IDataParameter)((ICloneable)parameters[i]).Clone();
8 IDataParameter para = parameters[i];
9 if (para.Value == null)
10 para.Value = DBNull.Value;
11 cmd.Parameters.Add(para);
12 }
13 else
14 {
15 //为存储过程带回返回值
16 cmd.Parameters.Add(parameters[i]);
17 }
18 }

使用for循环,加数组的索引器使用(每调用一次,就循环一次,可以反编译查看),会造成数组的重复遍历。话不多说,看哥代码,你懂得!

 1 if (parameters != null)
2 {
3 foreach (IDataParameter para in parameters)
4 {
5 if (para != null)
6 {
7 if (commandType != CommandType.StoredProcedure)
8 {
9 if (para.Value == null)
10 para.Value = DBNull.Value;
11 cmd.Parameters.Add(para);
12 }
13 else
14 {
15 //为存储过程带回返回值
16 cmd.Parameters.Add(para);
17 }
18 }
19 }
20 }

3.双重锁定 double check

SqlCache.cs

 1 /// <summary>
2 /// 增加一项到缓存中
3 /// </summary>
4 /// <param name="key"></param>
5 /// <param name="item"></param>
6 /// <returns></returns>
7 public static bool AddToCache(string key,SqlInfo item)
8 {
9 SqlInfo Value = GetFromCache(key);
10 if (Value != null)
11 return false;
12 lock (sync_obj)
13 {
14 DictSqlCache.Add(key, item);
15 }
16 return true;
17 }

第一个if确实能减少锁的影响,提示性能。 lock里需要做判断的...看代码

 1 /// <summary>
2 /// 增加一项到缓存中
3 /// </summary>
4 /// <param name="key"></param>
5 /// <param name="item"></param>
6 /// <returns></returns>
7 public static bool AddToCache(string key, SqlInfo item)
8 {
9 if (!DictSqlCache.ContainsKey(key))//在lock前判断,有助于提升性能
10 {
11 lock (sync_obj)//假设2个线程同时执行到这,如果lock里不做判断会出问题
12 {
13 if (!DictSqlCache.ContainsKey(key))
14 {
15 DictSqlCache.Add(key, item);
16 return true;
17 }
18 }
19 }
20 return false;
21 }

4.分页

SqlPage.cs

/// <summary>
/// 根据主键的高效快速分页之 升序分页
/// </summary>
/// <param name="pageNum">页码,从1开始</param>
/// <param name="pageSize">页大小,大于1</param>
/// <param name="filedList">字段列表</param>
/// <param name="tableName">表名称</param>
/// <param name="PKName">主键名称</param>
/// <param name="conditon">查询条件</param>
/// <returns>返回指定页码的快速分页SQL语句</returns>
public static string GetAscPageSQLbyPrimaryKey(int pageNum, int pageSize, string filedList, string tableName, string PKName, string conditon)
{
if (conditon == null || conditon == "")
conditon = "1=1";
if (pageNum == 1)
{
string sqlTemplage = "Select top @pageSize @filedList from @table1 where @conditon order by @PKName desc ";
return sqlTemplage
.Replace("@pageSize", pageSize.ToString())
.Replace("@filedList", filedList)
.Replace("@table1", tableName)
.Replace("@conditon", conditon)
.Replace("@PKName", PKName);
}
else
{
//@topNum= ((页码-1)*页大小)
string sqlTemplage = @"
select top @pageSize @filedList
from @table1
where @conditon And @PKName>
(select max (@PKName) from
(select top @topNum @PKName from @table1 where @conditon order by @PKName asc) as T
)
order by @PKName asc
";
int topNum = (pageNum - 1) * pageSize;

return sqlTemplage.Replace("@topNum", topNum.ToString())
.Replace("@pageSize", pageSize.ToString())
.Replace("@filedList", filedList)
.Replace("@table1", tableName)
.Replace("@conditon", conditon)
.Replace("@PKName", PKName);

}
}

首先,要把字符串对象构造为StringBuilder对象,用StringBuilder对象的Replace方法,这些细节和上篇也提到了,很多人会认为这是废话,好吧......我不说废话了,进入重点。

看了很多分页代码,有not in的,rownum伪列的,limit的。但如果只根据一列进行查询,主键列或其他值类型的列均可,这种分页无疑是性能最高的。个人很欣赏作者的代码。

但是,我想提一个问题,

假如tableName参数传入的是一个viewName(视图名称),

而这个视图是有10张同结构的表,或不同结构的表抽取意义相同的列的数据  union而成。

这个视图数据量百万级数据量。这么写能禁得住考验吗?

那么该如何改进呢?

相信clever的你已经懂了,若还没想通,那就经历3重境界吧:

昨夜西风凋碧树,独上高楼,望尽天涯路。

衣带渐宽终不悔,为伊消得人憔悴。

然后是蓦然回首...........

 
 
 
标签: c#性能分页pdf.netwinformasp.net

PDF.NET开发框架性能剖析的更多相关文章

  1. 关于PDF.NET开发框架对Mysql Sqlite PostgreSQL数据库分页支持的个人看法

    关于PDF.NET开发框架的名字由来  在设计www.pwmis.com站点的时候,考虑到架构的兼容性和将来升级的可能性,最重要的是没有足够的时间去为网站添加和维护很多复杂的程序,所以在借鉴前人成功经 ...

  2. Linux的系统级性能剖析工具-perf

    一直在找个靠谱且易用的性能分析工具,perf 貌似是很符合要求的,先给出阿里整理的几篇文档: Linux的系统级性能剖析工具-perf-1.pdf Linux的系统级性能剖析工具-perf-2.pdf ...

  3. 快速学习C语言二: 编译自动化, 静态分析, 单元测试,coredump调试,性能剖析

    上次的Hello world算是入门了,现在学习一些相关工具的使用 编译自动化 写好程序,首先要编译,就用gcc就好了,基本用法如下 gcc helloworld.c -o helloworld.o ...

  4. PDF.NET 开发框架之 SOD框架 Ver 5.2 正式版开源源码发布

    PDF.NET 开发框架之 SOD框架 Ver 5.2.1.0307 正式版发布,包含以下部分: SOD_Pwmis.Core --包括下列数据提供程序 SqlServer SqlServerCe A ...

  5. C++ 性能剖析 (一)

    C++ 性能剖析 (一) 性能问题也不是仅仅用“技术”可以解决的,它往往是架构,测试,假设等综合难题.不过,对于一个工程师来说,必须从小做起,把一些“明显”的小问题解决.否则的话积小成多,千里堤坝,溃 ...

  6. ANTS Performance Profiler 8:支持对Web请求、异步代码和WinRT的性能剖析

    下载与激活:http://download.csdn.net/detail/lone112/6734291 离线激活   位于英国的Red Gate Software有限公司最近发布了ANTS Per ...

  7. WEB开发框架性能排行与趋势分析

    WEB开发框架性能基准测试解读与趋势分析 TechEmpower的<Web Framework Benchmarks>性能基准测试,是关注Web开发框架发展的重要途径.但是内容数据众多,每 ...

  8. MySQL性能剖析工具(pt-query-digest)【转】

    这个工具同样来自percona-toolkit 该工具集合的其他工具 MySQL Slave异常关机的处理 (pt-slave-restart)  验证MySQL主从一致性(pt-table-chec ...

  9. Python脚本性能剖析

    ################### #Python脚本性能剖析 ################### cProfile/profile/hotshot用于统计Python脚本各部分运行频率和耗费 ...

随机推荐

  1. ASP.NET MVC学习之控制器篇扩展性

    原文:ASP.NET MVC学习之控制器篇扩展性 一.前言 在之前的一篇随笔中已经讲述过控制器,而今天的随笔是作为之前的扩展. 二.正文 1.自定义动作方法 相信大家在开发过程一定会遇到动作方法的重名 ...

  2. Swift # 柯里化函数

    前言 此次文章,讲述的是Swift的一个新特性(柯里化函数),可能很多iOS开发人员是第一次听这个词汇,包括我自己也是,自己也用了几天时间才总结出来,希望能帮助到各位咯,个人感觉偏向有开发经验的码友, ...

  3. Spark入门级小玩

    ·背景 随着周边吐槽hadoop的声音渐渐多起来之后,spark也逐渐进入了大家的视野.之前,笔者有粗略的写过一篇spark的安装和性能比较[http://www.cnblogs.com/zacard ...

  4. IIS7伪静态化URL Rewrite模块

    原文 IIS7伪静态化URL Rewrite模块 在Win7安装了IIS7.5之后,搭建一些网站或者博客,但是IIS7.5本身没有URL Rewrite功能,也就是无法实现网址的伪静态化. 从网上找了 ...

  5. 搭建及修正Hadoop1.2.1 MapReduce Pipes C++开发环境

    Hadoop目前人气超旺,返璞归真的KV理念让人们再一次换一个角度来冷静思考一些问题. 但随着近些年来写C/C++的人越来越少,网上和官方WIKI的教程直接落地的成功率却不高,多少会碰到这样那样的问题 ...

  6. 【转】关于“ORA-01653: 表 SYS.AUD$ 无法通过 128 (在表空间 SYSTEM 中) 扩展”的错误

    SQL*Plus: Release 11.1.0.6.0 - Production on 星期一 5月 17 18:31:08 2010 Copyright (c) 1982, 2007, Oracl ...

  7. JQ优化性能

    一.注意定义jQuery变量的时候添加var关键字这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下:$loading = $('#loading'); / ...

  8. C#验证IP地址

    using System.Net; try { IPAddress a = IPAddress.Parse(输入的IP字符串); } catch (System.Exception ex) { Mes ...

  9. Light OJ 1316 A Wedding Party 最短路+状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  10. Web应用程序整体测试基础——单元测试

    近年来,随着基于B/S结构的大型应用越来越多,Web应用程序测试问题也在逐步完善中.但Web应用程序测试既可以在系统开发中实施,也可以独立于系统单独完成,这取决于Web应用程序的复杂性和多样性.同时程 ...