C#4 System.Threading.Tasks性能审讯

时间:2012-06-15 13:11:10

标签: c# asp.net-mvc-3 performance iis-7

我目前正在开发一个ASP.NET MVC应用程序,其中一些页面加载了大量数据(在单独的LINQ查询中重新分配)。

为了提高这些页面的性能,我设想使用C#4任务来同时进行查询,并获得执行时间。

但我有一个主要问题:从服务器端来看,情况最好:

  • 在很短的时间内使用了大量服务器资源的页面?
  • 只使用同步代码,服务器资源少但时间更长的页面?
  • 没有发病率?

我的页面性能很重要,但服务器的稳定性更高! 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您没有说明LINQ查询是否受CPU限制(例如在内存中计算)或IO限制(例如,通过网络或从磁盘读取)。

如果它们受CPU限制,那么使用异步代码将提高公平性,但会降低吞吐量 - 但只会让每个人都受到影响。例如,假设您一次只能处理一个请求,每个请求需要5秒钟。两个请求几乎同时进入。对于同步代码,第一个将在5秒内完成,而第二个将在排队,第二个将在10之后完成。使用异步代码,两者将一起启动并在稍微超过10秒后完成(由于两者之间的交换开销) )。这是假设,因为您有许多线程可以同时处理请求。

实际上,您会发现异步代码只有在您有大量IO绑定操作需要足够长时间才能导致请求排队时才会有所帮助。如果队列填满,服务器将开始发出服务器不可用503错误。检查性能计数器 - 如果在典型的活动负载下很少或没有在ASP.NET中排队的请求,那么就不必担心额外的复杂性。

如果工作是IO绑定的,那么使用异步代码会将瓶颈推向网络/磁盘。这是一件好事,因为您不会在等待响应的空闲阻塞请求线程上浪费您的Web服务器的内存资源 - 而是根据下游性能提出请求吞吐量,并且可以专注于优化它。即你可以保持这些请求线程免于从队列中获取更多工作。

编辑 - 关于此的好文章:http://blog.stevensanderson.com/2010/01/25/measuring-the-performance-of-asynchronous-controllers/

相关问题