我有这个SQL服务器实例,它由多个客户端进程共享。我希望查询尽可能少地完成。
假设一个呼叫需要从这个共享的Sql Server读取1k到10k的记录。我的自然选择是使用ExecuteReaderAsync来利用异步优势,例如重用线程。
我开始想知道异步是否会带来一些开销,因为执行可能会停止并恢复每次调用ExecuteReaderAsync。这是真的,如果与使用ExecuteReader的实现相比,查询完成的总时间似乎会更长。这有什么意义吗?
答案 0 :(得分:6)
使用sync或async来调用SQL Server对于SQL Server所做的工作以及ADO.NET对序列化和反序列化请求和响应所执行的CPU绑定工作没有任何影响。所以无论你选择什么,差异都会很小。
使用async不是为了节省CPU时间。它是关于节省内存(减少线程堆栈)以及在UI应用程序中拥有一个不错的编程模型。
事实上,就我所知,async永远不会节省CPU时间。它增加了开销。如果要节省CPU时间,请使用同步方法。
在低并发工作负载中使用async的服务器上不会添加任何值。它增加了开发时间和CPU成本。
答案 1 :(得分:1)
异步方法和同步方法之间的区别在于,异步调用将导致编译器生成状态机,而同步调用将仅在数据库完成时再次阻塞。
IRL,选择的最佳方式是对两种方法进行基准测试。正如usr所说,与查询执行的时间相比,通常这些差异是可忽略的。 Async将在可以节省资源的地方闪耀,例如分配新线程
有许多关于异步性能的帖子: