Конференция "Сети" » Как увеличить скорость синхронного сокета [D7]
 
  • Евгений07 © (25.09.16 20:41) [0]
    Доброго времени!
    На компе 2 проги у меня должны общаться с помощью сокетов.
    На одной стороне - синхронный неблокирующий сокет.

     New(Timeout) ;
     Timeout.tv_sec := 0;
     Timeout.tv_usec := 10;

    . . .

       Len := SelectFDSet;
       Len := SelectFDSet;
       if (Len > 0) then
         if FD_IsSet(Sockett, FDSetR) then
       begin
         LenRead := recv(Sockett, BufRead, 4, 0);
         Flags := ReadInt(4);//читает Integer в переменную Flags
         if (Flags = 213) then begin
           ReadBuf(213, 0, 5, 4);//читает Integer и double  в свои переменные
         end;
       Len := SelectFDSet;
       if (OperWrite > 10) then
         if FD_IsSet(Sockett, FDSetW) then
       begin
           Len := LenWrite;
           LenWrite := Send(Sockett, BufWrite, Len, 0);
       end;
     end;


    Здесь приведен чуть сокращенный код, который хотелось бы ускорить. Обмен командами 5 - 15 переменных, объем буфера 20 - 60 байт.
    Как можно ускорить обмен?
  • Rouse_ © (25.09.16 23:11) [1]
    До какой скорости? Первое что вижу - пересмотреть протокол обмена и не дергать сокет почем зря на каждый чих, но и в этом варианте как есть, существенных тормозов по идее быть не должно (с клиенской стороны)
  • Германн © (26.09.16 00:58) [2]
    <OFFTOP>
    Может я ещё раз "ступлю", но я не понимаю как "скорость работы сокета" может зависеть от синхронности/асинхронности? Или от "блокирующего/неблокирующего" режима его работы.
    Имхо, это из той же самой оперы, что и мнения/убеждения о том, что доппотоки ускоряют работу любой программы.
    </OFFTOP>
  • Eraser © (26.09.16 02:25) [3]

    >
    > Евгений07 ©   (25.09.16 20:41) 

    по этому куску странного кода ответить на вопрос нельзя.
  • Евгений07 © (26.09.16 08:36) [4]

    > Rouse_ ©   (25.09.16 23:11) [1]

    Схема работы:
    1. Клиент может прерываться на отправление серверу информации (очень неравномерно).
    2. ДЛЛ на стороне клиента с этой оказией может проверить сокет сервера на наличие управляющей команды (очень не часто, но важно).
    > Германн ©   (26.09.16 00:58) [2]

    Если бы я мог и на клиенте сделать асинхронный сокет, обрабатывающий
    информацию сразу, то проблема бы похудела.
    А так получается я должен при каждой записи в сокет проверять его на чтение. А команд может быть несколько.

    На глаз в эмуляторе клиента задержка приема - передачи заметна.

    Нет ли технической возможности ускорить работу приведенного кода?
    Особенно на чтение?
  • NoUser © (26.09.16 22:51) [5]
    > Схема работы: 1. 2.

    Ууу - у меня в голове случилось КЗ, буду удлинять...


    > Если бы я мог и на клиенте сделать асинхронный сокет, обрабатывающий
    > информацию сразу, то проблема бы похудела.


    Так сделай, в чём вопрос?
    ( тока это, "асинхронный" априори ни разу не "сразу" )) )


    > А так получается я должен при каждой записи в сокет проверять его на чтение.


    А кому должен то, и в валюте или в рублях?


    > Нет ли технической возможности ускорить работу приведенного кода?
    > Особенно на чтение?


    "приведенного" нет, даже если добавить ещё два "Len := SelectFDSet", а в Timeout.tv_usec записать 1 в надежде, что твой "SelectFDSet" будет выполнен за 1/1000000 секунды.

    зы.
    Спокойно читаем теорию, смотрим примеры, пишем свой простой клиент/сервер
    (чтобы была точка отсчёта, что оно таки работало),
    а уж потом криптуем сферический вакуум во всякие ReadBuf(213 ...
  • Германн © (27.09.16 00:51) [6]

    >  Евгений07 ©   (26.09.16 08:36) [4]
    >
    > > Германн ©   (26.09.16 00:58) [2]
    >
    > Если бы я мог и на клиенте сделать асинхронный сокет

    А почему не можешь?
  • Pavia © (27.09.16 21:25) [7]

    > На одной стороне - синхронный неблокирующий сокет.

    RTFM. Такого не существует.


    > Может я ещё раз "ступлю", но я не понимаю как "скорость
    > работы сокета" может зависеть от синхронности/асинхронности?
    >  Или от "блокирующего/неблокирующего" режима его работы.
    >
    > Имхо, это из той же самой оперы, что и мнения/убеждения
    > о том, что доппотоки ускоряют работу любой программы.

    Может и зависеть к примеру сделает автор блокирующей сокет  у него скорость и поднимется.  А по поводу, доп потоков.   Недавно мерил sleep(1) в основном и и в доп потоке. Оказалось, что задержки разные, в доп потоках быстрее!


    > На глаз в эмуляторе клиента задержка приема - передачи заметна.

    Сделайте простой тест без вашей дллки. Скорость передачи на одном компьютере несколько миллионов байт- ваши команды могут обрабатываться до 1 миллиона штук. И на глаз команды никак не могут быть заметны. Даже если передавать по сети, задержки незаметны, так как типично составляют 40-60 мс, что меньшее порога 100 мс - порога заметности.

    Скорее всего проблема в вашей длл которая долго думает. Случаем это не СУБД?
 
Конференция "Сети" » Как увеличить скорость синхронного сокета [D7]
Есть новые Нет новых   [134427   +34][b:0][p:0.001]