原文链接:http://www.oschina.net/translate/8-ways-improve-asp-net-web-api-performance

ASP.NET Web API 是非常棒的技术。编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能。

在本文中,我将介绍8项提高 ASP.NET Web API 性能的技术。

1) 使用最快的 JSON 序列化工具

JSON 的序列化对整个 ASP.NET Web API 的性能有着关键性的影响。 在我的一个项目里,我从 JSON.NET 序列化工具转到了 ServiceStack.Text 有一年半了。

我测量过,Web API 的性能提升了20%左右。 我强烈建议你去尝试一下这个序列化工具。这里有一些最近的流行序列化工具性能的比较数据。

来源: theburningmonk

更新: 似乎It seams that StackOverflow 使用了他们号称迄今为止最快的 JSON 序列化工具 Jil。 一测试数据可参见他们的GitHub page Jil
serializer
.

2)从DataReader中手动串行化JSON

我已经在我的项目中使用过这种方法,并获得了在性能上的福利。

你可以手动地从DataReader创建JSON字符串并避免不必要的对象创建,这样你就不用从DataReader中取值并写入对象,再从这些对象中取值并使用JSON Serializer产生JSON.

使用StringBuilder产生JSON,并在结尾处返回StringContent作为在WebAPI中响应的内容。

?
1
2
3
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonResult, Encoding.UTF8, "application/json");
return response;

你可以在 Rick Strahl’s blog查看更多方法

3)尽可能使用其它协议格式 (protocol buffer, message pack)

如果你能给在你的工程中使用其它消息格式,如 Protocol Buffers 或MessagePack   而不是使用JSON这种协议格式。

你将能给获取到巨大的性能优势,不仅是因为Protocol Buffers 的序列化是非常快,而且比JSON在返回的结果格式化要更快。

4) 实现压缩

在你的ASP.NET Web API中使用GZIP 或 Deflate 。

对于减少响应包的大小和响应速度,压缩是一种简单而有效的方式。

这是一个非常有必要使用的功能,你可以查看更多关于压缩的文章在我的博客 ASP.NET Web API GZip compression
ActionFilter with 8 lines of code
.

5) 使用caching

在Web API方法中使用output caching意义深远.举例来说,如果大量用户访问同一个一天只改变一次的响应(response)内容。

如果你想实现手动缓存,例如把用户口令缓存到内存,请参看我的博文 Simple way to implement caching
in ASP.NET Web API
.

6) 尽可能地使用典型的 ADO.NET

手动编写的ADO.NET仍然是从数据库中取值的最快捷的方式。如果Web API的性能对你来说真的很重要,那么就不要使用ORMs.

你可以看到最流行的ORM之间的性能比较.

Dapper 和hand-written fetch code 很快,果不其然,所有的ORM都比这三种慢.

带有resultset缓存的LLBLGen 很快,但它要重新遍历一遍resultset并重新再内存中实例化对象。

7)在 Web API 中实现异步方法

使用异步的 Web API 服务大幅增加 Web API 对于Http 请求的处理数量。

实现是简单的,只需使用 async  的关键字和 将你方法的返回值类型改为 Task 即可。

?
1
2
3
4
5
[HttpGet]  
public async Task OperationAsync()  
{   
    await Task.Delay(2000);  
}

8) 返回多个结果集和集合的组合

减少传输的次数不仅多数据库有好处,对于 Web API同样 ,你才有可能使用结果集的功能。

也就是说你可以从DataReader去提取多个结果集 参见以下演示代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// read the first resultset 
var reader = command.ExecuteReader(); 
  
// read the data from that resultset 
while (reader.Read()) 
    suppliers.Add(PopulateSupplierFromIDataReader( reader )); 
  
// read the next resultset 
reader.NextResult(); 
  
// read the data from that second resultset 
while (reader.Read()) 
    products.Add(PopulateProductFromIDataReader( reader )); 
}

你可以在一个 Web API 的一次响应中返回多个对象,试着将你的返回的多个对象进行组合后返回 如下:

?
1
2
3
4
5
6
public class AggregateResult
{
     public long MaxId { getset; }
     public List<Folder> Folders{ getset; }
     public List<User>  Users{ getset; }
}

这种方式将减少对你的WEB API的HTTP请求。

感谢你读读这篇文章。

asp.net 性能提升的更多相关文章

  1. 教你50招提升ASP.NET性能(十六):把问题仍给硬件而不是开发人员

    (27)Throw hardware at the problem, not developers 招数27: 把问题仍给硬件而不是开发人员 As developers, we often want ...

  2. ASP.NET网站性能提升的几个方法

    1. HTTP 压缩 HTTP 压缩通常用于压缩从服务端返回的页面内容.它压缩HTTP请求和响应,这个会是巨大的性能提升.我的项目是基于Window Server 2003开发的,可以参考这篇文章. ...

  3. 提高ASP.net性能的十种方法

    提高ASP.net性能的十种方法 2014-10-24  空城66  摘自 博客园  阅 67  转 1 转藏到我的图书馆   微信分享:   今天无意中看了一篇关于提高ASP.NET性能的文章,个人 ...

  4. ASP.NET性能优化之减少请求

    在上篇<ASP.NET性能优化之让浏览器缓存动态网页> 中的方案中,浏览器发送If-Modified-Since将是否需要使用自己的缓存交给WEB服务器去决定,服务器告知浏览器去读缓存,浏 ...

  5. ASP.NET性能优化小结(ASP.NET&C#)

    ASP.NET: 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库 ...

  6. Asp.net性能优化技巧

    [摘 要] 我只是提供我几个我认为有助于提高写高性能的asp.net应用程序的技巧,本文提到的提高asp.net性能的技巧只是一个起步,更多的信息请参考<Improving ASP.NET Pe ...

  7. ASP.NET性能优化小结

    一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的 ...

  8. SQL Server 2014里的性能提升

    在这篇文章里我想小结下SQL Server 2014引入各种惊艳性能提升!! 缓存池扩展(Buffer Pool Extensions) 缓存池扩展的想法非常简单:把页文件存储在非常快的存储上,例如S ...

  9. mapreduce性能提升2

    mapreduce性能提升2mapreduce性能提升2mapreduce性能提升2

随机推荐

  1. Android TextView的属性设置为textstyle="bold"时 中文的“¥”不显示

    昨天在修改列表的时候出现了一个挺让人纠结的问题.在TextView中“¥”符号无论如何也显示不出来.尝试了使用气的特殊符号,都是能够正确显示的. 最后百度google了一圈也没找出个所以然来.于是觉得 ...

  2. (转)tomcat 修改默认访问项目名称和项目发布路径

    1.项目发布路径 <Host name="localhost" appBase="webapps" unpackWARs="true" ...

  3. [03] JSP指令

    1.概述 JSP指令用于"转换阶段"提供整个JSP页面的相关信息,影响由JSP页面生成的Servlet的整体结构.指令不会产生任何的输出到当前的输出流中. 指令的基本语法为: &l ...

  4. java算法----排序----(7)堆排序

    package log; import java.util.Arrays; public class Test4 { /** * 堆排序 * * @param args */ public stati ...

  5. CF 888E Maximum Subsequence

    一道比较套路的题,看到数据范围就差不多有想法了吧. 题目大意:给一个数列和\(m\),在数列任选若干个数,使得他们的和对\(m\)取模后最大 取膜最大,好像不能DP/贪心/玄学乱搞啊.\(n\le35 ...

  6. $\mathfrak {reputation}$

    \(\mathfrak {reputation}\) 举世盛名 身败名裂

  7. springcloud 笔记

    官方教程 http://projects.spring.io/spring-cloud/ guide https://github.com/spring-guides 伪官方教程 https://sp ...

  8. Python 可调用对象

    除了用户定义的函数,调用运算符(即 ())还可以应用到其他对象上.如果想判断对象能否调用,可以使用内置的 callable() 函数.Python 数据模型文档列出了 7 种可调用对象.(1)用户定义 ...

  9. 如何启动Intel VT-X及合理利用搜索

    昨天安装Vmware的时候不幸遇到了Vt-X被禁用的麻烦,上网百度了一下才知道要进入Bois进行设置.说起百度就不得不提到模糊搜索这个概念.这个特性的优点和缺点可谓同等突出,有了模糊搜索大家可以在信息 ...

  10. 【实践报告】Linux基础实践一

    [chmod 命令] chmod命令是非常重要的,用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限. 该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设 ...