C# 4 System.Threading.Tasks performance interrogations

本文关键字:performance interrogations Tasks Threading System | 更新日期: 2023-09-27 18:37:14

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

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

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

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

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

C# 4 System.Threading.Tasks performance interrogations

您没有说明 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/