![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
что быстрее? [D5, XP]
Romal © (2006-11-22 22:44:00)Две моих программы выполняются на одной машине и обмениваются данными по UTP пять раз в секунду. Данные я могу передать двумя способами
1. Передать строку вида:'AB123;BC234;CD5432;'
и получить данные другим приложением примернотак:
while ((pos(';',DStr)>0) AND (length(DStr)>0)) do
begin
If copy(DStr,1,2)='AB' then Client.Day := strtoint(copy(DStr,2,pos(';',DStr)-1)) else
If copy(DStr,1,2)='BC' then Client.Year := strtoint(copy(DStr,2,pos(';',DStr)-1)) else
If copy(DStr,1,2)='CD' then Client.Money := strtoint(copy(DStr,2,pos(';',DStr)-1)) else
If copy(DStr,1,2)='DE' then Client.Limit := strtoint(copy(DStr,2,pos(';',DStr)-1)) else
If copy(DStr,1,2)='JP' then Client.Port := strtoint(copy(DStr,2,pos(';',DStr)-1)) else
If copy(DStr,1,2)='EF' then Client.Tim := strtoint(copy(DStr,2,pos(';',DStr)-1)) ;
Delete(DStr,1,pos(';',DStr));
end;
2. Второй способ передать два массива
первый массивarray [1..30] of Booleanбудет обозначать где были сделаны изменения, а второй массивarray [1..30] of Integerбудет содержать сами данные. И в цикле пройти первый массив и присвоить полям записи Client данные из второго массива.
Вопросы. Какой способ лучше? В первом присутствуют strtoint и copy, а во втором цикл, какой способ будет выполняться быстрее и меньше жрать ресурсов? Может я вообще зря беспокоюсь, такие операции не сожрут много ресурсов? Наставьте пожалуйста на путь истинный!
RWolf (2006-11-23 09:50:00) [1]сколько машинного кода в той или иной функции - можно посмотреть в map-файле утилитой MapCountCodeSize.exe.
MikePetrichenko (2006-11-23 09:10:00) [2]Что есть UTP? (витая пара?)
На одной машине - Interprocess Communications. RTFM. Mail Slots, Pipes. Memory Mapped Files.
SlymRO (2006-11-23 07:48:00) [3]Romal (22.11.06 22:44)
array [1..30] of Boolean
принципиально ничего не меняет, и зачем передавать array [1..30] of Int при изменении одного параметра?
var
p,v:integer;
a:string;
begin
while length(DStr)>0 do
begin
p:=pos(';',DStr);
if p=0 then Break;
a:=UpperCase(copy(DStr,1,2));
v:=strtoint(copy(DStr,2,p-1));
If a='AB' then Client.Day:=v else
If a='BC' then Client.Year := v else
If a='CD' then Client.Money := v else
If a='DE' then Client.Limit := v else
If a='JP' then Client.Port := v else
If a='EF' then Client.Tim := v;
Delete(DStr,1,p);
end;
end;
Протокол придумываешь? Какие типы данных нужно передавать?
Протокол для Int, 256 параметров:
type
PRec=^TRec;
TRec=packed record
ParmType:byte;
ParmValue:integer;
end;
PRecArray=^TRecArray;
TRecArray:array[0..255] of TRec;
var DStr:string;
i,c:integer;
RecArray:PRecArray;
begin
DStr:=ReadData;
c:=length(DStr) div SizeOf(TRec);
RecArray:=PRecArray(pointer(PChar(DStr)));
for i:=0 to c do
begin
case RecArray^[i].ParmType of
1: Client.Day:=RecArray^[i].ParmValue;
....
end;
end;
end;
balepa (2006-11-23 06:03:00) [4]Romal (22.11.06 23:00) [2]
Я и хотел узнать, например, strtoint - это не много операций?
Это про как ?
Джо (2006-11-22 23:06:00) [5]Практика — критерий истины.
Romal (2006-11-22 23:00:00) [6]Я и хотел узнать, например, strtoint - это не много операций?
DrPass (2006-11-22 22:49:00) [7]
> Может я вообще зря беспокоюсь, такие операции не сожрут
> много ресурсов?
Как ты думаешь, для компьютера, который в секунду делает несколько миллиардов операций в секунду это много?