Hello World
Spiga

分类:实践优化

.NET平台下Web测试工具横向比较

2009-04-13 22:29 by 老赵, 23694 visits
摘要:为InfoQ写的一篇新闻。由于我有三不写原则(不翻译、不介绍、不重复),觉得有些值得介绍并推广的东西,还是放在InfoQ上吧。 阅读全文

辅助方法不嫌多

2009-04-12 19:25 by 老赵, 21086 visits
摘要:在开发项目过程中,总是会出现大量的辅助方法,例如字符串处理,代码检验,格式输出等等。如果您发现自己在多次编写类似的代码,可能就要想着如何把这些代码进行提取,变成辅助方法(亦或是类库甚至框架,关于这方面粒度问题在此不作讨论)。辅助方法的作用除了遵循DRY原则之外,也能让代码更容易编写,更为清晰,可读性也能更好——而且只要您“去做”,就会发现要得到这些好处并不困难。 阅读全文

使用IronPython检测ASP.NET程序状况(下)

2009-03-25 09:03 by 老赵, 25331 visits
摘要:在上一篇文章中,我们在一个请求中执行了IronPython代码,通过这个方法我们可以轻松地的检查系统运行的状态,或对系统进行一些简单修改。但是这种做法只能检查系统在当前时刻的状态,在很多情况下,我们需要对系统的请求进行一段时间的采样。对于简单的数据(例如每秒执行的请求数量,请求时间),我们可以通过查看Performance Monitor中相关的计数器来获得一些概要的数据。但是,如果我们需要获取一些系统的详细状态,甚至是需要根据需要进行动态改变的自定义需求,则势必要深入到系统内部进行数据采集。那么,我们该怎么做呢? 阅读全文

使用IronPython检测ASP.NET程序状况(上)

2009-03-23 09:09 by 老赵, 13066 visits
摘要:在维护一些生产环境中的ASP.NET应用程序时,老赵经常会感到“力不从心”。虽然我们可以建立丰富有效的监控或日志等维护机制,但是调试和分析一次程序经常需要耗费大量的脑细胞。因为我们可以使用的工具大都非常抽象,即使是一个非常微小的问题,也要用较多的时间才能发现“哦,原来是这个变量的值进入了一种奇怪的状态”。如果我们有一种机制,可以直观地检查生产环境中正在运行的程序的状态,那么一定可以大大方便我们的工作。 阅读全文

谈表达式树的缓存(5):引入散列值

2009-03-20 01:40 by 老赵, 12533 visits
摘要:到目前为止,我们已经实现了三种缓存方式:首先我们设法构建唯一字符串,但是由于它的代价较高,于是我们使用了前缀树进行存储;又由于前缀树在实际操作中所花的时间和空间都有不令人满意之处,我们又引入了二叉搜索树。那么二叉搜索树又有什么缺点呢? 阅读全文

谈表达式树的缓存(4):使用二叉搜索树(AVL树)

2009-03-19 09:05 by 老赵, 9292 visits
摘要:上一篇文章中谈到的前缀树实现方式,时间复杂度从理论上来讲已经达到了最优,而空间复杂度理论上也可以做到较优。但是理论和实际是有差别的,而对于上文前缀树的实现来说,这两方面并不是非常理想。因此,虽然事实上前缀树是老赵第一个真正实现的缓存方法,但是对此并不满意,也想着有什么办法可以进行优化。不如尝试一下使用二叉搜索树? 阅读全文

谈表达式树的缓存(3):使用前缀树

2009-03-18 01:24 by 老赵, 9035 visits
摘要:在上一篇文章里我们设法将前缀树构造为一个唯一的字符串,然后使用字符串作为key缓存在字典中。这个想法非常直接,做法也不困难(在遍历时记录详细信息便可)。不过事实上,老赵在思考表达式树的缓存问题时,这种字符串拼接的方式只存在于脑海当中,而上文的实现是为了这一系列文章的完整性而特地编写的。这是因为它的缺点较为明显,正如上文所述,字符串拼接操作较为耗时耗资源,且很容易生成一个长度可观的字符串(并非不能优化,不过实现就复杂了)。于是我们现在设法选择另一个解决方案来处理这个问题。 阅读全文

谈表达式树的缓存(2):由表达式树生成字符串

2009-03-17 00:58 by 老赵, 9801 visits
摘要:谈到使用表达式树作为key进行缓存,您脑海中最早浮现出来的解决方案是什么?老赵看来,大部分朋友的第一反应自然就是将作为key的表达式树,使用一定规则生成一个字符串。那么我们就先使用这个办法来解决问题。 阅读全文

谈表达式树的缓存(1):引言

2009-03-16 09:29 by 老赵, 12600 visits
摘要:表达式树(Expression Tree)是.NET 3.5中引入的一种表达方式。表达式树的运用十分广泛,可以直观地表现出各种“数据”,甚至“逻辑”和“行为”。老赵现在希望可以找到一种较为通用的,能够根据表达式树进行缓存的解决方案。在这一系列文章中,老赵希望可以重现自己在思考这个问题的时候所形成的完整思考路径。相比最终解决方案,这可能才是更有价值的东西。至少我觉得讨论一下这个问题也是非常有意思的事情。而且从一定程度上说,这些思考能够在一定程度上体现出算法设计与数据结构的美妙之处。 阅读全文

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

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

尽可能摆脱对HttpContext的依赖

2009-03-09 09:17 by 老赵, 8270 visits
摘要:我们继续《ASP.NET MVC单元测试最佳实践》,今天主要谈论HttpContext的依赖问题。简单说来:虽然已经可以对HttpContext进行Mock(这点增强了可测试性),但是过度依赖HttpContext对于单元测试来说也是一个伤害。这是HttpContext对象的天性所致:它实在太复杂了。因此,我们的代码要尽可能减少对HttpContext的依赖。 阅读全文

请别埋没了URL Routing

2009-03-05 09:04 by 老赵, 9136 visits
摘要:我们现在把数据转化的工作交给URL Routing,它的职责原本就是从URL中提取数据——任意类型的数据,以及把数据转化为URL,我们现在只是充分利用了URL Routing的功能而已。事实上,我建议任何使用URL表示的数据,都把转化的职责转移到URL Routing这一层,因为这是我们基本上无可避免地需要根据数据来生成URL。那么Model Binder难道就没有用了吗?当然不是。URL Routing负责从URL中提取数据,而Model Binder则用于从其他方面来获取参数。打开视野,发挥程序员的敏捷思路,生活就会变得更加美好。 阅读全文

Model Binder机制的缺陷

2009-03-02 09:08 by 老赵, 7259 visits
摘要:Model Binder提供了一种机制,将请求中的数据转化成Action方法的参数。但是它是唯一的做法吗?它真是合适的做法吗?本文提出了Model Binder机制的一个缺陷,并且在下一篇文章中提出解决方案。 阅读全文

尽可能地使用强类型数据

2009-02-27 08:19 by 老赵, 8910 visits
摘要:我们继续来谈《最佳实践》,这次的主题便是“强类型”。强类型的好处有很多,张嘴便可随意举上几例:能够享受代码提示功能、能够获得重构工具的支持、能够在编译期发现更多错误…… 阅读全文

对ASP.NET MVC项目中的视图做单元测试

2009-02-25 01:01 by 老赵, 10282 visits
摘要:说到ASP.NET MVC,我们似乎始终都在关注对于Controller的测试,那么我们该如何对视图进行独立的单元测试呢? 阅读全文

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

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

ASP.NET MVC单元测试最佳实践

2009-02-23 09:07 by 老赵, 11132 visits
摘要:我对于微软的一个特点时常呈一种否定态度,那就是因为它往往为了“显摆”自己的技术而向外界展现出一种“飘渺的美好”愿景。例如WebForm推出时铺天盖地的“拖拽”风潮,看似精彩却迷人双眼。这是我在上周“.NET技术大会”上的主题Session。先提供这次Session内容的PPT和演示吧,在接下来的一段时间内,我会陆续分析这次课程的内容。希望大家能够尽可能地把东西给“用好”,而不仅仅是得到表面上的正确结果。 阅读全文

为ASP.NET MVC扩展异步Action功能(下)

2009-02-04 09:04 by 老赵, 11833 visits
摘要:续上篇:异步请求处理是ASP.NET 2.0中引入的高级特性,它依托IO Complete Port,对于提高IO密集型应用程序的吞吐量非常重要(详见原理描述和性能测试)。但是目前ASP.NET MVC框架缺少异步Action功能,这也就是老赵经常挂在嘴边的那个“目前ASP.NET MVC所缺少的非常重要的功能”。我在春节休假期间仔细思考了一下这方面的问题,得出了一个相对不错的扩展:完整,方便,并且非常轻巧——核心逻辑代码只有200行左右,这意味着绝大部分功能将会委托给框架中现成的内容,确保了扩展的稳定,高效并且拥有较好的向后兼容性。 阅读全文

为ASP.NET MVC扩展异步Action功能(上)

2009-02-02 09:22 by 老赵, 13360 visits
摘要:异步请求处理是ASP.NET 2.0中引入的高级特性,它依托IO Complete Port,对于提高IO密集型应用程序的吞吐量非常重要(详见原理描述和性能测试)。但是目前ASP.NET MVC框架缺少异步Action功能,这也就是老赵经常挂在嘴边的那个“目前ASP.NET MVC所缺少的非常重要的功能”。我在春节休假期间仔细思考了一下这方面的问题,得出了一个相对不错的扩展:完整,方便,并且非常轻巧——核心逻辑代码只有200行左右,这意味着绝大部分功能将会委托给框架中现成的内容,确保了扩展的稳定,高效并且拥有较好的向后兼容性。 阅读全文

Fast Reflection Library

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