代码改变世界

随笔分类 -  01. DotNet框架

一个简单的性能计数器:CodeTimer

2009-03-10 09:03 by Jeffrey Zhao, 48093 阅读, 收藏, 编辑
摘要: 有数据,有真相,相信大家在平时的工作或学习过程中,都需要比较几种不同方法或实现之间的性能差距。在这些时候,往往就需要我们不断地创建Stopwatch,打开,关闭,然后打印时间。这种一遍又一遍的重复终有一天会让人忍无可忍,因此如果能有一个“标准”的性能计数器,那应该可以让生活轻松许多。这个性能计数器不用复杂,够用就好;也不需要考虑扩展性,要扩展时直接修改代码就够了;同样不需要考虑输出格式,直接打印在Console就行。 阅读全文

简化异步操作(下):构建AsyncTaskDispatcher简化多个异步操作之间的协作调用

2009-02-24 09:27 by Jeffrey Zhao, 9631 阅读, 收藏, 编辑
摘要: 由于CCR和AsyncEnumerator难以“并行”地执行异步代码,因此我们需要提出新的解决方案来满足这方面的需求。本文将构建一个AsyncTaskDispatcher组件,使多个异步操作之间的协作调用得以大大简化。 阅读全文

简化异步操作(上):使用CCR和AsyncEnumerator简化异步操作

2009-02-20 11:25 by Jeffrey Zhao, 11077 阅读, 收藏, 编辑
摘要: 在以前的文章中,我曾多次强调应用程序中异步化的重要性。尤其对于IO密集型操作来说,异步执行对于应用程序的响应能力和伸缩性有非常关键的影响。正确使用异步编程能够使用尽可能少的线程来执行大量的IO密集型操作。可惜的是,即使异步编程有避免线程阻塞等诸多好处,但是这种编程方式至今没有被大量采用。其原因有很多,其中最主要的一点可能就是异步模型在编程上较为困难,导致许多开发人员不愿意去做。因此,无论是微软官方还是社区中都出现了一些简化异步编程方式的组件,例如微软的CCR和Wintellect's .NET Power Threading Library中的AsyncEnumerator。但是它们都有同样的局限性,例如操作之间存在依赖,则很难让它们并行执行。对于这样的场景,我们还需要构建额外的解决方案,使多个有依赖关系的异步操作之间的协作调用得以尽可能的简化。 阅读全文

Fast Reflection Library

2009-02-01 09:25 by Jeffrey Zhao, 19141 阅读, 收藏, 编辑
摘要: 这是我在CodePlex上创建的一个项目,它的网址是http://www.codeplex.com/FastReflectionLib,使用Microsoft Public License (Ms-PL),您可以随意在自己的产品中使用它的全部或部分代码。这个项目用到了我在《方法的直接调用,反射调用与Lambda表达式调用》和《这下没理由嫌Eval的性能差了吧?》两篇文章里用到的做法,并加以提炼和扩展发布的项目——随便搞搞,留个印记,也供以后参考。 阅读全文

计算机体系结构与程序性能

2009-01-22 08:28 by Jeffrey Zhao, 16252 阅读, 收藏, 编辑
摘要: 老赵现在不谈“数据结构与算法如何有助于改善编程思维有什么改善”,或是“操作系统中线程调度、内存分页机制对于开发大型应用程序的参考价值”等“虚无缥缈”之物。在这篇文章里,我想通过两个直接的例子,来说明了解计算机体系结构对于提高程序性能有什么样的作用。 阅读全文

这下没理由嫌Eval的性能差了吧?

2009-01-09 02:32 by Jeffrey Zhao, 18962 阅读, 收藏, 编辑
摘要: 写ASP.NET中使用Eval是再常见不过的手段了,好像任何一本ASP.NET书里都会描述如何把一个DataTable绑定到一个控件里去,并且通过Eval来取值的用法。什么,您觉得Eval性能差不堪大用?那么就来看看这篇文章吧。(Updated:提供思考题解答) 阅读全文

方法的直接调用,反射调用与……Lambda表达式调用

2008-11-24 09:59 by Jeffrey Zhao, 41350 阅读, 收藏, 编辑
摘要: 想调用一个方法很容易,直接代码调用就行,这人人都会。其次呢,还可以使用反射。不过通过反射调用的性能会远远低于直接调用——至少从绝对时间上来看的确是这样。因此,很多框架在必须利用到反射的场景中,都会设法使用一些较高级的替代方案来改善性能。例如,使用CodeDom生成代码并动态编译,或者使用Emit来直接编写IL。不过自从.NET 3.5发布了Expression相关的新特性,我们在以上的情况下又有了更方便并直观的解决方案。 阅读全文

概念,依旧是概念……csproj文件是做什么用的?

2008-08-04 08:57 by Jeffrey Zhao, 44349 阅读, 收藏, 编辑
摘要: 本来今天是在写一篇关于LINQ的文章,不过写着写着忽然觉得有些找不着北的感觉,似乎有点过于发散了?于是来博客园逛了一下,正好发现有朋友发了一篇文章《.NET面试题,看看你的水平》,于是就在这篇文章里和目前正红火的小包子同学为某个问题进行了一番争论。而在吵吵闹闹的过程中看到这么一句话“pdb文件需要放在Debug目录下才有效果”,忽然觉得有个话题值得一说:“开发环境与运行环境”。回想起平时被问到的问题,发现有不少朋友对于开发环境和运行环境并不是分的非常清楚。那么就让我们从标题中的问题开始:“csproj文件究竟是做什么用的”。 阅读全文

觉得有必要来澄清几组重要概念

2008-06-04 01:51 by Jeffrey Zhao, 36395 阅读, 收藏, 编辑
摘要: 在阅读很多朋友问题的过程中,以及平时和别人讨论中,亦或是园子里的文章中经常发现一些误用概念的情况。如果在概念上没有形成共识,那么在工作和交流上就会造成许多问题。因此,老赵已觉得有必要特地来澄清一些概念,解释一下这些概念之间的区别和联系。希望在明确这些概念之后,大家能够把注意力集中在对于具体问题的分析解决上,而不要让沟通成为瓶颈。 在这篇文章中,我希望澄清三组概念,它们是: AJAX / AJAX框架 / AJAX.NET (Professional) / ASP.NET AJAX LINQ / LINQ to SQL / LINQ to XXX Lambda Expression / Expression Tree / 匿名方法 阅读全文

您善于使用匿名函数吗?

2008-04-04 00:10 by Jeffrey Zhao, 30068 阅读, 收藏, 编辑
摘要: 合理使用匿名方法能够大大简化开发,提高代码质量。您善于使用匿名方法吗? 阅读全文

扩展LINQ to SQL:使用Lambda Expression批量删除数据

2008-03-05 13:01 by Jeffrey Zhao, 42242 阅读, 收藏, 编辑
摘要: ORM框架在删除数据方面一直有个尴尬,那就是无法通过指定条件批量删除数据。于是对于一些删除操作,我们不得不写SQL语句或者执行存储过程。幸运的是C# 3.0所拥有的强大特性足以让我们对LINQ to SQL的功能进行扩展。为了更好地进行项目开发,以及周五的一次技术交流,我为LINQ to SQL扩展了批量删除功能。 阅读全文

LINQ to SQL异步查询

2008-03-01 01:51 by Jeffrey Zhao, 30101 阅读, 收藏, 编辑
摘要: 异步操作是提高Web应用程序吞吐量的重要手段,关于这方面的话题已经在前文《正确使用异步操作》中解释过了。对于大多数互联网应用来说,性能瓶颈数据库访问。换句话说,一个请求在数据库操作上所花的时间往往是最多的——并且占总时间的90%以上。因此,当Web应用程序的吞吐量因为数据库操作的阻塞而受到影响的话,我们可是尝试使用异步数据库操作来进行优化。那么我们又该如何使用LINQ to SQL进行异步查询呢? 阅读全文

正确使用异步操作

2008-02-24 22:03 by Jeffrey Zhao, 43558 阅读, 收藏, 编辑
摘要: 本想写一点有关LINQ to SQL异步调用的话题,但是在这之前我想还是先写一篇文章来阐述一下使用异步操作的一些原则,避免有些朋友误用导致程序性能反而降低。这篇文章会讨论一下在.NET中有关异步操作话题,从理论出发结合实际,以澄清概念及避免误用为目标,并且最后提出常见的异步操作场景和使用案例。这样我们就可以知道什么时候该使用异步操作,什么时候会得不偿失。 阅读全文

在LINQ to SQL中使用Translate方法以及修改查询用SQL

2008-02-19 03:02 by Jeffrey Zhao, 30048 阅读, 收藏, 编辑
摘要: 目前LINQ to SQL的资料不多——老赵的意思是,目前能找到的资料都难以摆脱“官方用法”的“阴影”。LINQ to SQL最权威的资料自然是MSDN,但是MSDN中的文档说明和实例总是显得“大开大阖”,依旧有清晰的“官方”烙印——这简直是一定的。不过从按照过往的经验,在某些时候如果不按照微软划定的道道来走,可能就会发现别样的风景。老赵在最近的项目中使用了LINQ to SQL作为数据层的基础,在LINQ to SQL开发方面积累了一定经验,也总结出了一些官方文档上并未提及的有用做法,特此和大家分享。 阅读全文

WCF的Web编程模型资源

2008-01-24 02:11 by Jeffrey Zhao, 10672 阅读, 收藏, 编辑
摘要: .NET 3.5中增强了WCF的功能,为它提供了发布RESTful服务和Syndication(即常见的RSS或Atom)的能力。现在我们开发RESTful的服务或API就非常简单了。同样,无论是分析还是发布RSS也都有了现成的类库(开源产品中原本也有RSS.NET和Atom.NET,不过好像现在都商业化了?)。 MSDN上这方面资源很多,看完类库参考和示例代码(其实并不很多)一般已经足够了。不过... 阅读全文

在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测

2007-11-23 09:21 by Jeffrey Zhao, 5996 阅读, 收藏, 编辑
摘要: 在《在Linq to Sql中管理并发更新时的冲突(2):引发更新冲突》一文中,我们描述了Linq to Sql检测在更新时是否产生了冲突的基本方法:将该记录每个字段原来的值和更新时的值进行对比,如果稍有不同则意味着记录被修改过,因此产生了更新冲突。不过您是否有这样的感觉,这种方法实在累赘了一些?因此Linq to Sql提供了另外一种检测并发更新冲突的方式:使用记录的时间戳。这并不是Linq to Sql特有的功能,如果您了解其他的ORM框架的话,就会发现诸如Hibernate也提供了类似的机制——自然,在使用上不会像Linq to Sql那样方便。 阅读全文

是否会成为问题——Linq to Sql的执行可能无法复用查询计划

2007-11-21 08:43 by Jeffrey Zhao, 4897 阅读, 收藏, 编辑
摘要: 复用查询计划是Sql Server降低CPU开销,提高性能的一个重要手段。但是Linq to Sql可能无法复用查询计划,这是怎么回事儿呢? 阅读全文

在Linq to Sql中管理并发更新时的冲突(2):引发更新冲突

2007-11-20 19:30 by Jeffrey Zhao, 4130 阅读, 收藏, 编辑
摘要: 在上一讲中,我们提到了一些诸如“乐观并发控制”、“悲观并发控制”的概念,以及察看Linq to Sql自动生成sql语句的方法。从这篇文章起我们将继续来查看Linq to Sql在管理并发更新时是如何发现冲突问题的。 阅读全文

在Linq to Sql中管理并发更新时的冲突(1):预备知识

2007-10-30 23:49 by Jeffrey Zhao, 5799 阅读, 收藏, 编辑
摘要: 无论与目前的ORM框架相比有没有优势,Linq to Sql在语言和平台的级别上为我们提供了一种新的操作对象和数据的方式,在一定程度上为我们解决了Object != Data的问题。在实际应用中,对于数据库的操作往往有着天生的并发性,因此在更新数据时可能会产生冲突。有些时候,如果没有合理的解决冲突问题,轻则让用户摸不着头脑,重则让系统数据处于一种不一致的状态。Linq to Sql自然考虑到了这一点,本系列讨论的内容,就是在使用Linq to Sql时,如何管理并发更新时产生的冲突。   本文为这个系列的第一篇,将讨论一些预备知识,它们是进行后续研究的基础。 阅读全文

WCF在安全性方面的支持(1):一些概念

2007-07-25 02:32 by Jeffrey Zhao, 9204 阅读, 收藏, 编辑
摘要: 对于一个应用程序来说,最重要的特性之一就是安全性。安全性是如此的重要,自然WCF也会为它提供了良好的支持,否则也无法称之为一个成熟的模型了。 阅读全文