xNet. Запросы HTTP с KeepAlive = True

vmc

Client
Регистрация
15.03.2015
Сообщения
72
Благодарностей
13
Баллы
8
Всем привет.
Реализовываю Keepalive через форк xNet: Leaf.xNet.

Для сравнения стандартного стандартного варианта ZennoPoster.HttpGet и варианта с библиотекой HttpRequest создал два цикла. Результат у Zennoposter стабильно лучше на пару две-три секунды за 10 запросов подряд.

Также сравнил HttpRequest c KeepAlive=True и KeepAlive=False. Разницы во времени обработки десяти запросов никакой.

Вопрос: верно ли я использую запрос с KeepAlive? Если да, то почему ZennoPoster.HttpGet обгоняет его? Или я использую KeepAlive неверно, а ZennoPoster.HttpGet как раз и использует по умолчанию KeepAlive?

Код для теста:
// Предварительно требуется добавить библиотеку Leaf.xNet.dll

string url = "http://yandex.ru";
string response = "" ;
project.SendInfoToLog(DateTimeOffset.UtcNow.ToString()) ;

//=============================
// KeepAlive=true
using (HttpRequest request = new HttpRequest())
{
    request.KeepAlive = true ;
    for ( int i=1 ; i<=10 ; i++ )
    {
        response = request.Get(url).ToString() ;
    }
    
}
project.SendInfoToLog(DateTimeOffset.UtcNow.ToString()) ;

//=============================
// KeepAlive=false
using (HttpRequest request = new HttpRequest())
{
    request.KeepAlive = false ;
    for ( int i=1 ; i<=10 ; i++ )
    {
        response = request.Get(url).ToString() ;
        request.Close();
    }
}
project.SendInfoToLog(DateTimeOffset.UtcNow.ToString()) ;

//=============================
// Стандартный метод Zenno
for ( int i=1 ; i<=10 ; i++ )
{
    response = ZennoPoster.HttpGet(url, "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody);
}
project.SendInfoToLog(DateTimeOffset.UtcNow.ToString()) ;

//project.SendInfoToLog( i.ToString() + " " + response ) ;
 

Вложения

  • Спасибо
Реакции: orka13

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 366
Благодарностей
3 292
Баллы
113
  • Спасибо
Реакции: orka13 и vmc

vmc

Client
Регистрация
15.03.2015
Сообщения
72
Благодарностей
13
Баллы
8

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 366
Благодарностей
3 292
Баллы
113

vmc

Client
Регистрация
15.03.2015
Сообщения
72
Благодарностей
13
Баллы
8
Его суть, что он потоки не закрывает сразу, а переиспользует.
Да, это я понял из описания) Я не знал, что есть такая настройка. В темах ранее читал, что xNet поддерживает KeepAlive, а стандартные методы Zennoposter не поддерживают.
Не понимал, почему без указания KeepAlive=True стандартные методы работают быстрее. Оказалось, KeepAlive=True работает по умолчанию в 5.27 и выше. Теперь всё ясно.
И, всё-таки, в том коде, который я указал с xNet, и при KeepAlive=True и при KeepAlive=False скорость одинаковая. Здесь до сих пор загадка)
Возможно, это не так и важно, потому что стандартные методы Zennoposter показали скорость выше, чем xNet.
Скорректированный код с возвращением времени:
string url = "http://yandex.ru";
string response = "" ;

DateTime time1 = DateTime.Now ;

//=============================
// KeepAlive=true
using (HttpRequest request = new HttpRequest())
{
    request.KeepAlive = true ;
    for ( int i=1 ; i<=10 ; i++ )
    {
        response = request.Get(url).ToString() ;
    }
 
}

DateTime time2 = DateTime.Now ;
TimeSpan ts = (time2 - time1) ;
project.SendInfoToLog( "KeepAlive = true: " + ts.Seconds ) ;
time1 = time2 ;

//=============================
// KeepAlive=false
using (HttpRequest request = new HttpRequest())
{
    request.KeepAlive = false ;
    for ( int i=1 ; i<=10 ; i++ )
    {
        response = request.Get(url).ToString() ;
        request.Close();
    }
}

time2 = DateTime.Now ;
ts = (time2 - time1) ;
project.SendInfoToLog( "KeepAlive = false: " + ts.Seconds ) ;
time1 = time2 ;

//=============================
// Стандартный метод Zenno
for ( int i=1 ; i<=10 ; i++ )
{
    response = ZennoPoster.HttpGet(url, "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody);
}

time2 = DateTime.Now ;
ts = (time2 - time1) ;
project.SendInfoToLog( "ZennoPoster.HttpGet: " + ts.Seconds ) ;
time1 = time2 ;
 

vmc

Client
Регистрация
15.03.2015
Сообщения
72
Благодарностей
13
Баллы
8
Его суть, что он потоки не закрывает сразу, а переиспользует.
А если пост-запрос с авторизацией?
То есть, вопрос в том, HTTP Pool создаёт туннель (или что-то другое создаёт), а далее внутри этого туннеля неважно: с авторизацией запросы или без, они всё равно используют уже созданное соединение или запросы с авторизацией заново создают соединение?
И, HTTP Pool - он включает в заголовки Connection:KeepAlive или какие-то другие методы дополнительно использует для ускорения?
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)