Web Analytics
yangyang

码农兼一个普普通通小青年

DotNet Framework


使用ServiceStack构建Web服务

提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛。首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Building Cross-Platform Web Services with ServiceStack,所以这里简要介绍一下如何使用ServiceStack快速建立一个WebService服务。 当然,在开始之前,首先要说明一下ServiceStack是个什么东西。 在国内用ServiceStack的似乎很少,大部分都是WCF或者ASP.NET WebAPI,唯一接触ServiceStack的可能是在C# 中调用Redis的时候,有个ServiceStack.Redis,之前还写过一篇 .NET中使用Redis 的拙文。这个ServiceStack.Redis其实就是 …

WebService ServiceStack DTO POCO .NET

LINQ Group By操作

在上篇文章 .NET应用程序与数据库交互的若干问题 这篇文章中,讨论了一个计算热门商圈的问题,现在在这里扩展一下,假设我们需要从两张表中统计出热门商圈,这两张表内容如下: 上表是所有政区,商圈中的餐饮个数,名为FoodDistrict 下表是所有政区,商圈中的SPA个数,名为SPADistrict 现在要把这两张表,根据政区和商圈合并,然后相加Counts,根据Counts的总大小排序,统计热门商圈和热门政区。 在这里仅讨论合并的问题,以演示在SQLServer和C#中LINQ的实现方法: 通常,我们可以直接通过在SQLServer里面首先通过Union All,然后再通过GroupBy语句来执行查询操作即可满足要求,过程如下: SELECT d.CityLocationId , d.CityLocationName , d. …

.NET LINQ SQLServer Performance Optimizing

BCL中String.Join的实现

在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况。比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的字符串,然后作为in的语句传进去。所以自然而然,可以通过循环的方式来拼着个字符串,于是可以写一个下面这样的通用方法: private static string GetStringFromList<T>(char seperator, IEnumerable<T> values) { if (seperator == null) return string.Empty; if (values == null || values.Count() == 0) throw new …

.NET Performance Optimizing

.NET应用程序与数据库交互的若干问题

我们知道,在应用程序中与数据库进行交互是一个比较耗时的过程,首先应用程序需要与应用程序建立连接,然后将请求发送到数据库,数据库执行操作,然后将结果集返回。所以在程序中,要尽量晚的与数据库建立连接,并且较早的释放连接。 然而在很多时候,我们需要频繁的查询和更新数据库中的记录,比如我们的一张表中有1000条记录,假设有一个场景,需要一条一条的判断这1000条记录,如果不存在,插入;如果存在,更新某一个字段。这种场景很常见,比如银行的用户转账或者汇款,在完成之后需要更新账户余额等操作。 最近项目中也遇到了类似的情况,通过实践也简单总结了一些如何提高应用程序执行效率的方法,当然这些都是通过减少和数据库进行交互以及当数据达到一定程度,通过批量实现的。下面就简要介绍一下。 一 场景 最近在项目中要实现一个类似大众点评团购这种筛选的功能,用户可以根据系统提供的城市,商区,美食类别列表来进行筛选, …

.NET SQLServer Performance Optimizing

.NET程序的性能要领和优化建议

前几天在老赵的博客上看到,Bill Chiles (Roslyn 编译器的Program Manager)写了一篇文章叫做《Essential Performance Facts and .NET Framework Tips》。这篇文章是一个14页的pdf,当时我是在地铁上在Lumia手机上看的,觉得很是不错,这里也建议大家直接下载阅读原文,我这里试着翻译一下,以加深自己印象,后面也有一些思考,以下是原文内容: --------------------------------------------------------------------------- 本文提供了一些性能优化的建议,这些经验来自于使用托管代码重写C# 和 VB编译器,并以编写C# 编译器中的一些真实场景作为例子来展示这些优化经验。.NET 平台开发应用程序具有极高的生产力。.NET 平台上强大安全的编程语言以 …

PerfView .NET Performance Optimizing

C# 中参数验证方式的演变

一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限制,如果是整数可能需要判断范围,如果是一些特殊的类型比如电话号码,邮件地址等,可能需要使用正则表达式进行判断。 通常,我们一般都是在方法开始的地方进行条件判断,然后抛出合适的异常,这是最普通和通用的做法,但是在.NET中,利用一些语言特性和类库,可以使用一些其他的方式将我们从复杂繁琐的工作中解放出来。本文逐一介绍能够用来进行参数验证的方式,他们包括直接判断语句,帮助类,扩展方法,Customer Attribute,Enterprise Liberary,Debug.Assert,Code Contract等。可以看到在.NET中随着版本的演化,逐步添加了很多声明式编程( …

Code Contract AOP

一种集合“相等性”的实现

最近在工作中遇到了一个小的功能,就是需要向一个服务发送请求命令,需要判断请求是否发生变化,如果发生变化了,则重新请求。该问题实际上就是判断两个集合是否相等,只需要记录最后一次请求的元素的集合,然后将其和最新一次进行比较是否相等。需要说明的是这里定义的集合相等是指:两个集合如果元素值一样并且出现的次数也一样,即使顺序不一样也认为是相等,比如集合A={1,2,3,4,4,5} 集合B={1,4,4,2,3,5} 这两个集合也认为是相等的。后面讨论的集合相等都是基于这一假设的。 就这么个简单的问题,也有不同种解决方法,这里和大家分享一下。 方法一 使用Dictionary计数来实现 这种方法思路很简单,创建一个Dictionary对象,将第一个集合中的元素作为key添加到Dictionary中,value即为出现的次数。然后遍历第二个集合,如果包含相同的 …


浅谈并发与并行(二)

上文讲解了.NET中的采用Task可以实现任务的并行。除了任务的并行之外,还有数据的并行。和任务的并行不同,数据的并行是指并行的源头不是算法的代码,而是算法操作的数据的本身,TPL (Task Parallel Library)中提供了几个数据并行的API. 一 数据的并行 1.1 Parallel.For和Parallel.ForEach for 和foreach语句也适合进行并行化。实际上,随着并行计算的流行,对这种循环遍历进行并行化也有过很多种尝试。这些方法包括对在编程语言进行扩充等,比如C++里面的OpenMP标准。C#并行类库(Task Parallel Library, TPL)通过提供一些API实现了数据并行化功能,这就是Parallel.For和Parallel.ForEach方法,分别对应平常用到的for和foreach。 回到上文中的遍历数 …

Concurrent Parallel Interlock Lock-free Programming .NET Performance Optimizing

浅谈并发与并行(一)

一、引言 前天在GitHub上看到一幅图,问如何向五岁的小孩讲解并发和并行。然后有人以这幅图做答: 这幅图有点儿意思,用咖啡机的比喻来形容并发和并行,从中最直接的体会是,并发是有状态的,某一线程同时执行一个任务,完了才能进行到下一个,而并行是无状态的。 近些年,计算机的处理能力成指数能力增长。处理能力也越来越快,以前的一些工作站现在都可以移植到笔记本电脑或者手持设备上。但是近几年,由于处理器的处理速度已经达到了极限,所以处理器开始向多核方向发展,而提高程序性能的一个最简单的方式之一就是充分利用多核处理器的计算资源。但要编写利用多核处理器处理的程序并不那么简单。所以一些函数是编程语言,如F#,Scala,Erlang等又开始流行起来,因为他们带来的不可变性,递归思想等在一定程度上简化了并行和并发编程。 本文和下文从任务并行和数据并行两个方面,简要讨论 …

Concurrent Parallel QuickSort .NET

DataTable数据检索的性能分析

我们知道在.NET平台上有很多种数据存储,检索解决方案-ADO.NET Entity Framework,ASP.NET Dynamic Data,XML, NHibernate,LINQ to SQL 等等,但是由于一些原因,如平台限制,比如说必须基于.NET Framework2.0及以下平台;遗留的或者第三方数据接口采用的就是DataTable等等,仍然需要使用DataTable作为数据存储结构。另一方面DataTable比较容易使用,一些数据访问的接口可能直接采用了DataTable结构。在使用DataTable进行数据检索的时候,有一些需要注意的地方,这些地方会严重的影响对数据的检索效率。 本人最近工作中需要对大量的DataTable进行拼接。接口的数据是以DataSet然后里面放DataTable的方式提供的,暂不提是否合理,同时进行多个请求的时,服务端会返回 …

.NET Performance Optimizing DataTable