C#StreamReader导致+ 200ms开销从源读取数据

时间:2016-10-18 16:03:23

标签: c# .net service streamreader

当系统出现负载时,我们看到从Stream Reader读取输入流时会出现一些周期性的+ 200ms开销。我想知道有没有其他人看到这个,如果他们做了什么来解决它?

  

以下是代码:

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();
  

ReadLine如下:

public static IEnumerable<string> ReadLines(this StreamReader reader)
{
   while (!reader.EndOfStream)
   { 
     yield return reader.ReadLine();
   }
}

注意:如果有的话,使用ReadLines()或ReadToEnd()会产生很小的差别。

我们在一夜之间进行性能测试,我们只是通过绘制streamReaderTime来看到以下行为。

enter image description here

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

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

编辑:我确实有ReadToEnd()而不是ReadLines(),并且摆脱了StringBuilder,但它仍然是相同的开销。有没有StreamReader的替代品,只是为了测试甚至?它看起来像GC成本,因为有一个请求永远不会影响它,但每秒完全相同的请求将导致这种开销发生。此外,我也无法在本地重现它,只是在虚拟环境中才会发生这种情况。

1 个答案:

答案 0 :(得分:0)

此问题根本不适用于上述代码。问题来自呼叫者。服务调用使用的库正在切断早期的连接,而开销是重新建立的连接。