性能:循环中的I / O操作?

时间:2014-03-18 14:34:14

标签: c# networking

我必须实现一个循环,通过网络连续从设备读取数据。现在我想知道这样实现它是否有效:

  1. 启动工作线程。
  2. 在此工作线程中,循环直到设置标志。
  3. 在循环中,执行同步 I / O。
  4. 与异步I / O相比,这是否会对性能产生任何影响?

3 个答案:

答案 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解决方案。

虽然许多应用程序使用您描述的方法并且没有明显的性能问题,所以它可能是解决方案而主要问题不是这里的性能我会说(如果你不这样做)每秒为每个新文件或用户创建新线程。