C# 4 System.Threading.Tasks 性能询问

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

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

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

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

  • 哪些页面会在短时间内使用任务等大量服务器资源?
  • 仅使用同步代码的页面,服务器资源较少,但时间较长?
  • 没有发生?

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

最佳答案

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

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

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

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

编辑 - 这里有一篇不错的文章:http://blog.stevensanderson.com/2010/01/25/measuring-the-performance-of-asynchronous-controllers/

关于C# 4 System.Threading.Tasks 性能询问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11051314/

相关文章:

c# - asp.net c# 中是否有等效的 echo

c# - C#中的主线程锁定

c# - 文本更新减慢应用程序

c# - 使用 C# 和 Rotativa 生成 PDF 后删除状态消息

PHP for 循环与 C for 循环

c# - Windows 服务 - 获取当前目录

jquery - 使用 Controller 和 Action 名称进行 ajax 调用

c# - 如何在模型绑定(bind)期间忽略 HttpRequestValidationException 和自己编码的 HTML?

c# - 我应该使用一个 LINQ DataContext 还是多个?

c - 如何测量 x86 纳秒以下的运行时间?