HttpListener: запись в выходной поток медленнее в зависимости от содержимого?

Убрал старый вопрос и переписал полностью, потому что я немного поработал над этим, чтобы определить проблему. Моя проблема в том, что я пишу пользовательскую CMS с настраиваемым сервером с очень высокой скоростью/тщательностью в качестве цели, однако я замечаю, что некоторые данные или шаблоны данных вызывают серьезные замедления (переход от 0 до 55 + мс ответ время). Мне действительно нужен кто-то лучше, чем я помогаю в этом, так как я абсолютно не понимаю, что происходит, я подозреваю ошибку в .net Framework, но я понятия не имею, где это может быть, небольшой просмотр кода .net я не предполагал, что выходной поток делает что-то специфическое для данных

Вещи, которые я тестировал и уверен, не являются проблемой:

  • Размер содержимого (более крупное содержимое быстрее)
  • Тип содержимого (разница между теми же типами контента)
  • Большая часть окружающего кода (сделанная минималистским проектом для воспроизведения ошибки, стоящая около 15 строк, находит ссылку внизу сообщения, включает в себя данные для ее воспроизведения, запускает ее, тестирует с 2 URL-адресами, см. себя).
  • Не проблема с веб-страницами/кешем и т.д., проблема с воспроизведением с одним изображением и CTRL + F5 в Firefox, удаление последних нескольких байтов изображения исправляет его в 100% случаев, добавив их обратно, снова вызывает проблему
  • Не проблема, которая существует вне выходного потока (заменяя его целевым запоминающим устройством, не показывает проблему)

Как воспроизвести проблему:

  • Загрузите и запустите проект
  • Используйте свой любимый браузер и перейдите на localhost: 8080/magicnumber
  • замените magicnumber в этом URL-адресе тем, что вы хотите, вы получите обратное изображение минус это количество байтов

Мой результат:

  • Постоянная 50 мс или около того с этим изображением
  • Получение магического номера до 1000 не влияет на это вообще
  • немного дальше (я думаю, около 1080 иш?) он suddently падает до 0MS
  • Не уверен, что происходит, но кажется, что есть два запроса на запрос, по крайней мере, при использовании CTRL + F5 в Firefox, в правильном случае оба равны 0 мс, в случае ошибки первое остается 0 мс, а второе - 50 мс, Я предполагаю, что первый из них просто проверяет, нормально ли кеш файл, и я все еще отвечаю, но Firefox закрывает соединение или что-то в этом роде.

Любая помощь очень ценится, помещая весь мой репут на Bounty, так как мне действительно нужно знать, могу ли я пойти по этому пути/получить больше информации, чтобы сообщить об этом, или если я пойду на более низкий уровень и сделаю свой собственный http.sys interop ( и, прежде всего, если ошибка будет только на стороне .net или ниже, а нижний уровень не исправит ее!)

Образец файла представляет собой массив gziped, мой контент предварительно кэшируется и предварительно сжимается в db, поэтому это представление данных, которые мне нужно отправить.

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

Изменить: если у меня есть скрипт, проблемный тест вернется к 0 мс, я не уверен, что делать с ним до сих пор, это означает, что я получаю значительное замедление при отправке некоторых данных, что не определяемый типом данных, но фактическими данными, и это не происходит, если у меня есть скрипач между ними. Я в потере!

Редактировать 2: Протестировано другим браузером, чтобы быть уверенным, и на самом деле он вернулся к 0 мс в IE, поэтому я предполагаю, что это может быть не ошибка HttpListener, но вместо этого ошибка Firefox, я отредактирую свой вопрос и теги в сторону что, если никто не предлагает иного. Если это так, кто-нибудь знает, где я должен искать код FF, чтобы понять проблему? (это определенно проблема, даже если на их стороне, так как я снова сравниваю с 2 файлами, один больше, чем другой, тот же формат файла, самый большой из них всегда занимает 0 мс, самый маленький - всегда 55 мс!)

Ответы

Ответ 1

Проблема с двумя запросами:

Chrome:

  • Первый запрос = favicon
  • Второй запрос = изображение

Firefox:

  • Первый запрос = изображение для вкладки
  • Второй запрос = изображение

Подробнее об этом:

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

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

IE:

  • Показывается только один запрос

Если вы отправляете запросы через скрипач, вы никогда не получите два.

Проблема производительности:

Во-первых, проблема с таймером в вашем демонстрационном приложении. Он перезапускается каждый раз, когда запускается обработчик асинхронного запроса, что означает, что таймер, запущенный для запроса A, будет перезапущен при получении запроса B, возможно, до того, как запрос A будет завершен, поэтому вы не получите правильные значения. Создайте секундомер внутри обратного вызова ContinueWith.

Во-вторых, я все равно не вижу, что "magicnumber" действительно повлияет на производительность (если только это не приведет к выбросу исключения, я думаю). Единственный способ, которым я могу привести к ухудшению производительности, - это выпустить много одновременных запросов и постоянно блокировать блокировку ожидания.

В заключение: я не думаю, что проблема с классом HttpListener