Как не замусоривать экран при совершении HTTP-запросов средствами модуля Net::Curl::Easy

Чисто перловые HTTP-клиенты, включая широко известный модуль LWP — не самые быстрые, что вполне логично. Гораздо быстрее работают, например, те модули, что используют cURL. В одном из рабочих проектов понадобилось ускорить чтение из сети — это оказалось узким местом. Я проверил — действительно, cURL работает шустрее, чем LWP, при этом к cURL в перле есть несколько интерфейсов. Результаты моего замера вышли такими:

                    Rate     LWP WWW::Curl::Simple   Net::Curl::Easy
LWP                474/s      --              -38%              -88%
WWW::Curl::Simple  760/s     60%                --              -82%
Net::Curl::Easy   4115/s    768%              441%                --

(под LWP здесь понимается LWP::UserAgent).

Шустрый LWP::Curl выбыл из соревнования, потому что я не нашёл, как в нём добавить нужный заголовок к HTTP-запросу. Был проверен ещё и WWW::Curl::Easy — он показал ту же скорость, что и Net::Curl::Easy, вывалив при этом кучу предупреждений — так что он тоже выбыл из забега.

Однако при проведении замера я столкнулся со странным поведением Net::Curl::Easy — при выполнении метода perform на экран (точнее, в STDOUT) иногда выводились полученные данные. Выяснилось, что правильный способ запуска описан в руководстве не на Net::Curl::Easy, а на WWW::Curl — надо не только выполнить запрос, но и указать до выполнения запроса, куда писать полученное содержимое:

# A filehandle, reference to a scalar
# or reference to a typeglob can be used here.
my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);

В Net::Curl::Easy это тоже сработало.