Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Как увеличить скорость синхронного сокета [D7]


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

Доброго времени!
На компе 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 мс - порога заметности.

Скорее всего проблема в вашей длл которая долго думает. Случаем это не СУБД?


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо