日期:2014-05-17  浏览次数:21307 次

C#异步和同步哪个快?
上帝呀  我真是无语!!!

今天网上偶然看见形如博客园,CSDN上有关C#异步和同步的介绍,我不禁喷血----C#异步比同步快!!!

那些学过C#线程的和有过一些这方面应用经验的就开始大放厥词,说的头头是道,都是千篇一律:举例子、列代码、测性能,然后就是下结论----C#异步比C#同步快!!!(有些测性能用Date的同志建议用StopWatch)

我想说的是:你们举得例子本身并没有什么错,错就错在你们下的这个结论!
真实的情况上:对于做一件事情,C#异步并不比同步快,而且还会略微慢些,只是用户体验上感觉快了!!!

这是个最简单的常识,大道理我就不讲了,举个最简单的例子:你要完成一项任务,在晚上要看完一本C#和一本Java的书籍,你看300页的C#书籍需要300分钟,看100页的Java书籍需要100分钟,不管你怎么个看法,是同步的先看完C#再看Java,还是异步的相互交错看C#和Java,你花费的时间肯定都是一样的----400分钟。

何来C#异步比同步运行速度更快只说,完全是扯淡!!!只是用户体验上感觉快而已,实质上要求的资源更多了;
对操作系统而言,多线程并发执行增大了系统的吞吐量,而绝不是使机器运行的更快,而关于操作系统I/O的异步和同步,是计算机体系结构和组成原理的反映,现代计算机每个外设几乎都有自己的处理机,针对此情况,那才是真的快了!!!

除非你是两个大脑,除非电脑是两个CPU,否则,对于完成一件事情,你同步也好,异步也罢,时间该多少还是多少

------解决方案--------------------
如果讨论的是单核情况下的异步同步,同意楼主的部分看法,但不完全同意,异步是有可能比同步快的,
因为异步本来就是做两个任务,比如:任务1同步完成需要5秒,任务2同步完成也需要5秒,如果都是同步,
就应该是10秒,但如果用异步,有可能在7,8秒时完成,因为它利用了CPU的空闲时间。
但是异步不可以滥用,有些纯粹为了性能而做的异步,搞不好要比同步慢,这取决于具体情况。
所以,单核下,同步快还是异步快要根据具体环境,不是绝对的。
------解决方案--------------------
三连贴

想一下异步时序被设计出来的原因就差不多能想清楚了异步的存在地位: 减少“命令发出者”的中断次数

在硬件级方面,是为了发出命令的处理器的中断次数,
在应用级网络编程方面,使用异步的主要目的是为了不耽误操作者的下一步操作。

用了异步,“命令发出者”减少了为这条命令所需要付出的中断时间(相对于同步),能够更及时的响应的其他中断。
这种方法只是“命令发出者”感觉轻松快活了,服务器原来该干什么还干什么。

异步时序和同步时序在“命令行使者”这边可以说并没有什么区别,应用级编程使用异步可以说完全是为了更好的用户体验,谁叫用户和他的电脑组成了“命令发出者”这个角色呢。
------解决方案--------------------
引用:
时隙

有的,但是可能这不会影响到程序的速度。
假设到最后,.NET程序CLR去执行了,不管咱们写的同步还是异步,都统一的用CLR的方式去执行了。
如果CLR识别了代码里面的同步异步,并且按照咱们写的去执行,(越过操作系统这一层,一般CLR都在Windows上,他俩一家的)硬件还有自身的时序……
总之,这个时隙影响可以说是微乎其微的。
------解决方案--------------------
LZ说的没啥问题,同步就是要等待任务执行完毕后程序才接着干其它事,异步只是不需等待程序就可以继续去干别的事。而对于某一特定的任务来说该花多久时间还是多久时间,不会更快也不会更慢。