我必须实现一个循环,通过网络连续从设备读取数据。现在我想知道这样实现它是否有效:
与异步I / O相比,这是否会对性能产生任何影响?
答案 0 :(得分:3)
“这取决于。”
如果网络设备正在产生稳定的数据流,那么有一个专用于同步服务的线程是有意义的。线程阻塞直到数据可用,然后读取并处理数据。该线程可以根据需要通知主线程。
如果设备不经常生成数据,那么使用异步请求可能更有意义。在主线程中发出异步读取调用,然后开始您的业务。当数据可用时,它会被异步回调读取并根据需要进行处理,并发出新的异步读取。
这是我使用的一般规则:大量数据,然后专用线程。不常用的数据,使用异步。这不是一个硬性规则,但它是我开始的地方。
无论哪种方式都会对性能产生影响。这是一个权衡问题。持久性线程将在其整个生命周期中消耗资源(主要是堆栈空间,以及线程proc使用的任何数据)。如果线程花费大部分时间等待输入,那么这不是非常有效的资源使用。
另一方面,发出异步读取请求需要一些非零时间。如果您不经常期望数据(例如,每秒不超过一次),则这些异步读取请求中涉及的开销可能无关紧要。但是,如果您有连续的数据流并且每秒发出数百或数千个异步读取请求,则开销将影响性能。当您执行那么多读取请求时,您实际上有一个处理输入的专用线程,因此您可以简化程序并创建持久性线程。
答案 1 :(得分:0)
基于这篇文章:http://www.lenholgate.com/blog/2008/02/when-are-asynchronous-file-writes-not-asynchronous.html
同步和异步I / O的性能会有所不同,具体取决于特定任务和实际实现方法,并且会更深入地显示它的变化。
希望它有所帮助。
答案 2 :(得分:-1)
是的,它有影响:
如果可能,您最好实现异步读取。这是更多的elegand解决方案。
虽然许多应用程序使用您描述的方法并且没有明显的性能问题,所以它可能是解决方案而主要问题不是这里的性能我会说(如果你不这样做)每秒为每个新文件或用户创建新线程。