首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >StreamWriter:(Write+Flush)异步似乎比同步变体慢得多

StreamWriter:(Write+Flush)异步似乎比同步变体慢得多
EN

Stack Overflow用户
提问于 2017-01-31 17:43:35
回答 1查看 4.5K关注 0票数 2

我试图在课堂上找到一个IO瓶颈,令人惊讶的是,当我将1000000条消息写入一个文件时,sw.Write("m"); sw.Flush()await sw.WriteAsync("m"); Await sw.FlushAsync();快20000。有谁知道原因吗?我敢打赌,StreamWriter的构造函数String不会为async的使用参数化流。

下面的代码可以从C#交互式启动。是的,这并不是测量速度的最佳地点,但无论如何它都会显示出眼前的事情:

代码语言:javascript
运行
复制
var sr = new StreamWriter("G:\\file.file");
var N = 1000;
var sw = new Stopwatch();
sw.Start();

for (var i = 0; i < N; ++i)
{
    sr.Write("m"); // or await sr.WriteAsync("m");
    sr.Flush(); // or await sr.FlushAsync("m");
}

sw.Stop();
Console.WriteLine("Completed " + N
    + " iterations in " + sw.ElapsedMilliseconds + " milliseconds.");

sr.Close();

从C#互动在我家PC上启动的输出是

在1毫秒内完成1000次迭代。

用于同步代码和

在43383毫秒内完成了1000次迭代。

异步的。

更新:我还注意到程序在FlushAsync中慢下来了。WriteAsync的工作速度与同步版本几乎相同。

欢迎所有意见。

Update 2*:正如@Cory Nelson在对他的回答的评论中提到的,FileStream.FlushAsync是一个用Task.Factory.StartNew实现的假async,所以它只增加了开销。当处理短消息时,与正在执行的工作相比,开销变得足够大,从而减缓了执行速度。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-31 19:08:18

当给定文件路径时,StreamWriter不会以异步模式打开其基础流。这可能会导致性能损失。如果要将其用于异步,则应该打开自己的Stream

代码语言:javascript
运行
复制
Stream s = new FileStream("G:\\file.file", FileMode.Create, FileAccess.Write,
                          FileShare.None, 4096,
                          FileOptions.Asynchronous | FileOptions.SequentialScan);
StreamWriter sr = new StreamWriter(s);

另外要注意的是,您的基准似乎没有捕捉到实际的使用情况。你真的是在写单字串,在每个字串之后都会脸红吗?

异步确实有一定数量的内存和GC开销,并且使用这种短暂的操作--尤其是StreamWriter.WriteAsync目前还没有为小写入进行优化--您肯定会看到比更常见的使用更多的开销。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41964095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档