Я тестировал производительность запроса в Rust, но почему-то выполнение response.text().await занимает добрых 1-3 секунды. Я тестировал ту же самую страницу с почтальоном и Firefox, и это занимает всего 100-300 мс. Я пробовал несколько раз, и каждый раз Postman и Firefox работали быстрее.
Я также пробовал использовать Hyper с .aggregate() и пробовал использовать .bytes() и .chunk() reqwest, и все они такие же медленные. Интересно то, что .send().await занимает обычные 100-300 мс, как и должно быть. Вызов .content_length() также вполне эффективен. Я также пробовал использовать Javascript fetch() и вызывать await response.json(), но это наверняка быстрее.
Кроме того, это не имеет никакого отношения к сборке выпуска, поскольку запуск exe-файла вручную выполняется так же медленно. Rust и reqwest также полностью обновлены.
Вот код:
use std::time::Instant;
#[tokio::main]
async fn main() {
let client = reqwest::Client::new();
let response = client
.get("https://registry.npmjs.org/react")
.send()
.await
.unwrap();
let now = Instant::now();
let data = response.text().await;
let elapsed = now.elapsed();
println!("{}ms", elapsed.as_millis());
}
Использование reqwest::blocking также не имеет значения:
use std::time::Instant;
fn main() {
let now = Instant::now();
let data = reqwest::blocking::get("https://registry.npmjs.org/react")
.unwrap()
.text()
.unwrap();
let elapsed = now.elapsed();
println!("{}ms", elapsed.as_millis());
}
Время, необходимое для запроса, уменьшается, если я запрашиваю конечную точку с меньшим количеством данных. Например https://registry.npmjs.org/react/is-even занимает 300 мс с запросом, но все равно 70 мс с Postman.
Есть идеи, что является причиной этого?
Да, я уверен, просто чтобы убедиться, что я также отключил VPN в настройках Windows и попробовал еще раз. Что для меня действительно странно, так это то, что использование Curl обеспечивает очень похожее время загрузки, однако Firefox делает это в 5 раз быстрее. Я убедился, что он не кешируется, запросив новый пакет, но Firefox, безусловно, быстрее. Наверное, мне здесь не хватает чего-то простого, хаха
Да, и еще одно замечание: я попробовал то же самое в Fedora вместо Windows, и это заняло столько же времени.
Firefox передает accept-encoding: gzip, deflate, br, на что Registry.npmjs.org отвечает данными в формате gzip (content-encoding: gzip), что может значительно уменьшить размер полезной нагрузки. При этом время запроса на моей машине сокращается с 350 мс до ~ 240 мс, а затем снова, если соединение TLS используется повторно, общее время может снизиться до ~ 120 мс. Кстати, у reqwest есть функция "gzip", которая проанализирует его за вас.
Очаровательный! На самом деле я просто читал документацию реестра и там упоминался заголовок Accept: application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*. Похоже, это делает то же самое и ускоряет поиск в 2 раза. Учитывая, что у вас, вероятно, более быстрый Интернет, чем у меня, и вы можете быть ближе к серверу распространения, это имеет смысл! Я также нашел способ использовать {registry}/{package}/{version} вместо этого, чтобы получить значительно меньшие размеры тела. Спасибо за помощь!





На самом деле существует множество факторов, которые приводят к такому неожиданному результату. Вот наши выводы.
application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */* (согласно документам реестра NPM), чтобы значительно уменьшить размер полезной нагрузки и выполнить запрос быстрее. Вы также можете сделать Content-Encoding: gzip, но это немного медленнее.GET·/{package}/{version} вместо GET·/{package} в дополнение к заголовку — гораздо лучшее решение, если это возможно в вашем приложении.Обратите внимание, что эти результаты не являются на 100% достоверными, а являются предположениями. Я обновлю этот ответ, если найду дополнительную информацию. Приятного кодирования!
Я не умею воспроизводить. И около 350 мс для
/react, и около 120 мс для/is-evenс моей машины. Мой внешний HTTP-клиент иногда работает немного быстрее (до 100 мс быстрее), но это было только тогда, когда он повторно использовал соединение и, таким образом, пропускал стоимость установления связи TLS. Но даже это не объясняет 3 секунды в вашем случае. Вы уверены, что ваш код Rust работает в тех же сетевых условиях, что и Firefox и Postman (т. е. VPN, прокси-сервер или дополнительный брандмауэр)?