IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Получение больших сообщений по Tcp/Ip (http://www.imho.ws/showthread.php?t=115709)

AcraL 25.02.2007 23:05

Получение больших сообщений по Tcp/Ip
 
Привет кто знает как помочь..
Проблемка: надо получить большие сообщения с очень большой частотой.

Попытка работать с event не учачно, я не успеваю считать сообщение приходить новое..
Читать в цикле тоже самое.

Использование бафера тоже не помогает, он переполняется...

Пытался увеличить бафер сокета не помогает...

Кто знает как помочь..

Зарание благодарю.

Павел 26.02.2007 15:28

Исходники в студию! И спецификацию больших сообщений то же.

crawler 26.02.2007 15:50

Создать менеджер на 20(скажем) тредов, по получению event, сообщение уходит на свободный тред, там обрабатывается, тред его кладет в буфер, и сообщает менеджеру что он свободен. Таким макаром ты будеш точно знать нагрузку, время обработки одного сообщения и т.п.
Хотя звучит странновато, что обработка сообщения берет больше времени чем получение нового. 1 пакет в 100 байт на 100Мбит приходит за 8микросекунд - для гигагерцного проца это до фига времени.

AcraL 26.02.2007 22:09

сообщения размером 32-64К
приходять каждые 1.5 мили

есть отдельный thread который читает и ложит в бафер.

вот тут и загвоздка как сделать этот thread.

PinGUIWin 27.02.2007 01:35

Цитата:

Сообщение от AcraL (Сообщение 1364523)
вот тут и загвоздка как сделать этот thread.

Прописать ему высокий приоритет и использовать спец. библиотеки (ассемблер) для копирования в выравненные буфера.

AcraL 27.02.2007 23:59

есть 2 таких объекта
у них высокий приоритет.

вот только что там про:
Цитата:

Сообщение от PinGUIWin (Сообщение 1364649)
использовать спец. библиотеки (ассемблер) для копирования в выравненные буфера.

где это найти

romanovi4 28.02.2007 16:43

Я использую для таких целеи класс RingBuffer. У класса есть внутреннии Array, куда записываются данные. По приходу дат они записываются в этот Array, в отдельном Thread эти даты потом обрабатываются.

PinGUIWin 28.02.2007 22:37

Цитата:

Сообщение от AcraL (Сообщение 1365255)
где это найти

Есть два пути -- самому все написать на ассемблере. Поставить processor pack для компилятора. Но в том и другом случае нужно будет читать документацию на процессор.
Программа под intel платформу?

AcraL 28.02.2007 23:05

Цитата:

Сообщение от romanovi4 (Сообщение 1365655)
Я использую для таких целеи класс RingBuffer. У класса есть внутреннии Array, куда записываются данные. По приходу дат они записываются в этот Array, в отдельном Thread эти даты потом обрабатываются.

У меня примерно так все и работает...
Но иногда не успеваю все прочитывать с сокета...

добавлено через 1 минуту
Цитата:

Сообщение от PinGUIWin (Сообщение 1365921)
Программа под intel платформу?

да, WinXp/2003

PinGUIWin 01.03.2007 00:03

Если прога пишется на C/C++, то читайте описание на:
1. __declspec( align( # ) )
2. На SSE2 инструкции от intel: http://www.intel.com/products/proces...uals/index.htm

Willow 01.03.2007 03:31

Цитата:

Сообщение от AcraL (Сообщение 1365936)
У меня примерно так все и работает...
Но иногда не успеваю все прочитывать с сокета...

Я так понимаю что все сводится к быстрому копировнаию памяти. У Касперски Криса есть книга "Техника оптимизации программ. Эффективное исспользование памяти".

Если пишеш на Си то стоит исспользовать интеловский компилер. + у интела есть профилеровщик VTune.

А еще есть проект FastCode в котором пишутся быстрые эквиваленты библиотечным функциям. Проект ориентирован на Дельфи, но там в основном все на асме, можно безболезненоо скопировать.

AcraL 13.03.2007 23:08

Цитата:

Сообщение от Willow (Сообщение 1366065)
VTune

вещь конечно хорошая, но кто мне ее купит...
начальство жадное...

добавлено через 2 минуты
Цитата:

Сообщение от PinGUIWin (Сообщение 1365973)
__declspec( align( # ) )

что это такое, не знаю :idontnow:
можешь рассказать, на сайте не смог найти по этому поводу ничего

PinGUIWin 13.03.2007 23:56

__declspec( align( выравнивание ) ) тип имя_массива[размер];
Так можно задать выравненный массив.
Т.е. адрес массива (адрес нулевого элемента) будет кратен значению выравнивание. Это позволяет использовать команды с выравненными данными, а они часто являются более быстрыми командами процессора.
Например __declspec( align( 32 ) ) unsigned __int32 g_aFrameBuffer[1024 * 1024];
PS. выравнивание -- целое число, степень 2.

AcraL 14.03.2007 01:10

т.е если я правильно понял, мне нужно опредилить мой баффер таким образом, и затем я могу с ним работать так же как я бы опредилил его
BYTE buff[1024]

PinGUIWin 14.03.2007 21:43

Абсолютно верно, только советую учитывать особенность многих компиляторов -- они мало что знают про SSE/SSE2.

AcraL 15.03.2007 12:38

ok


Часовой пояс GMT +4, время: 17:23.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.