HttpListener:根据内容写入输出流速度慢?

时间:2013-12-01 03:38:45

标签: c# .net stream httplistener

删除旧问题&完全重写,因为我已经在这方面做了很多工作来查明问题。我的问题是我正在编写一个带有自定义服务器的自定义CMS,以非常高的速度/吞吐量为目标,但是我注意到某些数据或数据模式会导致严重的减速(从0到55 + ms响应)时间)。我真的需要一个比我更好的人帮助这个,因为我对发生的事情一无所知,我怀疑.net框架中的一个错误,但我不知道它可能在哪里,一点点.net代码浏览我没有建议输出Stream做任何特定于数据的

我测试过的东西确定不是问题:

  • 内容的大小(更大的内容更快)
  • 内容的类型(相同内容类型之间的差异)
  • 大多数周围的代码(制作了一个极简主义项目来重现错误,站在大约15行,找到帖子底部的链接,包括重现它的数据,运行它,用2个URL测试,查看自己)。
  • 不是网页/缓存等问题,在Firefox中使用单个图像和CTRL + F5再现问题,删除图像的最后几个字节会在100%的时间内修复它,将它们添加回来会再次导致问题
  • 不存在输出流之外的问题(用目标内存流替换它不会显示问题)

如何重现问题:

  • 下载&运行项目
  • 使用您喜欢的浏览器并转到localhost:8080 / magicnumber
  • 用你想要的东西替换那个url中的magicnumber,你将收到的图像减去那个字节数

我的结果:

  • 使用该图像持续50ms左右
  • 将幻数提高到1000并不会影响到这一点
  • 再远一点(我认为大概是1080 ish?)它突然下降到0MS
  • 不确定是怎么回事,但似乎每次请求至少有两个请求,至少在Firefox中使用CTRL + F5,正确的情况下都是0ms,在错误的情况下,第一个仍然是0ms而另一个是50ms,我假设第一个只是检查文件缓存是否正常&我还在回答,但Firefox会关闭连接或什么?

任何帮助都非常感谢,将我的所有代表放在Bounty那里,因为我真的需要知道我是否沿着这条路走下去/获取更多信息来报告这个或者如果我走低层并做我自己的http.sys互操作(而且,最重要的是,如果错误仅在.net方面或更低级别,并且更低级别将无法修复它!)

示例文件是一个gziped数组,我的内容在db中预先缓存和预压缩,因此这代表了我需要发送的数据。

https://www.dropbox.com/s/ao63d7din939new/StackOverFlowSlowServerBug.zip

编辑:如果我有小提琴打开,有问题的测试回到0ms,我不知道该怎么做它到目前为止这意味着我发送一个主要的减速,当发送一些数据,这不是由数据类型但实际数据定义,如果我之间有小提琴,则不会发生这种情况。我很遗憾!

编辑2:用另一个浏览器测试只是为了确定,实际上它在IE上回到0ms所以我假设它可能实际上不是HttpListener错误而是Firefox错误,我将编辑我的问题&如果没有人另有建议,那就标记出来。如果是这种情况,任何人都知道我应该在哪里查看FF的代码来理解这个问题? (它肯定是一个问题,即使在他们一边,因为我再次比较2个文件,一个比另一个大,相同的文件格式,最大的一个总是需要0ms,最小的一个总是55ms!)

1 个答案:

答案 0 :(得分:4)

两个请求问题:

铬:

  • First request = favicon
  • 第二次请求=图片

火狐:

  • 第一个请求=选项卡的图像
  • 第二次请求=图片

更多相关内容:

http://forums.mozillazine.org/viewtopic.php?t=341179

https://bugzilla.mozilla.org/show_bug.cgi?id=583351

IE:

  • 仅显示提出一个请求

如果你通过提琴手发送请求,你就永远不会有两个人通过。

性能问题:

首先,您的演示应用中的计时器存在问题。每次异步请求处理程序触发时都会重新启动,这意味着在收到请求B时,可能会在请求A完成之前重新启动为请求A启动的计时器,因此您将无法获得正确的值。改为在ContinueWith回调中创建秒表。

其次我无法看到“magicnumber”会真正影响性能(除非它会导致异常被抛出)。我可以导致性能降低的唯一方法是发出大量并发请求并导致等待锁持续命中。

总结:我认为HttpListener类没有问题