当前位置: 首页 > news >正文

商城网站实例保定网站制作软件

商城网站实例,保定网站制作软件,中国平安人寿保险公司官网,网站没有ftp 怎么推广以前我一直有个疑惑——在C#中#xff0c;究竟是类#xff08;class#xff09;比较快#xff0c;还是结构体#xff08;struct#xff09;比较快#xff1f;当时没有深究。 最近我遇到一个难题#xff0c;需要将一些运算大的指针操作代码给封装一下。原先为了性能究竟是类class比较快还是结构体struct比较快当时没有深究。 最近我遇到一个难题需要将一些运算大的指针操作代码给封装一下。原先为了性能这些代码是以硬编码的形式混杂在算法逻辑之中不但影响了算法逻辑的可读性其本身的指针操作代码枯燥、难懂、易写错不易维护。所以我希望将其封装一下简化代码编写、提高可维护性但同时要尽可能地保证性能。由于那些指针操作代码很灵活简单的封装不能解决问题还需要用到接口interface以实现一些动态调用功能。为了简化代码还打算实现一些泛型方法。本来还想因32位指针、64位指针的不同而构造泛型类可惜发现C#不支持将int/long作为泛型类型约束只好作罢。将设计改为——分别为32位指针、64位指针编写不同的类它们实现同一个接口。 在C#中有两类封装技术——1.基于类class的封装。在基类中定义好操作方法然后在派生类中实现操作方法。2.基于结构体struct的封装。在接口中定义好操作方法然后在结构体中实现该接口的操作方法。我分别使用这两类封装技术编写测试代码然后做性能测试。 经过反复思索考虑 类、结构体、接口、泛型 的组合我找出了15种函数调用模式——硬编码静态调用调用派生类调用结构体调用基类调用派生类的接口调用结构体的接口基类泛型调用派生类基类泛型调用基类接口泛型调用派生类接口泛型调用结构体接口泛型调用结构体引用接口泛型调用基类接口泛型调用派生类的接口接口泛型调用结构体的接口 测试代码为——  using System; using System.Collections.Generic; using System.Text; using System.Diagnostics;namespace TryPointerCall {/// summary/// 指针操作接口/// /summarypublic interface IPointerCall{/// summary/// 指针操作/// /summary/// param namep源指针/param/// returns修改后指针/returnsunsafe byte* Ptr(byte* p);}#region 非泛型/// summary/// [非泛型] 指针操作基类/// /summarypublic abstract class PointerCall : IPointerCall{public abstract unsafe byte* Ptr(byte* p);}/// summary/// [非泛型] 指针操作派生类: 指针偏移/// /summarypublic class PointerCallAdd : PointerCall{/// summary/// 偏移值/// /summarypublic int Offset 0;public override unsafe byte* Ptr(byte* p){return unchecked(p Offset);}}/// summary/// [非泛型] 指针操作结构体: 指针偏移/// /summarypublic struct SPointerCallAdd : IPointerCall{/// summary/// 偏移值/// /summarypublic int Offset;public unsafe byte* Ptr(byte* p){return unchecked(p Offset);}}#endregion#region 泛型// !!! C#不支持将整数类型作为泛型约束 !!!//public abstract class GenPointerCallT : IPointerCall where T: int, long//{// public abstract unsafe byte* Ptr(byte* p);// void d()// {// }//}#endregion#region 全部测试/// summary/// 指针操作的一些常用函数/// /summarypublic static class PointerCallTool{private const int CountLoop 200000000; // 循环次数/// summary/// 调用指针操作/// /summary/// typeparam nameT具有IPointerCall接口的类型。/typeparam/// param nameptrcall调用者/param/// param namep源指针/param/// returns修改后指针/returnspublic static unsafe byte* CallPtrT(T ptrcall, byte* p) where T : IPointerCall{return ptrcall.Ptr(p);}public static unsafe byte* CallClassPtrT(T ptrcall, byte* p) where T : PointerCall{return ptrcall.Ptr(p);}public static unsafe byte* CallRefPtrT(ref T ptrcall, byte* p) where T : IPointerCall{return ptrcall.Ptr(p);}// C#不允许将特定的结构体作为泛型约束。所以对于结构体只能采用上面那个方法通过IPointerCall接口进行约束可能会造成性能下降。//public static unsafe byte* SCallPtrT(T ptrcall, byte* p) where T : SPointerCallAdd//{// return ptrcall.Ptr(p);//}private static int TryIt_Static_Offset;private static unsafe byte* TryIt_Static_Ptr(byte* p){return unchecked(p TryIt_Static_Offset);}/// summary/// 执行测试 - 静态调用/// /summary/// param namesOut文本输出/paramprivate static unsafe void TryIt_Static(StringBuilder sOut){TryIt_Static_Offset 1;// 性能测试 byte* p null;Stopwatch sw new Stopwatch();int i;unchecked{#region 测试// 硬编码sw.Reset();sw.Start();for (i 0; i CountLoop; i){p p TryIt_Static_Offset;}sw.Stop();sOut.AppendLine(string.Format(硬编码:\t{0}, sw.ElapsedMilliseconds));// 静态调用sw.Reset();sw.Start();for (i 0; i CountLoop; i){p TryIt_Static_Ptr(p);}sw.Stop();sOut.AppendLine(string.Format(静态调用:\t{0}, sw.ElapsedMilliseconds));#endregion // 测试}}/// summary/// 执行测试 - 非泛型/// /summary/// param namesOut文本输出/paramprivate static unsafe void TryIt_NoGen(StringBuilder sOut){// 创建PointerCallAdd pca new PointerCallAdd();SPointerCallAdd spca;pca.Offset 1;spca.Offset 1;// 转型PointerCall pca_base pca;IPointerCall pca_itf pca;IPointerCall spca_itf spca;// 性能测试 byte* p null;Stopwatch sw new Stopwatch();int i;unchecked{#region 调用#region 直接调用// 调用派生类sw.Reset();sw.Start();for (i 0; i CountLoop; i){p pca.Ptr(p);}sw.Stop();sOut.AppendLine(string.Format(调用派生类:\t{0}, sw.ElapsedMilliseconds));// 调用结构体sw.Reset();sw.Start();for (i 0; i CountLoop; i){p spca.Ptr(p);}sw.Stop();sOut.AppendLine(string.Format(调用结构体:\t{0}, sw.ElapsedMilliseconds));#endregion // 直接调用#region 间接调用// 调用基类sw.Reset();sw.Start();for (i 0; i CountLoop; i){p pca_base.Ptr(p);}sw.Stop();sOut.AppendLine(string.Format(调用基类:\t{0}, sw.ElapsedMilliseconds));// 调用派生类的接口sw.Reset();sw.Start();for (i 0; i CountLoop; i){p pca_itf.Ptr(p);}sw.Stop();sOut.AppendLine(string.Format(调用派生类的接口:\t{0}, sw.ElapsedMilliseconds));// 调用结构体的接口sw.Reset();sw.Start();for (i 0; i CountLoop; i){p spca_itf.Ptr(p);}sw.Stop();sOut.AppendLine(string.Format(调用结构体的接口:\t{0}, sw.ElapsedMilliseconds));#endregion // 间接调用#endregion // 调用#region 泛型调用#region 泛型基类约束// 基类泛型调用派生类sw.Reset();sw.Start();for (i 0; i CountLoop; i){p CallClassPtr(pca, p);}sw.Stop();sOut.AppendLine(string.Format(基类泛型调用派生类:\t{0}, sw.ElapsedMilliseconds));// 基类泛型调用基类sw.Reset();sw.Start();for (i 0; i CountLoop; i){p CallClassPtr(pca_base, p);}sw.Stop();sOut.AppendLine(string.Format(基类泛型调用基类:\t{0}, sw.ElapsedMilliseconds));#endregion // 泛型基类约束#region 泛型接口约束 - 直接调用// 接口泛型调用派生类sw.Reset();sw.Start();for (i 0; i CountLoop; i){p CallPtr(pca, p);}sw.Stop();sOut.AppendLine(string.Format(接口泛型调用派生类:\t{0}, sw.ElapsedMilliseconds));// 接口泛型调用结构体sw.Reset();sw.Start();for (i 0; i CountLoop; i){p CallPtr(spca, p);}sw.Stop();sOut.AppendLine(string.Format(接口泛型调用结构体:\t{0}, sw.ElapsedMilliseconds));// 接口泛型调用结构体引用sw.Reset();sw.Start();for (i 0; i CountLoop; i){p CallRefPtr(ref spca, p);}sw.Stop();sOut.AppendLine(string.Format(接口泛型调用结构体引用:\t{0}, sw.ElapsedMilliseconds));#endregion // 直接调用#region 间接调用// 接口泛型调用基类sw.Reset();sw.Start();for (i 0; i CountLoop; i){p CallPtr(pca_base, p);}sw.Stop();sOut.AppendLine(string.Format(接口泛型调用基类:\t{0}, sw.ElapsedMilliseconds));// 接口泛型调用派生类的接口sw.Reset();sw.Start();for (i 0; i CountLoop; i){p CallPtr(pca_itf, p);}sw.Stop();sOut.AppendLine(string.Format(接口泛型调用派生类的接口:\t{0}, sw.ElapsedMilliseconds));// 接口泛型调用结构体的接口sw.Reset();sw.Start();for (i 0; i CountLoop; i){p CallPtr(spca_itf, p);}sw.Stop();sOut.AppendLine(string.Format(接口泛型调用结构体的接口:\t{0}, sw.ElapsedMilliseconds));#endregion // 间接调用#endregion // 泛型调用}}/// summary/// 执行测试 - 泛型/// /summary/// param namesOut文本输出/paramprivate static unsafe void TryIt_Gen(StringBuilder sOut){// !!! C#不支持将整数类型作为泛型约束 !!!}/// summary/// 执行测试/// /summarypublic static string TryIt(){StringBuilder sOut new StringBuilder();sOut.AppendLine( PointerCallTool.TryIt() );TryIt_Static(sOut);TryIt_NoGen(sOut);TryIt_Gen(sOut);sOut.AppendLine();return sOut.ToString();}} #endregion}编译器——VS2005Visual Studio 2005 SP1。VS2010Visual Studio 2010 SP1。采用上述编译器编译为Release版程序最大速度优化。 机器A——HP CQ42-153TX处理器Intel Core i5-430M(2.26GHz, Turbo 2.53GHz, 3MB L3)内存容量2GB (DDR3-1066) 机器B——DELL Latitude E6320 处理器Intel i3-2310M(2.1GHz, 3MB L3)内存容量4GB (DDR3-1333双通道) 测试环境——A_2005机器AVS2005Window 7 32位。A_2010机器AVS2010Window 7 32位。B_2005机器BVS2005Window 7 64位x64。B_2010机器BVS2010Window 7 64位x64。B_2010xp机器BVS2010Window XP SP3 32位。 测试结果单位毫秒—— 模式A_2005A_2010B_2005B_2010B_2010xp硬编码163162232495静态调用162161232395调用派生类570487456487606调用结构体16216095620100调用基类565571453513874调用派生类的接口810728779708929调用结构体的接口10521055117511751267基类泛型调用派生类97556810551148671基类泛型调用基类98456910551152671接口泛型调用派生类1383729134615311062接口泛型调用结构体5661627671149107接口泛型调用结构体引用487164752816100接口泛型调用基类1378812133715351072接口泛型调用派生类的接口1376810133815331102接口泛型调用结构体的接口15421133248620131365结果分析——先看第1列数据A_2005发现“静态调用”、“调用结构体”与“硬编码”的时间几乎一致很可能做了函数展开优化。其次最快的是“接口泛型调用结构体引用”比“接口泛型调用结构体”快了16%。但是“接口泛型调用结构体的接口”最慢“调用结构体的接口”也比较慢。其他的基于类的调用模式的速度排在中间。而且发现泛型方法速度较慢。然后看第2列数据A_2010发现“接口泛型调用结构体”、“接口泛型调用结构体引用”也与“硬编码”的时间几乎一致表示它们也是做了函数展开优化的看来在VS2010中不需要使用ref优化结构体参数。“调用结构体的接口”、“接口泛型调用结构体的接口”两个都成了垫底。泛型方法的速度有了很大的提高几乎与非泛型调用速度相当。再看第3列数据B_2005并与第1列A_2005进行比较发现“静态调用”与“硬编码”的时间几乎一致而“调用结构体”要慢一些。“接口泛型调用结构体”、“接口泛型调用结构体引用”比较慢排在了“调用基类”、“调用派生类”的后面。可能是64位环境x64的特点吧。再看第4列数据B_2010并与第3列B_2005进行比较发现大部分变慢了尤其是结构体相关的难道VS2010的x64性能还不如VS2005我将平台改为“x64”又编译了一次结果依旧。再看第5列数据B_2010xp发现32位WinXP下的大部分项目比64位Win7下要快真诡异。而且发现“静态调用”、“调用结构体”与“硬编码”的时间几乎一致看来“调用结构体”一直是被函数展开优化的而64位下的静态调用有着更深层次的优化所以比不过。 我觉得在要求性能的情况下使用结构体封装指针操作比较好因为直接调用时会做函数展开优化大多数情况下与硬编码的性能一致。在遇到需要一些灵活功能时可考虑采用“接口泛型调用结构体引用”的方式速度有所下降。接口方式最慢尽可能不用。一定要用接口的话应优先选择非泛型版。 完 测试程序exe——http://115.com/file/dn6hvcm3 http://download.csdn.net/detail/zyl910/3614511 源代码下载——http://115.com/file/aqz70zy3 http://download.csdn.net/detail/zyl910/3614514 目录——C#类与结构体究竟谁快——各种函数调用模式速度评测http://www.cnblogs.com/zyl910/archive/2011/09/19/2186623.html再探C#类与结构体究竟谁快——考虑栈变量、栈分配、64位整数、密封类http://www.cnblogs.com/zyl910/archive/2011/09/20/2186622.html三探C#类与结构体究竟谁快——MSIL微软中间语言解读http://www.cnblogs.com/zyl910/archive/2011/09/24/2189403.html四探C#类与结构体究竟谁快——跨程序集assembly调用http://www.cnblogs.com/zyl910/archive/2011/10/01/2197844.html转载于:https://www.cnblogs.com/zyl910/archive/2011/09/19/2186623.html
http://www.zqtcl.cn/news/177994/

相关文章:

  • 男人与女人做视频网站wordpress无法上传图片
  • 二手手表回收网站海外推广渠道有哪些
  • 怎么把地图放到网站上如何做色流量网站
  • 常见的导航网站有哪些郑州核酸vip服务
  • 网站开发老板排名关键词优化师
  • 迈诺网站建设跨境电商平台网站建设
  • 做t恤的网站外贸仿牌网站建设
  • 网站建设的学习网站建站后维护需要做哪些
  • 为什么建设网站很多公司没有网站界面分析
  • 旅游网网站建设的管理大连淘宝网站建设
  • 无锡锡牛网站建设做汽配的外贸网站
  • 黄石公司做网站临湘做网站
  • 网站配色购物网站开发背景需求
  • 河北省建设工程教育网站如何在手机上制作app软件
  • 担保公司网站建设汇报wordpress修改默认域名
  • 网站平台建设需要多少钱html网站标题怎么做的
  • 国外的服务器网站wordpress 博客论坛
  • 多国语言网站模板修改wordpress登录密码
  • 给周杰伦做网站广州免费景点
  • 网站文章不显示淄博网站建设及托管
  • 国外免费建站平面广告设计案例
  • 微信微网站开发价格广西做网站的公司有哪些
  • 做网站内容哪家公司可以做网站
  • 网站后台数据库管理经常浏览不良网站会被记录吗
  • 做加工都在哪个网站推广网络营销外包推广
  • 做英文网站怎么赚钱经典logo设计案例分析
  • 大型建站公司是干嘛的wordpress激活码充值
  • 带后台网站模板wordpress注册模板
  • 济南城乡住房建设厅网站dedecms企业网站
  • 旅游网站怎么做才能被关注园林景观设计公司名字