我用c#编写的.Net桌面应用程序WPF。没有用于加载数据的直接后端数据库。视图的数据通过托管在多个Web服务器上的不同类型的Web服务来使用。
以下是应用程序中使用的不同类型的Web服务
因此,要在应用程序的特定视图中显示数据,我会同步消耗大约100多种不同的服务。如果所有服务都是同步使用的,那么课程外应用程序将不会响应。为了使应用程序响应,我使用了多线程。也就是说,我在非UI线程中调用了所有Web服务。使用不同的.net库同步调用所有这些Web服务。平均而言大约需要大约60到90秒才能使用Web服务获取所有数据并在UI中呈现它。
目前我正致力于应用程序性能优化。我的想法是,使用多线程是应用程序缓慢的问题之一。没有真正做过任何替补标记。这只是我的想法 当我们查看对多个Web服务进行调用的操作属于I / O绑定操作而不是CPU绑定操作时。由于我在线程上同步调用了所有Web服务,因此它成为CPU绑定操作。
因此,为了提高应用程序性能,我想在不使用显式线程的情况下将所有同步调用转换为异步I / O调用。我用于调用Web服务的所有Dot Net库都支持异步I / O调用。
通过从使用多线程进行的同步调用转移到异步I / O调用,我是否会获得相当大的性能提升?有人做了一些替补标记吗?
答案 0 :(得分:1)
没有真正做过任何替补标记。
然后你肯定应该。您从基准测试中学到的一件事是,您对于什么是错误的直觉几乎总是不正确的。
由于我在线程上同步调用了所有Web服务,因此它成为了CPU绑定操作。
在后台线程中调用Web服务不会将它们转换为CPU绑定操作。它们仍然是IO,但是有一个被阻塞的线程等待它完成。没有什么CPU受此限制。
通过从使用多线程进行的同步调用转移到异步I / O调用,我是否会在性能方面获得相当大的改进?
这实际上取决于你对上下文转换的影响程度。必须同时查询100个数据服务似乎非常多,特别是如果每个服务都消耗一个线程。这一切都缩小了你的基准程度。请注意,如果您正在使用UI应用程序,那么您很可能也只限于ServicePointManager.DefaultConnectionLimit
,默认为2。
Async是关于提供可扩展性的。如果您的应用程序IO过重,您可能会从进行更改中受益。再次,对您的代码进行基准测试,不管怎样。