Должен ли я увеличить размер буфера для повышения производительности при повторяющихся запросах GET?

Я пишу программу .NET на С#, которая делает запросы GET и загружает страницы для анализа - своего рода сканер. Я заметил, что для загрузки каждой страницы приходится читать из потока несколько раз, потому что каждая страница очень большая.

В настоящее время я установил размер буфера потока на 5024 байта. Мой вопрос: было бы более эффективно увеличить этот размер и, следовательно, выполнять меньше потокового чтения? Или лучше обрабатывать меньше данных за раз, из которых можно парсить?

В основном сформулировано по-другому - быстрее ли анализировать больше данных одновременно и реже вызывать stream.read или наоборот?

Спасибо!


person blizz    schedule 20.01.2012    source источник
comment
Если бы изначально было 1024, было бы разумнее изменить его на 2048, 8192 или какое-то другое красивое круглое число. Но почему бы вам просто не профилировать это? Измените его на 64k и измерьте.   -  person Groo    schedule 21.01.2012


Ответы (1)


Хотя, как правило, увеличение размера буфера и помещение большего количества данных за один раз увеличивает скорость операции, прирост производительности в лучшем случае будет минимальным. Вместо этого я думаю, что вы хотите попробовать асинхронный запрос. Что-то вроде этого. Это позволяет приложению использовать пул потоков для одновременного чтения из сокета или нескольких, а затем работать с потоком только тогда, когда есть над чем работать. Это освобождает приложение для выполнения других задач, пока данные загружаются в буфер.

person Dabloons    schedule 21.01.2012
comment
Я никогда не работал с асинхронными операциями, и это моя первая попытка многопоточного приложения, поэтому, пожалуйста, извините меня, если я кажусь невежественным... Я надеялся использовать разделенные потоки - один пул для загрузки в очередь списка URL-адреса, которые необходимо проанализировать, и один пул для загрузки и анализа URL-адресов в очереди. Возможно ли это без асинхронных вызовов? - person blizz; 21.01.2012
comment
@ user1115071 Это абсолютно возможно. Однако это не будет эффективно. Поток, загружающий веб-страницу, будет заблокирован до тех пор, пока страница не будет полностью загружена, а затем перейдет к синтаксическому анализу. Ваше замедление, я подозреваю, не в вашем буфере, а в том, что синхронная загрузка страницы приводит к полной остановке потока. Однако, чтобы выполнить то, что вы ищете, просто напишите две отдельные функции, которые выполняют две разные части работы и имеют между собой некоторый общий объект. Вы бы начали такие потоки, как Thread t1 = new Thread(function1name); t1.старт(); - person Dabloons; 21.01.2012