Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么.Net核心异步流操作比同步操作慢得多?_C#_Asynchronous_.net Core_.net Core 3.1 - Fatal编程技术网

C# 为什么.Net核心异步流操作比同步操作慢得多?

C# 为什么.Net核心异步流操作比同步操作慢得多?,c#,asynchronous,.net-core,.net-core-3.1,C#,Asynchronous,.net Core,.net Core 3.1,我不希望在这个特定的命令行工具中有异步好处,但我也不希望有这么大的损失 在我的机器上,在重复运行的情况下,对于46 MB的输入文件(Git-2.27.0-64位.exe),异步版本始终慢7倍左右 我发现处理outputFile流需要如此长的时间(平均约16秒),尽管它前面有一个显式的Flush/FlushAsync——但是同步调用和异步调用都是这样,所以它们之间没有区别 在异步版本中,ConfigureAwait(false)在这个特定的线束中似乎没有太大的区别(我真的没想到它会这样) 在Co

我不希望在这个特定的命令行工具中有异步好处,但我也不希望有这么大的损失

在我的机器上,在重复运行的情况下,对于46 MB的输入文件(Git-2.27.0-64位.exe),异步版本始终慢7倍左右

  • 我发现处理
    outputFile
    流需要如此长的时间(平均约16秒),尽管它前面有一个显式的
    Flush
    /
    FlushAsync
    ——但是同步调用和异步调用都是这样,所以它们之间没有区别
  • 在异步版本中,
    ConfigureAwait(false)
    在这个特定的线束中似乎没有太大的区别(我真的没想到它会这样)
  • CopyTo
    /
    copytosync
    中使用缓冲区大小似乎并没有缩小差距
异步结果示例:

\Base64\bin\Release\netcoreapp3.1>Base64.exe
WriteFile completed in 00:02:40.5583442
Flushing outputFile
Flush outputFile completed in 00:00:00.0010565
disposing outputFile
disposed outputFile in 00:00:15.7304240
disposing base64Stream
disposed base64Stream in 00:00:00.0029926
disposing inputFile
disposed inputFile in 00:00:00.0002473
disposing base64Transform
disposed base64Transform in 00:00:00.0020258
Total Elapsed: 00:02:56.3132804
\Base64\Base64\bin\Release\netcoreapp3.1>Base64.exe
WriteFile completed in 00:00:08.9381189
Flushing outputFile
Flush outputFile completed in 00:00:00.0016328
disposing outputFile
disposed outputFile in 00:00:16.5799980
disposing base64Stream
disposed base64Stream in 00:00:00.0046472
disposing inputFile
disposed inputFile in 00:00:00.0019350
disposing base64Transform
disposed base64Transform in 00:00:00.0014333
Total Elapsed: 00:00:25.5501378
同步结果示例:

\Base64\bin\Release\netcoreapp3.1>Base64.exe
WriteFile completed in 00:02:40.5583442
Flushing outputFile
Flush outputFile completed in 00:00:00.0010565
disposing outputFile
disposed outputFile in 00:00:15.7304240
disposing base64Stream
disposed base64Stream in 00:00:00.0029926
disposing inputFile
disposed inputFile in 00:00:00.0002473
disposing base64Transform
disposed base64Transform in 00:00:00.0020258
Total Elapsed: 00:02:56.3132804
\Base64\Base64\bin\Release\netcoreapp3.1>Base64.exe
WriteFile completed in 00:00:08.9381189
Flushing outputFile
Flush outputFile completed in 00:00:00.0016328
disposing outputFile
disposed outputFile in 00:00:16.5799980
disposing base64Stream
disposed base64Stream in 00:00:00.0046472
disposing inputFile
disposed inputFile in 00:00:00.0019350
disposing base64Transform
disposed base64Transform in 00:00:00.0014333
Total Elapsed: 00:00:25.5501378
异步测试

static async Task Main(字符串[]args)
{
var totalStopWatch=新秒表();
totalStopWatch.Start();
var stopWatch=新秒表();
秒表。开始();
使用(var base64Transform=new ToBase64Transform())
{
等待使用(FileStream inputFile=newfilestream(@“Git-2.27.0-64-bit.exe”、FileMode.Open、FileAccess.Read))
{
等待使用(CryptoStream base64Stream=新加密流(inputFile、base64Transform、CryptoStreamMode.Read))
{
等待使用(FileStream outputFile=newfilestream($@“outfile{Guid.NewGuid()}.html”,FileMode.CreateNew,FileAccess.Write))
{
等待outputFile.WriteAsync(Encoding.UTF8.GetBytes(@)
base64编码测试
“”),配置等待(假);
WriteLine($“WriteFile已在{stopWatch.appeased}中完成”);
stopWatch.Restart();
WriteLine($“Flushing{nameof(outputFile)}”);
await outputFile.FlushAsync().ConfigureAwait(false);
WriteLine($“刷新{nameof(outputFile)}在{stopWatch.appeased}中完成”);
stopWatch.Restart();
WriteLine($“disposing{nameof(outputFile)}”);
}
WriteLine($“在{stopWatch.appeased}中释放的outputFile”);
stopWatch.Restart();
WriteLine($“disposing{nameof(base64Stream)}”);
}
WriteLine($“在{stopWatch.appeased}中释放base64Stream”);
stopWatch.Restart();
WriteLine($“disposing{nameof(inputFile)}”);
}
WriteLine($“在{stopWatch.appeased}中处理的inputFile”);
stopWatch.Restart();
WriteLine($“disposing{nameof(base64Transform)}”);
}
WriteLine($“在{stopWatch.appeased}中处理base64Transform”);
WriteLine($“总运行时间:{totalStopWatch.appeased}”);
}
同步测试

static void Main(字符串[]args)
{
var totalStopWatch=新秒表();
totalStopWatch.Start();
var stopWatch=新秒表();
秒表。开始();
使用(var base64Transform=new ToBase64Transform())
{
使用(FileStream inputFile=newfilestream(@“Git-2.27.0-64-bit.exe”、FileMode.Open、FileAccess.Read))
{
使用(CryptoStream base64Stream=新加密流(inputFile、base64Transform、CryptoStreamMode.Read))
{
使用(FileStream outputFile=newfilestream($@“outfile{Guid.NewGuid()}.html”、FileMode.CreateNew、FileAccess.Write))
{
outputFile.Write(Encoding.UTF8.GetBytes(@)
base64编码测试
"));
WriteLine($“WriteFile已在{stopWatch.appeased}中完成”);
stopWatch.Restart();
WriteLine($“Flushing{nameof(outputFile)}”);
outputFile.Flush();
WriteLine($“刷新{nameof(outputFile)}在{stopWatch.appeased}中完成”);
stopWatch.Restart();
WriteLine($“disposing{nameof(outputFile)}”);
}
WriteLine($“在{stopWatch.appeased}中释放的outputFile”);
stopWatch.Restart();
WriteLine($“disposing{nameof(base64Stream)}”);
}
WriteLine($“在{stopWatch.appeased}中释放base64Stream”);
stopWatch.Restart();
WriteLine($“disposing{nameof(inputFile)}”);
}
WriteLine($“在{stopWatch.appeased}中处理的inputFile”);
stopWatch.Restart();
WriteLine($“disposing{nameof(base64Transform)}”);
}
WriteLine($“在{stopWatch.appeased}中处理base64Transform”);
WriteLine($“总运行时间:{totalStopWatch.appeased}”);
}

您是否尝试过在
文件流的构造函数中将
isAsync
设置为
true
(使用重叠I/O模式)以便
WinApi
使用该结构?无论如何,您不太可能从任何正常意义上的
async
方法中获得任何性能好处。请尝试使用
FileOptions。Asynchronous
我不希望获得异步好处。我在找一个关于巨额罚款的解释。我错过了FileOptions.Asynchrounous作为构造函数选项。我会试试看。@Andy-正如我在问题中所说的,我不希望在这个场景中有异步的好处。我对这个巨大的点球感到惊讶。在某些情况下,异步io可能会有所帮助。学习场景和实验并不总是为了立即投入生产使用。它们对于获得理解仍然很有用