Страница 40 из 42
Re: Технология создания плагинов и программ-дополнений
Добавлено: 17:52, 29.06.2010
DIGGER
Во-первых память более оптимизированно юзается
Да Вы что? Вам дают кусок памяти, Вы копируете его по частям (о ужас!) и это у Вас "
оптимизированно"?
Так скопируйте ещё разков 100 память с места на место, если так лучше по Вашему
сравнивать собственно не с чем
Вот сравните:
Код: Выделить всё
.IF ShowIP==1
MOV EAX,20202020h
MOV DWORD PTR[StrIP ],EAX ; заполняем пробелами
MOV DWORD PTR[StrIP+ 4],EAX
MOV DWORD PTR[StrIP+ 8],EAX
MOV EAX,09202020h
MOV DWORD PTR[StrIP+12],EAX
; копируем с bMessage в StrIP
MOV EAX,[bMessage]
MOV ECX,[EAX] ; Размер "Имя пользователя"
ADD EAX,4
ADD EAX,ECX
MOV ECX,[EAX] ; Размер "IP адресс"
PUSH ECX ; dwCount
ADD EAX,4
PUSH EAX ; "IP адресс"
LEA EAX,DWORD PTR[StrIP]
PUSH EAX ; pDest
CALL RtlMoveMemory
; копируем с StrIP в CommFort_msg
PUSH LENGTHOF StrIP;16
LEA EAX,DWORD PTR[StrIP]
PUSH EAX ; pSrc
LEA EAX,DWORD PTR [CommFort_msg+16]
ADD EAX,DWORD PTR [CommFort_msg+12]
PUSH EAX ; pDest
CALL RtlMoveMemory
ADD DWORD PTR [CommFort_msg+12],LENGTHOF StrIP;16; Добавляем к размеру посылаемого текста
.ENDIF
Работаем с полученным указателем
(bMessage) на память
(без всяких нулей в конце), копируем память только один раз и сразу на своё финальное место в выходной строке
(CommFort_msg)
P.S. Если я купил быстрый проц, то это вовсе не значит что он у меня простаивает и мне его нечем занять.
Re: Технология создания плагинов и программ-дополнений
Добавлено: 18:45, 29.06.2010
$teelR@t
DIGGER писал(а):Да Вы что? Вам дают кусок памяти, Вы копируете его по частям (о ужас!) и это у Вас "
оптимизированно"?
Так скопируйте ещё разков 100 память с места на место, если так лучше по Вашему
сравнивать собственно не с чем
Вот сравните:
Код: Выделить всё
.IF ShowIP==1
MOV EAX,20202020h
MOV DWORD PTR[StrIP ],EAX ; заполняем пробелами
MOV DWORD PTR[StrIP+ 4],EAX
MOV DWORD PTR[StrIP+ 8],EAX
MOV EAX,09202020h
MOV DWORD PTR[StrIP+12],EAX
; копируем с bMessage в StrIP
MOV EAX,[bMessage]
MOV ECX,[EAX] ; Размер "Имя пользователя"
ADD EAX,4
ADD EAX,ECX
MOV ECX,[EAX] ; Размер "IP адресс"
PUSH ECX ; dwCount
ADD EAX,4
PUSH EAX ; "IP адресс"
LEA EAX,DWORD PTR[StrIP]
PUSH EAX ; pDest
CALL RtlMoveMemory
; копируем с StrIP в CommFort_msg
PUSH LENGTHOF StrIP;16
LEA EAX,DWORD PTR[StrIP]
PUSH EAX ; pSrc
LEA EAX,DWORD PTR [CommFort_msg+16]
ADD EAX,DWORD PTR [CommFort_msg+12]
PUSH EAX ; pDest
CALL RtlMoveMemory
ADD DWORD PTR [CommFort_msg+12],LENGTHOF StrIP;16; Добавляем к размеру посылаемого текста
.ENDIF
Работаем с полученным указателем
(bMessage) на память
(без всяких нулей в конце), копируем память только один раз и сразу на своё финальное место в выходной строке
(CommFort_msg)
P.S. Если я купил быстрый проц, то это вовсе не значит что он у меня простаивает и мне его нечем занять.
Я сравнивал с предыдущим примером
. Такое ощущение что мы тут щас обсуждаем программирование микрокалькулятора. Если бы я программировал на асме, то определённо я бы юзал этот код, но так как у меня не достаточно времени для реализации всех функций на асме, то я юзаю C++
. Не каждый плагин для комфорта требует настолько низко-уровневое программирование, да и железо сервера спокойно выдержит достаточно большую нагрузку без применения кода ассемблера. Мы тут не олимпиадные задачки по программированию решаем, а пишем плагин для серверного приложения.
Re: Технология создания плагинов и программ-дополнений
Добавлено: 19:04, 29.06.2010
DIGGER
да и железо сервера спокойно выдержит достаточно большую нагрузку без применения кода ассемблера
Ну если Вашему серверу больше некуда тратить процессорное время,то да, конечно можно писать код бездумно, а вот я ценю каждый такт, каждого ядра CPU
Мы тут не олимпиадные задачки по программированию решаем
Вижу-вижу, Вы тут фигнёй страдаете
Видать не поняли зачем задают такие задачки…
Были ли бы ещё какие-либо примеры кодов, можно было бы сравнить и обсудить какой из вариантов тратит процессорное время впустую.
Ваши слова? Я дал Вам пример кода. А теперь пишете:
Я сравнивал с предыдущим примером
.
А когда же ждать сравнение с моим примером?
P.S. Даже если просто сравнить по количеству написанных символов, то оптимальный код
(на любом языке) будет короче, да и копировать память по 10 раз тоже нет смысла, хоть у Вас там супер-сервер
Re: Технология создания плагинов и программ-дополнений
Добавлено: 19:26, 29.06.2010
$teelR@t
DIGGER писал(а):Ну если Вашему серверу больше некуда тратить процессорное время,то да, конечно можно писать код бездумно, а вот я ценю каждый такт, каждого ядра CPU
У Вас не правильное понимание о "бездумном" написании кода. Этот код далеко не бездумно писался, вообще нету кода, который пишется бездумно, как минимум надо подумать где его нарыть, чтобы вставить себе в программу и это всё работало.
DIGGER писал(а):Вижу-вижу, Вы тут фигнёй страдаете
Видать не поняли зачем задают такие задачки…
Фигнёй в этой ветке форума никто не страдает. Тут обсуждается "Технология создания плагинов и программ-дополнений", в частности как извлеч из потока данные. Мы все хорошо знаем зачем нужны такие задачки, но кол-во времени выделяемое на реальные случаи не позволяет постоянно такие задачи решать при написании программ.
DIGGER писал(а):Были ли бы ещё какие-либо примеры кодов, можно было бы сравнить и обсудить какой из вариантов тратит процессорное время впустую.
Ваши слова? Я дал Вам пример кода. А теперь пишете:
Я сравнивал с предыдущим примером
.
А когда же ждать сравнение с моим примером?
Я написал это, потому что Вы сказали, что работа с копией указателя не оптимизированная, а я сравнивал с кодом пользователя
joub, а не вообще глобально решение этой задачи. Если бы у меня было время разбираться с Вашим асемблерным кодом, то я бы смог сравнить, но пока что у меня такого кол-ва времени нет. Как только появится, я обязательно его проанализирую.
DIGGER писал(а):P.S. Даже если просто сравнить по количеству написанных символов, то оптимальный код
(на любом языке) будет короче, да и копировать память по 10 раз тоже нет смысла, хоть у Вас там супер-сервер
Ну сервер у нас далеко не супер-пупер... Более того это довольно старая машинка. На ней притом ещё работает много других приложений и никаких видных зависаний и трат на обработку работы плагина не заметно.
Re: Технология создания плагинов и программ-дополнений
Добавлено: 22:30, 29.06.2010
joub
DIGGER писал(а):В таком случае Вы (как и
joub) тратите время процессора в пустую
а без asm-а !? пожалуйста на с++ кусочек кода обработки ?
Замечу что нам не надо просто "быстро" достать данные из строки, а надо их еще дальше и обрабатывать!
$teelR@t писал(а):Ну как сказать... Во-первых память более оптимизированно юзается,...
я так понимаю вы на Delphi свой проект пишите ?
а переменная - это тоже указатель на данные
, так что просто не вижу смысла ковырять указатели если можно просто создать переменную типа строки и юзать её )) (char *)
ЗЫ: по статистике комп очень редко бывает загружен На 100% - так что пусть работает
))
Re: Технология создания плагинов и программ-дополнений
Добавлено: 22:43, 29.06.2010
$teelR@t
joub писал(а):я так понимаю вы на Delphi свой проект пишите ?
а переменная - это тоже указатель на данные
, так что просто не вижу смысла ковырять указатели если можно просто создать переменную типа строки и юзать её )) (char *)
Нет, я пишу на C++ Builder
.
Re: Технология создания плагинов и программ-дополнений
Добавлено: 00:38, 30.06.2010
~Alien~
Соглашусь с DIGGER. Копировать один массив в другой по несколько раз не очень хорошо. Так как сообщения в чат, могут поступать мгновенно по несколько штук и каждый раз разного размера.
Re: Технология создания плагинов и программ-дополнений
Добавлено: 02:11, 30.06.2010
DIGGER
~Alien~, спасибо за поддержку, а то я уже начал думать что и вправду что-то нереальное доказываю
joub писал(а):Замечу что нам не надо просто "быстро" достать данные из строки, а надо их еще дальше и обрабатывать!
Смотрите код внимательнее или читайте комментарии коду:
DIGGER писал(а):Работаем с полученным указателем (bMessage) на память (без всяких нулей в конце), копируем память только один раз и сразу на своё финальное место в выходной строке (CommFort_msg)
joub писал(а):ЗЫ: по статистике комп очень редко бывает загружен На 100% - так что пусть работает
))
Я не знаю как у Вас там в сети, а вот у себя я борюсь за то что бы когда юзер ввёл адрес и ОТПУСТИЛ Enter, то сайт уже был ПОЛНОСТЬЮ загружен.
И если CPU показывает что загружен на 50%
(на 2х ядерном) то это уже не катит + современный CPU это целый конвейер, потому оценивать нагрузку только по графику в диспетчере задач неверно.
P.S. и наверное хватит тут холивар разводить: думаю каждый понял друг друга
Re: Технология создания плагинов и программ-дополнений
Добавлено: 09:33, 30.06.2010
joub
~Alien~", DIGGER - код в студию! языком чесать каждый может - а реальный, рабочий пример показать !?
~Alien~ писал(а):Соглашусь с DIGGER. Копировать один массив в другой по несколько раз не очень хорошо. Так как сообщения в чат, могут поступать мгновенно по несколько штук и каждый раз разного размера.
Идея ясна, но справедлива для сервера - плагин для клиентской части не столь требователен к загрузке и быстродействию.
А если, господа, бороться за быстродействие - то надо начинать с Серверной части и протоколов - но это уже не наша задача, а разработчиков сего сервер-чата.
Re: Технология создания плагинов и программ-дополнений
Добавлено: 16:01, 30.06.2010
DIGGER
joub писал(а):~Alien~", DIGGER - код в студию! языком чесать каждый может - а реальный, рабочий пример показать !?
Пол страницы мало для примера?
(Это код из моего плагина) Или непонятно что от меня нужно!
joub писал(а):А если, господа, бороться за быстродействие - то надо начинать с Серверной части и протоколов - но это уже не наша задача, а разработчиков сего сервер-чата.
С серверной? Хе-хе
Сервер один, а клиентов много! Нужно с клиентов начинать, и как по мне протокол сделать открытым
(пусть даже не весь и сразу, может с какими ограничениями) (Только одно но - аналогов у чата не много
(а достойных аналогов и того меньше) и зачем им заниматься оптимизацией?! Оно ж и так работает
[удалено как офтопик])
Re: Технология создания плагинов и программ-дополнений
Добавлено: 19:12, 30.06.2010
Maxim Mirgorodsky
Просьба прекратить с офтопиком и в дальнейшем не уходить от темы.
Re: Технология создания плагинов и программ-дополнений
Добавлено: 10:15, 02.07.2010
MrVito
Здравствуйте,
Мне требуется по результатам выполнения программы отослать сообщения пользователям чата.
Я прочитал все ветку но к сожалению так и не понял, как мне подключится к серверу или клиенту комфорта из своей программы (написанной на delphi), что бы отослать сообщение. Растолкуйте мне пожалуйста по шагам, особо признателен буду за пример
Re: Технология создания плагинов и программ-дополнений
Добавлено: 11:29, 02.07.2010
dv
[Сообщение yдалено]
Re: Технология создания плагинов и программ-дополнений
Добавлено: 12:39, 02.07.2010
MrVito
ссылка битая
, пишет: "Запрошенной темы не существует."
Re: Технология создания плагинов и программ-дополнений
Добавлено: 21:37, 02.07.2010
~Alien~
joub вот код:
Код: Выделить всё
void MsgInChannel(BYTE* msg, DWORD len)
{
char *UserName, *UserIp, *Channel, *Msg;
int l;
memcpy(&l, msg, 4); // читаем размер данных(размер имени пользователя)
UserName = new char[l]; // выделяем память под указатель для имени пользователя
msg += 4; // перемещаемся на 4 байта
memcpy(UserName, msg, l); // читаем имя пользователя
msg += l; // перемещаемся на l байтов
memcpy(&l, msg, 4); // читаем размер данных(размер IP пользователя)
UserIp = new char[l]; // выделяем память под указатель для IP пользователя
msg += 4; // перемещаемся на 4 байта
memcpy(UserName, msg, l); // читаем IP пользователя
msg += l; // перемещаемся на l байтов
memcpy(&l, msg, 4); // читаем размер данных(размер названия канала)
Channel = new char[l]; // выделяем память под указатель для названия канала
msg += 4; // перемещаемся на 4 байта
memcpy(Channel, msg, l); // читаем название канала
msg += l; // перемещаемся на l байтов
memcpy(&l, msg, 4); // читаем размер данных(размер сообщения)
Msg = new char[l]; // выделяем память под указатель для сообщения
msg += 4; // перемещаемся на 4 байта
memcpy(Msg, msg, l); // читаем сообщение
msg += l; // перемещаемся на l байтов
}
................................................
BYTE WINAPI PluginProcess(DWORD dwMessageID, BYTE* bMessage, DWORD dwMessageLength)
{
if(dwMessageID == 5)
{
MsgInChannel(bMessage, dwMessageLength);
}
return 0;
}
Используем указатель bMessage для работы с полученным массивом данных без его копирования в другой массив.