C#StreamReader导致+;从源读取数据的200毫秒开销

C#StreamReader导致+;从源读取数据的200毫秒开销,c#,.net,service,streamreader,C#,.net,Service,Streamreader,存在这样一个问题:当系统上有负载时,从流读取器读取输入流时,我们会看到周期性的+200ms开销。我想知道是否有其他人看到了这一点,如果他们做了什么来修复它 代码如下: ReadLine如下所示: 公共静态IEnumerable读线(此StreamReader) { 而(!reader.EndOfStream) { 产生返回reader.ReadLine(); } } 注意:使用ReadLines()或ReadToEnd()的区别很小(如果有的话) 我们在一夜之间运行性能测试,通过绘制stre

存在这样一个问题:当系统上有负载时,从流读取器读取输入流时,我们会看到周期性的+200ms开销。我想知道是否有其他人看到了这一点,如果他们做了什么来修复它

代码如下:

ReadLine如下所示:

公共静态IEnumerable读线(此StreamReader)
{
而(!reader.EndOfStream)
{ 
产生返回reader.ReadLine();
}
}
注意:使用ReadLines()或ReadToEnd()的区别很小(如果有的话)

我们在一夜之间运行性能测试,通过绘制streamReaderTime,我们看到了以下行为

单个请求的执行时间在45到70毫秒之间,但从屏幕截图可以看出,它增加了一个固定值,有时甚至更大的峰值。我在大约1.5秒的时候看到了它

如果任何人有任何解决方案/建议,将不胜感激


编辑:我确实使用了ReadToEnd()而不是ReadLines(),并且去掉了StringBuilder,但开销仍然相同。是否有一种替代StreamReader的方法,只是测试一下?这看起来确实像是GC成本,因为每十秒钟发出一个请求都不会影响它,但是每秒完全相同的请求会导致这种开销的发生。此外,我也无法在本地复制它,只有在虚拟环境中才会发生这种情况。

上述代码根本不存在此问题。问题出在打电话的人身上。服务调用正在使用一个库,该库正在早期切断连接,开销是重新建立连接。

上述代码根本不存在此问题。问题出在打电话的人身上。服务调用正在使用一个库,该库正在早期切断连接,开销是重新建立连接。

忘记添加,平均负载大小约为62.6 KiB。有效负载大小似乎没有任何影响。您的代码会生成大量垃圾,秒表很有可能会测量垃圾收集开销。我确实使用了ReadToEnd()而不是ReadLines(),并且去掉了StringBuilder,但开销仍然相同。是否有StreamReader的替代方案?这看起来确实像是GC成本,因为每十秒钟发出一个请求都不会影响它,但每秒一个请求会导致这种开销的发生。我也不能在本地复制它。我将用这些细节更新我的问题。忘记添加,平均有效负载大小约为62.6kib。有效负载大小似乎没有任何影响。您的代码会生成大量垃圾,秒表很有可能会测量垃圾收集开销。我确实使用了ReadToEnd()而不是ReadLines(),并且去掉了StringBuilder,但开销仍然相同。是否有StreamReader的替代方案?这看起来确实像是GC成本,因为每十秒钟发出一个请求都不会影响它,但每秒一个请求会导致这种开销的发生。我也不能在本地复制它。我将用这些细节更新我的问题。
string requestBody;
var streamReaderTime = Stopwatch.StartNew();
using (var streamReader = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding))
{
    var allLines = streamReader.ReadLines();
    var request = new StringBuilder();
    allLines.ForEach(line => request.Append(line));
    requestBody = request.ToString();
}
streamReaderTime.Stop();
public static IEnumerable<string> ReadLines(this StreamReader reader)
{
   while (!reader.EndOfStream)
   { 
     yield return reader.ReadLine();
   }
}