ADO.NET 中 DataReader 各种读取方式性能差别 -- 拍砖有分 200
很早就做了这么一个测试,一直没有发布出来,刚才看到 http://community.csdn.net/Expert/TopicView3.asp?id=5696773 中关于 box/unbox 问题,就整理了一下,与大家分享,希望对 .NET 新手而又喜欢嘀咕:“为什么你的程序就是跑我快”的朋友有帮助
限于篇幅,暂时无法讨论各种读取方式适用场景,诸位大虾楼下拍砖吧
~~【拍砖有分】允许,偶也拉风一次哈~~
A.
非官方(^_^)测试结论(以下序号越大,性能越低)
1. DataReader.GetXXX( < <ColumnIndex> > )
2. DataReader.GetXXX(Dictionary <string, int> [ < <ColumnName> > ])
[Dictionary <string, int> .Add( < <ColumnName> > , DataReader.GetOrdinal( < <ColumnName> > ))]
3. DataReader.GetXXX((Int32)Hashtable[ < <ColumnName> > ])
[Hashtable.Add( < <ColumnName> > , DataReader.GetOrdinal( < <ColumnName> > ))]
4. ( < <Type> > )DataReader[ < <ColumnIndex> > ]
5. DataReader.GetXXX(DataReader.GetOrdinal( < <ColumnName> > ))
6. Convert.ToXXX(DataReader[ < <ColumnIndex> > ])
7. ( < <Type> > )DataReader[ < <ColumnName> > ]
8. Convert.ToXXX(DataReader[ < <ColumnName> > ]
[解决办法]
好东西,我偷一个~~嘎嘎
[解决办法]
狂顶 以前都用的是第8种方法也
[解决办法]
顶
[解决办法]
学习一下!
[解决办法]
lz:
lblHostName.Text = dr[ "hostName "].ToString();和
lblHostName.Text = (string)dr[ "hostName "];和
lblHostName.Text = Convert.ToString(dr[ "hostName "]);
这三个那个性能好呢?
[解决办法]
学习楼主
[解决办法]
为什么呢?
[解决办法]
頂頂頂
[解决办法]
顶 楼主辛苦了
[解决办法]
顶顶顶顶顶!!!
[解决办法]
顶
[解决办法]
好东东,顶
[解决办法]
有点意思
[解决办法]
学习
[解决办法]
mark
[解决办法]
高效的运行方法是值得一看的!
[解决办法]
先顶了再看.
[解决办法]
我也去搞个测试。
[解决办法]
学习
[解决办法]
刚刚在博客园看到了啊
很好
谢谢楼主
给分吧
[解决办法]
jf
------解决方案--------------------
先 GetOrdinal 再进入循环
如:
//从IDataReader内取业务对象填充Collection
public static List <JobPosting> GetLatest(int rowsReturn)
{
List <JobPosting> list = new List <JobPosting> ( );
DBOperators db = new DBOperators( );
db.AddParameter( "@TopRowsCount " , rowsReturn );
IDataReader reader = db.ExecuteReader( "DotNetJobs_Db_JobPostings_GetLatest " );
int postingIdIndex = dr.GetOrdinal( "PostingID " );
int companyIndex = dr.GetOrdinal( "CompanyID " );
int titleIndex = dr.GetOrdinal( "Title " );
int contentPersonIndex = dr.GetOrdinal( "ContactPerson " );
int departmentIndex = dr.GetOrdinal( "Department " );
int jobDescriptionIndex = dr.GetOrdinal( "JobDescription " );
int cityIdIndex = dr.GetOrdinal( "CityID " );
int stateIndex = dr.GetOrdinal( "StateID " );
int countryIndex = dr.GetOrdinal( "CountryID " );
int educationLevelIdIndex = dr.GetOrdinal( "EducationLevelID " );
int jobTypeIdIndex = dr.GetOrdinal( "JobTypeID " );
int jobCodeIndex = dr.GetOrdinal( "JobCode " );
int minSalaryIndex = dr.GetOrdinal( "MinSalary " );
int maxSalaryIndex = dr.GetOrdinal( "MaxSalary " );
int postingDateIndex = dr.GetOrdinal( "PostingDate " );
int postByIndex = dr.GetOrdinal( "PostedBy " );
int tagsIndex = dr.GetOrdinal( "Tags " );
while ( reader.Read( ) )
{
//这里没有直接调用 PopulateJobPostingFromReader 方法 以减少不必要的GetOrdinal调用
JobPosting objJobPosting = new JobPosting( );
objJobPosting.JobPostingID = dr.GetInt32( postingIdIndex );
objJobPosting.CompanyID = dr.GetInt32( companyIndex );
objJobPosting.Title = dr.GetString( titleIndex );
objJobPosting.ContactPerson = dr.GetString( contentPersonIndex );
objJobPosting.Department = dr.GetString( departmentIndex );
objJobPosting.Description = dr.GetString( jobDescriptionIndex );
objJobPosting.CityID = dr.GetInt32( cityIdIndex );
objJobPosting.StateID = dr.GetInt32( stateIndex );
objJobPosting.CountryID = dr.GetInt32( countryIndex );
objJobPosting.EducationLevelID = dr.GetInt32( educationLevelIdIndex );
objJobPosting.JobTypeID = dr.GetInt32( jobTypeIdIndex );
objJobPosting.JobCode = dr.GetString( jobCodeIndex );
objJobPosting.MinSalary = dr.GetDecimal( minSalaryIndex );
objJobPosting.MaxSalary = dr.GetDecimal( maxSalaryIndex );
objJobPosting.PostingDate = dr.GetDateTime( postingDateIndex );
objJobPosting.PostedBy = dr.GetString( postByIndex );
objJobPosting.Tags = dr.GetString( tagsIndex );
list.Add( objJobPosting );
}
reader.Close( );
return list;
}
从Datareader内取业务对象
public static Company GetCompany(int companyid)
{
DBOperators db = new DBOperators();
db.Parameters.Add(new SqlParameter( "@iCompanyID ", companyid));
SqlDataReader dr = (SqlDataReader)db.ExecuteReader( "DotNetJobs_Db_Companies_SelectOne ");
if (dr.HasRows)
{
Company c = null;
while ( dr.Read( ) )
{
c = PopulateCompany( dr );
}
if ( !dr.IsClosed )
{
dr.Close( );
}
return c;
}
else
{
dr.Close();
return null;
}
}
private static JobPosting PopulateJobPostingFromReader(IDataReader dr)
{
int postingIdIndex = dr.GetOrdinal( "PostingID " );
int companyIndex = dr.GetOrdinal( "CompanyID " );
int titleIndex = dr.GetOrdinal( "Title " );
int contentPersonIndex = dr.GetOrdinal( "ContactPerson " );
int departmentIndex = dr.GetOrdinal( "Department " );
int jobDescriptionIndex = dr.GetOrdinal( "JobDescription " );
int cityIdIndex = dr.GetOrdinal( "CityID " );
int stateIndex = dr.GetOrdinal( "StateID " );
int countryIndex = dr.GetOrdinal( "CountryID " );
int educationLevelIdIndex = dr.GetOrdinal( "EducationLevelID " );
int jobTypeIdIndex = dr.GetOrdinal( "JobTypeID " );
int jobCodeIndex = dr.GetOrdinal( "JobCode " );
int minSalaryIndex = dr.GetOrdinal( "MinSalary " );
int maxSalaryIndex = dr.GetOrdinal( "MaxSalary " );
int postingDateIndex = dr.GetOrdinal( "PostingDate " );
int postByIndex = dr.GetOrdinal( "PostedBy " );
int tagsIndex = dr.GetOrdinal( "Tags " );
JobPosting objJobPosting = new JobPosting( );
objJobPosting.JobPostingID = dr.GetInt32( postingIdIndex );
objJobPosting.CompanyID = dr.GetInt32( companyIndex );
objJobPosting.Title = dr.GetString( titleIndex );
objJobPosting.ContactPerson = dr.GetString( contentPersonIndex );
objJobPosting.Department = dr.GetString( departmentIndex );
objJobPosting.Description = dr.GetString( jobDescriptionIndex );
objJobPosting.CityID = dr.GetInt32( cityIdIndex );
objJobPosting.StateID = dr.GetInt32( stateIndex );
objJobPosting.CountryID = dr.GetInt32( countryIndex );
objJobPosting.EducationLevelID = dr.GetInt32( educationLevelIdIndex );
objJobPosting.JobTypeID = dr.GetInt32( jobTypeIdIndex );
objJobPosting.JobCode = dr.GetString( jobCodeIndex );
objJobPosting.MinSalary = dr.GetDecimal( minSalaryIndex );
objJobPosting.MaxSalary = dr.GetDecimal( maxSalaryIndex );
objJobPosting.PostingDate = dr.GetDateTime( postingDateIndex );
objJobPosting.PostedBy = dr.GetString( postByIndex );
objJobPosting.Tags = dr.GetString( tagsIndex );
return objJobPosting;
}
[解决办法]
学习中……
[解决办法]
顶,学习一下
[解决办法]
以前有本ADO.NET高级编程的书上也分析过这个,不过没有 晓风残月 写的这么详尽
DataReader.GetXXX( < <ColumnIndex> > ) 无疑是我的最喜欢用的,如果已经知道确切的数据类型,用GetXXX是效率最高的,避免了如果原来是object,再拆箱成比如整形这样的值类型,用索引而不是字段名去查找,无疑也是效率比较高的,缺点就是没有写字段名称的可读性,可维护性好(前两天看有人问装箱和拆箱的问题时就想举这个例子)
帖子收藏一下 谢谢晓风残月的测试
[解决办法]
看看
[解决办法]
学习
------解决方案--------------------
看看
[解决办法]
DataReader.GetXXX( < <ColumnIndex> > ) 比DataReader.GetXXX( < <ColumnName> > )性能高.
[解决办法]
嗯,很有用的测试.
[解决办法]
学习
[解决办法]
学习
[解决办法]
已经早读多了,学习
[解决办法]
学习了
[解决办法]
cang yixia xian
[解决办法]
顶!!
[解决办法]
顶
[解决办法]
顶
[解决办法]
直接用它的机会好少
[解决办法]
顶吧!下次来瞅瞅!
[解决办法]
顶完后慢慢看·
[解决办法]
mark
[解决办法]
3
[解决办法]
Jinglecat的东西,顶!
[解决办法]
帮顶!
[解决办法]
顶...
[解决办法]
帮顶
[解决办法]
学习
[解决办法]
不收藏,我复制,再粘贴到记事本
[解决办法]
学习下
[解决办法]
板凳
[解决办法]
关注
[解决办法]
顶
[解决办法]
up
[解决办法]
收藏
[解决办法]
吃饱了撑了没事做的……
[解决办法]
很多测试毫无意义,看IL便知。不过难得楼主这么有心……
[解决办法]
很多测试毫无意义,看IL就知道了……
[解决办法]
收藏
[解决办法]
JF
[解决办法]
你用列名索引它也是把它变成序号的。
这还用测么?
[解决办法]
要测试就要像装配脑袋那样,到优化IL甚至是汇编的程度,根据设想,优化代码,然后测试,看看自己的设想是不是正确。
[解决办法]
好文章!!顶了!
[解决办法]
把一些情况罗列来进行个测试,与设想毫无二异,有何意义?
如果他的测试发现某个东西与设想或者理论矛盾,这才有意义。
伽里略也是先想了很久才去扔铁球的……要不都会把他当疯子。
声明,以上全部是转述,
偶是复印机,呵呵
[解决办法]
我是无耻的,呵呵~
[解决办法]
vmm是馍馍
[解决办法]
学习
[解决办法]
看不懂,也得顶
[解决办法]
先顶了在看!
[解决办法]
性能分析的确如此,我原来看见过别人的测试结果,不过对于楼主一样敬佩
[解决办法]
与其说是DataReader的性能,到不如说是数据类型转换的性能
[解决办法]
jf
[解决办法]
路过,JF
[解决办法]
学习之中,帮顶一下
[解决办法]
看见,不顶不行
[解决办法]
原来是高人,今天刚刚在博客园里面看过~顶下
[解决办法]
都两天了 帮顶
[解决办法]
路过,顶一下!!
[解决办法]
不错,帮顶
[解决办法]
lg
[解决办法]
收益!
[解决办法]
学习
[解决办法]
研究研究
[解决办法]
晕,博客园讨论一次,又到这里讨论。。
[解决办法]
jf up 学习
[解决办法]
Mark
[解决办法]
学习
[解决办法]
说的细,好文
[解决办法]
JF
[解决办法]
m
[解决办法]
up
[解决办法]
啊呀
[解决办法]
ding
[解决办法]
既然有分,扔快砖先