文章标签 ‘性能优化’
[转载]浅谈.NET反射机制的性能优化 – 陈彦铭 – 博客园. 在进入解释型模版引擎的探讨之前,我决定先分享一下这篇博客。因为在解释型引擎里将会引入反射的概念来实现更多、更复杂的功能。可能大家谈到反射面部肌肉都开始抽搐了吧!因为在托管语言里面,最臭名昭著的就是反射!它的性能实在是太低了,甚至在很多时候让我们无法忍受。不过不用那么纠结了,老陈今天就来分享一下如何来优化反射! 概述 本文涉及到的反射优化的途径有如下两种: 通过Delegate.CreateDelegate()创建委托进行优化 通过.NET4的动态运行时进行优化 如果您还知道其他更加有效的优化途径,请不吝赐教! 准备工作 今天我们总计要对比五种不同的调用对象成员的方式,也算是一种性能测评。 在开始之前,我们首先定义一个简单的对象和一个方法,以供测试之用: namespace ReflectionOptimization { public sealed class TestObject { public int Add(int a, int b) { // 简单演示 return a + b; } } } 这个类非常简单,只提供了一个方法,这个方法返回两个整形的和。接下来我们看看执行时间测量的代码,很简单,想必您已经驾轻就熟了: private static double _Run(string description, Action action, int a, int b) { if (action == null) [...]
[转载]【译】一些优化你的SQL语句的TIPs – CareySon – 博客园. 简介 对于写出实现功能的SQL语句和既能实现功能又能保证性能的SQL语句的差别是巨大的。很多时候开发人员仅仅是把精力放在实现所需的功能上,而忽略了其所 写代码的性能和对SQL Server实例所产生的影响(也就是IO,CPU,内存方面的消耗).这甚至有可能使整个SQL Server实例跪了。本文旨在提供一些简单的步骤来帮助你优化SQL语句。 市面上已经有很多关于如何优化SQL Server性能的书籍和白皮书。所以本文并不打算达到那种深度和广度,而仅仅是为开发人员提供一个快速检测的列表来找到SQL语句中导致瓶颈产生的部分。 在开始解决性能问题之前,合适的诊断工具是必须的。除去众所周知的SSMS和SQL Profiler,SQL Server 2008还带有众多DMV来提供关键信息。本篇文章中,我将使用SSMS和一些DMV来找到SQL的瓶颈 那么,我们从哪开始 我的第一步是查看执行计划。这一步既可以通过SMSS也可以通过SQL Profiler实现,为了简便起见,我将在SMSS中获取执行计划。 1) 检查你是否忽略掉了某些表的连接的条件,从而导致了笛卡尔积(Cross)连接(Join)。比如,在生产系统中有两个表,每个表中有1000行数据。这 其中绝大多数数据并不需要返回,如果你在这两个表上应用了Cross Join,返回的结果将会是100万行的结果集!返回如此数量的数据包括将所有数据从物理存储介质中读取出来,因而占用了IO。然后这些数据将会被导入内 存,也就是SQL Server的缓冲区。这会将缓冲区内的其它页Flush出去。 2)查看你是否忽略了某些Where子句,缺少Where子句会导致返回额外不需要的行。这产生的影响和步骤一所产生的影响是一样的。 3)查看统计信息是否是自动创建和自动更新的,你可以在数据库的属性里看到这些选项 在默认条件下创建一个新数据库,Auto Create Statistics和Auto Update Statistics选项是开启的,统计信息是用于帮助查询优化器生成最佳执行计划的。这份白皮书对于解释统计信息的重要性以及对于执行计划的作用解释的非常到位。上面那些设置可以通过右键数据库,选择属性,在“选项”中找到。 4)检查统计信息是否已经过期,虽然统计信息是自动创建的,但是更新统计信息从而反映出数据的变化也同样重要。在一个大表中,有时候虽然Auto Update Statistics 选项已经开始,但统计信息依然无法反映出数据的分布情况。默认情况下,统计信息的更新是基于抽取表中的随机信息作为样本产生的。如果数据是按顺序存储的, 那么很有可能数据样本并没有反映出表中的数据情况。因此,推荐在频繁更新的表中,统计信息使用Full Scan选项来定期更新。这种更新可以放到数据库闲时来做。 DBCC SHOW_STATISTICS命令可以用于查看上次统计信息的更新时间,行数以及样本行数.在这个例子中,我们可以看到Person.Address表上的AK_Address_rowguid索引的有关信息: USE AdventureWorks; GO DBCC SHOW_STATISTICS (“Person.Address”, AK_Address_rowguid); GO 下面是输出结果,请注意Updated,Rows,Rows Sampled这三个列 [...]
[转载]asp.net高性能之路:无缝切换HttpRuntime.Cache与Memcached,附代码 – Ray Wu – 博客园. 概述 之前网站一直使用ASP.NET自带的cache,也就是HttpRuntime.Cache。这个的优点是进程内cache,效率非常高,同时对于缓存的对象可以直接获得 引用,并进行修改,不需要再进行清空缓存。但是使用HttpRuntime.Cache,无法进行扩展,也无法使用web园等等。 方案 之前有看dudu写的关于northscale memcached的文章,觉得很不错,故进行了一下尝试。由于初次使用,出问题的时候要能随时切换回HttpRuntime.Cache, 故使用了策略模式,实现无缝切换缓存模式的功能。Memcached的封装类请在https://github.com/enyim/EnyimMemcached/downloads进行下载,我使用的是Northscale.Store.2.8 接口 View Code using System; using System.Collections.Generic; using System.Web; /// <summary> /// 缓存策略接口 /// </summary> public interface ICacheStrategy { void AddObject(string objId, object o); void AddObjectWithTimeout(string objId, object o, int timeoutSec); void AddObjectWithFileChange(string objId, object o, string file); //void AddObjectWithDepend(string objId, object [...]
[转载]C#高效编程话题集2(每期10话题) – 不如来编码-luminji’s web – 博客园. 第一期话题在:C#高效编程话题集1(每期10话题) C#快速成长团队第二期话题来到。欢迎进入C#快速成长团队进行讨论。 1:确保集合的线程安全 如果使用.net4.0,有新的线程安全集合类 新的 System.Collections.Concurrent 命名空间引入了多个新的线程安全集合类,可在需要时随时提供对项的无锁访问,并在锁适用时提供细粒度锁定。 在多线程方案中使用这些类应获得优于集合类型(例如, ArrayList 和 List <(Of <(T >)>))的性能。 除了System.Collections.Concurrent空间下集合外,非泛型集合使用 lock(非泛型集合对象.SyncRoot)进行锁定达到集合线程安全目的 泛型集合使用 static object sycObj = new object(); //是否static看具体应用 lock (sycObj) { //操作集合。 } 2:循环中先求长度还是使用list.Count,哪个效率高 第一类: int len = list.Count; for(int i; i<len; i++) { 迭代 } 第二类: for(int i; i<list.Count; i++) { 迭代 [...]
[转载][Android]ListView性能优化之视图缓存 – 农民伯伯 – 博客园. 前言 ListView是Android中最常用的控件,通过适配器来进行数据适配然后显示出来,而其性能是个很值得研究的话题。本文与你一起探讨Google I/O提供的优化Adapter方案,欢迎大家交流。 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 正文 一、准备 1.1 了解关于Google IO大会关于Adapter的优化,参考以下文章: Android开发之ListView 适配器(Adapter)优化 Android开发——09Google I/O之让Android UI性能更高效(1) PDF下载:Google IO.pdf 1.2 准备测试代码: Activity private TestAdapter mAdapter; private String[] mArrData; private TextView mTV; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mTV = (TextView) findViewById(R.id.tvShow); mArrData = new String[1000]; for (int i = 0; i < 1000; i++) { mArrData[i] = “Google IO Adapter” [...]


