Текущий архив: 2008.12.28;
Скачать: CL | DM;
Вниз
Быстрый Swap, Найти похожие ветки
← →
main © (2008-11-15 20:02) [0]Нужна максимально быстрая процедура, которая меняет местами содержимое блоков памяти. Что-то вроде:
procedure QuickSwap( Source,Dest :pointer; count :integer );
begin
???
end;
Почему такой процедуры нет среди стандартных? О_о
← →
tesseract © (2008-11-15 20:17) [1]move. Стандартнее не бывает. Читайте документацию.
← →
main © (2008-11-15 20:27) [2]
> tesseract © (15.11.08 20:17) [1]
> move. Стандартнее не бывает. Читайте документацию.
move - копирует, а мне нужно именно менять местами.
Я немного не правильно написал:
procedure QuickSwap( PData1,PData2 :pointer; count :integer );
begin
???
end;
← →
main © (2008-11-15 20:32) [3]Погуглил, ничего стоящего не нашел.
В принципе я и сам могу что-нибудь намутить, только вот стоит ли изобретать велосипед,
это ведь стандартная рутина, наверняка уже есть готовые решения.
С удовольствием бы скопипастил! :)
Интересно, почему такой процедуры нет среди стандартных? О_о
← →
tesseract © (2008-11-15 21:18) [4]
> move - копирует, а мне нужно именно менять местами.
2 move. Случай сильно прикручен.
← →
Anatoly Podgoretsky © (2008-11-15 21:58) [5]> main (15.11.2008 20:27:02) [2]
Обмен сводится к трем move.
Видимо данная функция мало кому нужна, поэтому и не включили.
Правда иногда Борланд шел навстречу подобным заявкам, например когда делал IncDay
← →
main © (2008-11-15 22:37) [6]
> Anatoly Podgoretsky © (15.11.08 21:58) [5]
> > main (15.11.2008 20:27:02) [2]Обмен сводится к трем
> move.Видимо данная функция мало кому нужна, поэтому и не
> включили.Правда иногда Борланд шел навстречу подобным заявкам,
> например когда делал IncDay
А если размер данных большой, и их размер заранее не известен,
надо ведь еще под временный буфер память выделить.
Это как-нибудь можно на стеке динамически выделять?
А может небольшими порциями менять быстрее?
П.С.
Я вобщем-то для своего частного случая объявил в начале процедуры:
var temp :array[0..1023] of byte;
Т.к. у меня известно что count <= 1024
Но хотелось бы универсальное решение ... :)
← →
main © (2008-11-15 22:43) [7]Подчеркну, мне нужна не какая-нибудь, а именно быстрая, желательно самая быстрая. :)
А просто какую-нибудь я и сам сейчас за минуту напишу, и даже много разных.
← →
Anatoly Podgoretsky © (2008-11-15 23:04) [8]> main (15.11.2008 22:37:06) [6]
Зачем на стеке, стек маленький, зато куча большая.
Менять можно небольшими порциями, но скороть будет значительно меньше.
Это тебе домашнее задание протестировать это.
Для случая 1024 без разницы где объявлять, это не размер.
Кроме того при таком размере беспокоиться о скорости, это экономия на спичках.
← →
Johnmen © (2008-11-15 23:21) [9]
> main © (15.11.08 20:02)
Это эквивалентно поменянию значениями указателей
:)))
← →
palva © (2008-11-15 23:28) [10]При обмене не надо писать в промежуточную память. Нужно вести обмен в цикле по четыре байта, используя регистры. Ну то есть память по первому пойнтеру пишем в EAX, по второму пойнтеру - в EDX, потом возвращаем данные в память, но поменяв местами. Затем увеличиваем пойнтеры на 4. Последнюю порцию, которая может не равняться четырем, обмениваем побайтно. Естественно, что писать на ассемблере. Может быть, можно добиться хорошего кода и на делфи, но этого не так легко добиться - больше времени убьете.
Вполне возможно, что тройной move будет работать быстрее, поскольку он эффективно реализован. Но тогда будут хлопоты с выделением и освобождением памяти. Непонятно, что в конечном счете окажется лучше. Надо пробовать.
← →
main © (2008-11-16 00:03) [11]Интересно почему переместили в "начинающим"?
Разве это так уж элементарно?
...
> Кроме того при таком размере беспокоиться о скорости, это
> экономия на спичках.
А если нужно очень много раз применить,
например такая стандартная задача:
Есть ОЧЕНЬ большой массив record"ов.
Вот нужно дапустим его определенным образом отсортировать.
И размер одного record"а допустим НЕ маленький.
И все это в динамической игре и в реальном времени, да чтоб не тормозило и было как минимум 30 кадров в секунду, и это только малая часть всех расчетов ...
И вобщем-то 3 вызова move не желательно, т.е. надо бы без move.
Там где это можно я тусую указатели.
Но иногда возникает необходимость тусовать именно данные.
...
Ну нет, так нет, значит самому придется писать. :(
← →
Германн © (2008-11-16 00:03) [12]
> Johnmen © (15.11.08 23:21) [9]
>
>
Опередил :)
← →
main © (2008-11-16 00:10) [13]
> palva © (15.11.08 23:28) [10]
Я уже пробывал такой вариант,
и пробывал вариант с регистрами сопроцессора ( по 8 байт ).
Разницы вроде нет.
А с move вроде даже чуть быстрее ( но тест был так - приблизительный ).
← →
Германн © (2008-11-16 00:12) [14]
> Есть ОЧЕНЬ большой массив record"ов.
> Вот нужно дапустим его определенным образом отсортировать.
>
> И размер одного record"а допустим НЕ маленький.
Вот и мы с Johnmen © о том же.
← →
DVM © (2008-11-16 00:17) [15]
> И все это в динамической игре и в реальном времени, да чтоб
> не тормозило и было как минимум 30 кадров в секунду, и это
> только малая часть всех расчетов ...
>
> И вобщем-то 3 вызова move не желательно, т.е. надо бы без
> move.
>
многие люди недооценивают производительность современных компьютеров и скорость работы MOVE.
← →
Johnmen © (2008-11-16 00:22) [16]
> Германн © (16.11.08 00:12) [14]
Есть люди, которые хотят заблуждаться. И кто мешает им в этом - тот козел...:)
Как мы с тобой...:)
← →
DVM © (2008-11-16 00:22) [17]Да, еще, не надо гонять туда-сюда сами данные, чтобы их отсортировать, гоняйте индексы.
← →
main © (2008-11-16 00:30) [18]
> Johnmen © (15.11.08 23:21) [9]
>
> > main © (15.11.08 20:02)
>
> Это эквивалентно поменянию значениями указателей
> :)))
Если бы там было было ( var PData1,PData2 :pointer; count :integer ),
то еще можно было бы подумать что "эквивалентно поменянию значениями указателей" ...
Нет менять местами требуется не значения указателей, а данные на которые они указывают.
← →
Anatoly Podgoretsky © (2008-11-16 00:35) [19]Совет от Кнута: вместо данных сортируй указатели.
← →
main © (2008-11-16 00:36) [20]
> DVM © (16.11.08 00:22) [17]
> Да, еще, не надо гонять туда-сюда сами данные, чтобы их
> отсортировать, гоняйте индексы.
Я уж написал, что где можно тусую только указатели.
И да, где можно, тусую индексы.
Но иногда вот требуется именно данные обменять ( очень много и разных данных ). Функция должна быть максимум критична ко времени.
← →
main © (2008-11-16 00:42) [21]
> Johnmen © (15.11.08 23:21) [9]
>
> > main © (15.11.08 20:02)
>
> Это эквивалентно поменянию значениями указателей
> :)))
> Johnmen © (16.11.08 00:22) [16]
>
> > Германн © (16.11.08 00:12) [14]
>
> Есть люди, которые хотят заблуждаться. И кто мешает им в
> этом - тот козел...:)
> Как мы с тобой...:)
Козел тут скорее всего я. :) А вот заблуждаетись скорее всего "наоборот".
Интересно, как это вы обменяете значения указателей если функция объявлена как в 0 посте.
← →
Германн © (2008-11-16 00:42) [22]
> Johnmen © (16.11.08 00:22) [16]
>
>
> > Германн © (16.11.08 00:12) [14]
>
> Есть люди, которые хотят заблуждаться. И кто мешает им в
> этом - тот козел...:)
> Как мы с тобой...:)
>
Теперь мы не одиноки!
> Anatoly Podgoretsky © (16.11.08 00:35) [19]
>
> Совет от Кнута: вместо данных сортируй указатели.
>
Не завидую тому кто посмеет назвать АП козлом! :)
Кнут, конечно, сам не сможет вмешаться, но тут найдётся много тех, кто не потерпит такого!
← →
Johnmen © (2008-11-16 00:43) [23]
> main © (16.11.08 00:36) [20]
> Но иногда вот требуется именно данные обменять
Поверь старому козлу, это самообман...
← →
Германн © (2008-11-16 00:47) [24]
> Интересно, как это вы обменяете значения указателей если
> функция объявлена как в 0 посте.
>
А эту функцию ты сам придумал? Или взял откуда?
← →
main © (2008-11-16 00:56) [25]
> Поверь старому козлу, это самообман...
Если бы не я этот топик создал, то навеное так-же бы советывал не менять данные, а менять указатели, индексы и т.д. ...
Я их и не меняю эти данные....
... но ... редко но бывает что нужно именно данные обменять ( ну бывает такое ).
:)))
← →
Германн © (2008-11-16 01:03) [26]
> ... но ... редко но бывает что нужно именно данные обменять
> ( ну бывает такое ).
Тогда проясни "твою конкретную задачу". Словосочетания типа "редко но бывает что нужно" не способствуют получению наилучшего ответа-решения.
← →
main © (2008-11-16 01:16) [27]
> Тогда проясни "твою конкретную задачу". Словосочетания типа
> "редко но бывает что нужно" не способствуют получению наилучшего
> ответа-решения.
Ну вот допустим реальный и понятный пример, загрузил картинку ( 2024х2024 ), нужно ее перевернуть - верх/низ. Построчно меняю данные, размер строки 2024 * 4 байта, и так 1024 обмена.
← →
Германн © (2008-11-16 01:25) [28]
> main © (16.11.08 01:16) [27]
>
>
> > Тогда проясни "твою конкретную задачу". Словосочетания
> типа
> > "редко но бывает что нужно" не способствуют получению
> наилучшего
> > ответа-решения.
>
>
> Ну вот допустим реальный и понятный пример, загрузил картинку
> ( 2024х2024 ), нужно ее перевернуть - верх/низ. Построчно
> меняю данные, размер строки 2024 * 4 байта, и так 1024 обмена.
>
И как это совместить с "Есть ОЧЕНЬ большой массив record"ов.
Вот нужно дапустим его определенным образом отсортировать."?
← →
Германн © (2008-11-16 01:27) [29]Опять партизаны, блин!
← →
Johnmen © (2008-11-16 01:35) [30]
> main © (16.11.08 01:16) [27]
Этот пример не есть пример обмена, то бишь свопирования, памяти. Это, можно сказать, классический пример свопирования указателей...:)
Причем, я подозреваю, что белкин таки двигает области! Но на то он и белкин, чтобы вести себя разнузданно...:)
← →
main © (2008-11-16 04:36) [31]Я вот думаю, а мне это нужно - оправдываться тут.
Спасибо конечно что отвечаете, но простите, я вовсе и не просил советов, нужна мне эта функция или нет.
А просил я совет как сделать ее быстрее.
И нужна она мне вовсе не чтоб картинку переворачивать ( поясню, переворачиваю что-бы данные лежали одним блоком для передачи в память видеокарты ). Просто это был наглядный пример, который вобщем-то не критичный по времени ( но и там бы эта функция не помешала ).
← →
main © (2008-11-16 05:32) [32]
> Германн © (16.11.08 01:03) [26]
>
> > ... но ... редко но бывает что нужно именно данные обменять
>
> > ( ну бывает такое ).
>
> Тогда проясни "твою конкретную задачу". Словосочетания типа
> "редко но бывает что нужно" не способствуют получению наилучшего
> ответа-решения.
Не понимаю я. Вроде ясно написал, отсортировать по определенным приоритетам массив рекордов. Что, это разве не "конкретная задача"?
Если Вам интересно зачем, скажу, так потом в целом все быстрее работает. Подчеркну, это - не вообще, а конкретно у меня и конкретно в этой программе ( так например я получаю доступ к полям другого юнита как к своим ).
← →
MBo © (2008-11-16 10:39) [33]Всё-таки давай конкретное условие задачи с типом записей и их примерным количеством, тогда посмотрим, как можно оптимизировать
← →
sniknik © (2008-11-16 11:29) [34]> Не понимаю я. Вроде ясно написал, отсортировать по определенным приоритетам массив рекордов.
> Что, это разве не "конкретная задача"?
это вообще не задача, это путь решения, твой путь, возможно неверный (почему никто и не хочет его "разрабатывать").
задача это то что делается, а не каким образом, и возможно, именно для задачи, не только сортировка но и вообще массив рекордов не понадобится... при другом алгоритме решения.
← →
Хитрий Лис (2008-11-16 13:23) [35]Давненько в одной ветке столько голубых значков небыло :) зацепило таки...
← →
Тын-Дын © (2008-11-16 14:05) [36]
> это вообще не задача,
Ну почему не задача? Как раз задача - оптимизировать процесс.
> main © (16.11.08 05:32) [32]
Обрати внимание - как сказал MBo в [33] для оптимизации нужны точные условия. В общем случае задача не решается.
← →
sniknik © (2008-11-16 15:12) [37]> Как раз задача - оптимизировать процесс.
видимо я по другому понимаю что такое задача.
вот например задача - "перейти улицу". это задача. более общая для которой первая будет подзадачей это - "сходить за хлебом в булочную на другой стороне улицы". и ещё более общая - "сделать что то, чтобы хлеб к обеду был на столе".
а вот - "перебежать улицу на красный свет в неположенном месте", это уже путь решения, и "сделать перебег безопасным, и занимающим минимум времени" т.е. оптимизировать процесс это уже не задача, это уже поиск алгоритма для выполнения этого выбранного пути.
т.е. разница между "перейти улицу" и "перебежать на красный" в том что одно это цель(задача), а другое реализация(путь решения).
и да, конечно, можно и "оптимизировать процесс" рассматривать как задачу, но только для решения основной ("перейти улицу"/"сходить за хлебом"/"хлеб на столе") она довольно бессмысленна, вот будешь ты тут рассчитывать время выхода, скорость движения, чтобы попасть не в час пик, т.е. удобное время для "перебега" и т.д. т.е. сокращать время которое для него потребуется, а ведь можно пойти вообще другим путём, и например заказать хлеб по интернету... сократив своё время похода до 0, и сделав вообще ненужными все подзадачи.
← →
Ruzzz © (2008-11-16 15:59) [38]procedure QuickSwap(PData1,PData2 :pointer; count :integer );
begin
???
end;
а так не пойдет? :)
procedure QuickSwap(var PData1, PData2 :pointer);
var
temp: pointer;
begin
temp := PData1;
PData1 := PData2;
PData2 := temp;
end;
я имею ввиду, что сожет пересмотреть логику программы? хранить указатели на данные, их же и сортировать.
← →
Sapersky (2008-11-16 17:16) [39]Посмотрите, какие оптимизации используются в FastCode Move Challenge:
http://fastcode.sourceforge.net/challenge_content/Move.html
Задача-то в общем сходная.
Если у вас BDS2006 или более новая версия, оптимизированный вариант Move с FastCode должен быть уже встроен в system.pas.
Хотя, конечно, если производительность упирается в move или swap - в консерватории что-то не так...
← →
tesseract © (2008-11-16 21:46) [40]
> хранить указатели на данные, их же и сортировать.
См Связанный двунаправленный список . ИМХО его ты и пытаешься реализовать.
← →
Тын-Дын © (2008-11-16 23:34) [41]
> main ©
Попробуй метод, реализованный в Button2Click.procedure TForm1.Button2Click(Sender: TObject);
const
size=1024*1024*10*10;
var
t1,t2: Cardinal;
p1,p2: PChar;
pInt1,pInt2: pInteger;
i: integer;
begin
GetMem(p1,size);
GetMem(p2,size);
FillChar(p1[0],Size,1);
FillChar(p2[0],Size,2);
pInt1 := Pointer(p1);
pInt2 := Pointer(p2);
t1 := GetTickCount;
for i := 0 to (Size-1) div 4 do
begin
pInt1^ := pInt1^ xor pInt2^;
pInt2^ := pInt1^ xor pInt2^;
pInt1^ := pInt1^ xor pInt2^;
pInt1 := Pointer(Integer(pInt1)+4);
pInt2 := Pointer(Integer(pInt2)+4);
end;
t2 := GetTickCount;
Label1.Caption := IntToStr(t2-t1);
FreeMem(p1);
FreeMem(p2);
end;
Тоже самое, но с move:procedure TForm1.Button3Click(Sender: TObject);
const
size=1024*1024*10*10;
var
t1,t2: Cardinal;
p1,p2: PChar;
p3: PChar;
begin
GetMem(p1,size);
GetMem(p2,size);
FillChar(p1[0],Size,1);
FillChar(p2[0],Size,2);
t1 := GetTickCount;
GetMem(p3,size);
Move(p1[0],p3[0],Size);
Move(p2[0],p1[0],Size);
Move(p3[0],p2[0],Size);
t2 := GetTickCount;
Label1.Caption := IntToStr(t2-t1);
FreeMem(p1);
FreeMem(p2);
FreeMem(p3);
end;
← →
sniknik © (2008-11-17 00:34) [42]Тын-Дын © (16.11.08 23:34) [41]
а стоит ли "мудрить"? у меня простейшееprocedure TForm1.Button4Click(Sender: TObject);
const
size=1024*1024*10*10;
var
t1,t2: Cardinal;
p1,p2: PChar;
p3: Char;
i: integer;
begin
GetMem(p1,size);
GetMem(p2,size);
FillChar(p1[0],Size,1);
FillChar(p2[0],Size,2);
t1:= GetTickCount;
for i:= (Size-1) downto 0 do
begin
p3 := p1[i];
p1[i]:= p2[i];
p2[i]:= p3;
end;
t2:= GetTickCount;
Label1.Caption:= IntToStr(t2-t1);
FreeMem(p1);
FreeMem(p2);
end;
дает лучшие результаты...
насколько лучше зависит от range checking, ну и наверное, подозреваю, от типа процессора, но это уже проверить не могу.
← →
Тын-Дын © (2008-11-17 01:47) [43]
> sniknik © (17.11.08 00:34) [42]
Ну не знаю.
Для сравнения на моём ПК:1 способ (xor) 218мс
2 способ (move) 343мс
3 способ (с char) 234мс
← →
Тын-Дын © (2008-11-17 01:50) [44]Честно говоря, не могу придумать, где разница в обработке в памяти сотни мегабайт в 100мсек может быть критичной.
← →
main © (2008-11-17 02:25) [45]Мой вариант:
procedure qSwap64( PData1,PData2 :pointer; Count : Integer );
asm
dd $DF03E9C1,$DF2ADF28,$833ADF38,$C28308C0,$EF774908
end;
Count должено быть кратным 8.
← →
main © (2008-11-17 02:33) [46]
procedure qSwap64( PData1,PData2 :pointer; Count : Integer );
asm
dd $DF03E9C1,$DF2ADF28,$833ADF38,$C28308C0,$EF774908
end;
procedure TForm1.Button4Click(Sender: TObject);
const
size=1024*1024*10*10;
var
t1,t2: Cardinal;
p1,p2: PChar;
p3: Char;
i: integer;
begin
GetMem(p1,size);
GetMem(p2,size);
FillChar(p1[0],Size,1);
FillChar(p2[0],Size,2);
t1:= GetTickCount;
qSwap64( p1 , p2 , Size );
t2:= GetTickCount;
Label1.Caption:= IntToStr(t2-t1);
FreeMem(p1);
FreeMem(p2);
end;
← →
main © (2008-11-17 02:36) [47]Упс, про смайлики забыл совсем. :)
← →
sniknik © (2008-11-17 02:37) [48]> Для сравнения на моём ПК:
и у тебя наверняка интел, т.к. на моем AMD все наоборот
1 способ (xor) 437мс
2 способ (move) 360мс
3 способ (с char) 250мс
4 другое (ниже) 203мс
> Честно говоря, не могу придумать, где разница в обработке в памяти сотни мегабайт в 100мсек может быть критичной.
аналогично. тем более, что эта разница может из выигрышной легко стать проигрышной...
и ещё более, "тем более" что при выборе другого пути решения задачи вся эта фигня может стать совсем не нужной.
немного модифицированный 3 вариант, сделано из расчёта чтобы обрабатывались "родные" 32битные значения (для 64 разрядной операционки очевидно будут быстрее 64битные)procedure TForm1.Button4Click(Sender: TObject);
const
size=1024*1024*10*10;
var
t1, t2: Cardinal;
p1, p2: PChar;
i: integer;
w1: array of dword absolute p1;
w2: array of dword absolute p2;
w3: dword;
begin
GetMem(p1,size);
GetMem(p2,size);
FillChar(p1[0],Size,1);
FillChar(p2[0],Size,2);
t1 := GetTickCount;
for i:= (Size-1) div 4 downto 0 do
begin
w3 := w1[i];
w1[i]:= w2[i];
w2[i]:= w3;
end;
t2 := GetTickCount;
Label4.Caption := IntToStr(t2-t1);
FreeMem(p1);
FreeMem(p2);
end;
← →
Servy © (2008-11-17 03:30) [49]Еще немного мыслей по поводу того, что без swap"а можно обойтись практически всегда.
> Ну вот допустим реальный и понятный пример, загрузил картинку
> ( 2024х2024 ), нужно ее перевернуть - верх/низ. Построчно
> меняю данные, размер строки 2024 * 4 байта, и так 1024 обмена.
1. Если загрузка в видеопамять, то можно преобразовать текстурные координаты при отображении картинки таким образом, чтобы она отображалась вверх тормашками.
2. Можно изменить процесс загрузки, и сразу читать очередную строку в нужную область памяти.
3. Если 1 и 2 по каким-то причинам отклонены, то выделить память еще под одну такую картинку, и скопировать туда строки в нужном порядке, и уничтожить первую картинку; очевидно, это будет быстрее, чем Swap с помощью 3х Move на каждую строку с промежуточным буфером (если пренебречь временем на выделение нового участка памяти); возможно, это будет быстрее, чем разнообразные ассемблерные извращения, к тому же, здесь сложнее ошибиться, и остается видимость переносимости.
← →
main © (2008-11-18 03:35) [50]О спасибо! Я все понял! Наконец-то до меня дошло, что лучше сортировать указатели или индексы а не данные!
Нет, ну что за снобизм, а? Знаете, это напоминает ситуацию с goto. Мудрый дядя преподаватель когда-то там сказал на 1 курсе - goto зло, и вот извращаются, придумывают как не использывать этот самый goto. Никто им и не пользуется этим goto, но иногда ж все-таки бывает, ведь так?
Все вот эти приссказки и ПЫСЫ, про то что лучше тусовать указатели, были вовсе и не обязательны, не бойтесь, никто про вас плохо не подумает.
Я там выше писал, что "редко, но иногда бывает необходимо ...", если быть точнее, это вовсе и не необходимость какая-нибудь. Это такая фича, что если данные расположить определенным образом, то становятся доступны некие новые оптимизации. Ну например, если выровнить данные по 16 байт, то можно использывать инструкции SSE. Если пару зависимых юнитов расположить последовательно в памяти, то можно получить доступ к полям др. юнита как к своим. Например, командир - его отряд, охранник - то что он охраняет, расса - все юниты этой рассы, и т.д. ... ( юнит - это какой-то солдатик в игре )
Это я сейчас написал просто так, чисто пофлеймить ...
:)))
← →
Германн © (2008-11-18 03:44) [51]
> main © (18.11.08 03:35) [50]
>
> О спасибо! Я все понял! Наконец-то до меня дошло, что лучше
> сортировать указатели или индексы а не данные!
>
Да не за что.
P.S. Все прочие высказывания оставь себе. Может быть позже поймёшь их суть!
← →
Германн © (2008-11-18 04:10) [52]
> Если пару зависимых юнитов расположить последовательно в
> памяти, то можно получить доступ к полям др. юнита как к
> своим.
???
И кто-то тут упоминал термин "снобизм"!
?
И про "инструкции SSE"!
← →
@!!ex © (2008-11-18 09:51) [53]> Знаете, это напоминает ситуацию с goto. Мудрый дядя преподаватель
> когда-то там сказал на 1 курсе - goto зло, и вот извращаются,
> придумывают как не использывать этот самый goto. Никто
> им и не пользуется этим goto, но иногда ж все-таки бывает,
> ведь так?
Нет не бывает. Если я увижу что кто-то из моих прогеров использует goto, это будет причиной для серьезной разборки, вплоть до увольнения программиста, если не "внемлет".
> Ну например, если выровнить данные по 16 байт, то можно
> использывать инструкции SSE.
SSE прекрасно работает и с невыровненными данными.
> Если пару зависимых юнитов расположить последовательно в
> памяти, то можно получить доступ к полям др. юнита как к
> своим.
Это тоже повод для увольнения.
Костыли в коде, с 90% вероятностью приведут к трудно обнаружимым багам.
← →
sniknik © (2008-11-18 10:05) [54]> Я там выше писал, что "редко, но иногда бывает необходимо ..."
но ты так и не показал вариант когда это действительно необходимо... даже притянутый за уши (не по теме) переворот картинки как оказалось можно делать без этого.
а раз нет реального обоснования все твои "но иногда бывает необходимо" воспринимаются как "я ни хрена в этом не понимаю". ([50] пост не исключение)
> Если пару зависимых юнитов расположить последовательно в памяти, то можно получить доступ к полям др. юнита как к своим.
книжку не хочешь написать - "ООП глазами хакера, или делаем наследника своими руками и через ж..."?
будет пользоваться популярность... по аналогии с "дельфи глазами хакера". тебя не будут любить в определенных кругах, но для разных поклонников, ламеров это будет своего рода откровением...
← →
Anatoly Podgoretsky © (2008-11-18 10:16) [55]> sniknik (18.11.2008 10:05:54) [54]
Делаем наследника без рук, тут или то, или то.
← →
Тын-Дын © (2008-11-18 11:51) [56]
> Если я увижу что кто-то из моих прогеров использует goto,
> это будет причиной для серьезной разборки, вплоть до увольнения
> программиста, если не "внемлет".
Бред какой.
← →
{RASkov} © (2008-11-18 11:59) [57]Бедный ГёуТу :)
Один раз его не правильно охарактеризовали, и все.... теперь увольнять хотят из-за этого.... А ведь просто сами не умеют готовить кошек...)
В некоторых случаях лучше goto использовать чем мудрить с процедурами.... и это правильно.
Ибо неумелое использование всего остального, кроме goto - точно так же вредно...
← →
@!!ex © (2008-11-18 12:59) [58]> [57] {RASkov} © (18.11.08 11:59)
Пример, плиз.
← →
{RASkov} © (2008-11-18 13:18) [59]> [58] @!!ex © (18.11.08 12:59)
Думаешь я сам постоянно им(goto) пользуюсь, чтоб так сходу пример грамотный нарисовать....) Вот как будет пример, так сразу покажу...
Но скажу точно, что я им пользуюсь(т.е. пользовался) и ничего плохого в этом не вижу... :)
← →
@!!ex © (2008-11-18 13:48) [60]> [59] {RASkov} © (18.11.08 13:18)
за последнии три года работы, я гото видел один раз. В блоке шифрования данных. Вот там оно уместно, т.к. позволяет усложнить работу хакера, который будет дизассемблировать код.
Где еще уместно использовать гото, я не представляю. Хотя много кода видел, в том числе и больших серьезных проектов.
← →
Riply © (2008-11-18 17:52) [61]> [54] sniknik © (18.11.08 10:05)
> Я там выше писал, что "редко, но иногда бывает необходимо ..."
> но ты так и не показал вариант когда это действительно необходимо...
> даже притянутый за уши (не по теме)
pSource и pDist в разных адресных пространствах :)
← →
sniknik © (2008-11-18 18:59) [62]> pSource и pDist в разных адресных пространствах :)
блин, ну как дети, честное слово...
и где же тут swap, если прямо из названия - одно источник, другое приемник? таких то примеров пруд пруди. в любой проге, даже без приплетания "разных адресных пространств".
← →
main © (2008-11-18 19:25) [63]Удалено модератором
← →
main © (2008-11-18 19:26) [64]Удалено модератором
← →
main © (2008-11-18 19:39) [65]
> sniknik © (18.11.08 18:59) [62]
> > pSource и pDist в разных адресных пространствах :)блин,
> ну как дети, честное слово...и где же тут swap, если прямо
> из названия - одно источник, другое приемник? таких то примеров
> пруд пруди. в любой проге, даже без приплетания "разных
> адресных пространств".
Что не так? Я ж там сразу и поправился.
> main © (15.11.08 20:27) [2]
> ...
> Я немного не правильно написал:
> procedure QuickSwap( PData1,PData2 :pointer; count :integer );
> begin
> ???
> end;
А в 0 посте был просто заголовок по памяти, по аналогии с move.
← →
main © (2008-11-18 19:55) [66]Что прицепились то к этой картинки? Повторяю, мне нужно это вовсе не чтоб картинки переворачивать. Но уж если продолжить про картинку, то вот реальный кусок кода, именно так как там сейчас есть.
Второй вариант этой функции
1) Меньше по размеру? Да, меньше.
2) Чисто визуально, логика понятней? Да, понятней.
3) Работает быстрее? Да, быстрее.
Теперь вопрос, почему я не должен юзать этот самый swap?
Потом, метод TTexture.Turn мне нужен в любом случае, не только при загрузке, есть еще генератор текстур, который его юзает.
...
//procedure TTexture.Turn;
//var
// j,i,L,BaseAdr :integer;
// TempBuffer :array[0..2047] of integer;
//begin
//
// L := n * Width;
// if L > SizeOf( TempBuffer ) then Exit;
// BaseAdr := integer(Data);
//
// for j := 0 to ( Height div 2 ) - 1 do
// begin
// i := Height - 1 - j;
// move( pointer( BaseAdr + j * L )^ , TempBuffer , L );
// move( pointer( BaseAdr + i * L )^ , pointer( BaseAdr + j * L )^ , L );
// move( TempBuffer , pointer( BaseAdr + i * L )^ , L );
// end;
//
//end;
procedure TTexture.Turn;
var
j,L,A1,A2 :integer;
begin
L := n * Width;
A1 := integer(Data);
A2 := A1 + ( Height - 1 ) * L;
for j := 0 to ( Height div 2 ) - 1 do
qSwap64( pointer( A1 + j * L ) , pointer( A2 - j * L ) , L );
end;
...
← →
main © (2008-11-18 20:09) [67]
> main © (18.11.08 19:25) [63]
> Удалено модератором <Цитата>
>
>
> main © (18.11.08 19:26) [64]
> Удалено модератором
Не, не, не!!! Вы не подумайте чего. Просто поздоровался, а сообщение из-за каких-то глюков само продублировалось.
← →
sniknik © (2008-11-18 20:43) [68]> Что не так? Я ж там сразу и поправился.
не знаю, где и когда ты поправился(кстати есть хорошие диеты... :)... но ответ это не тебе (тебе, имхо, бесполезно, ты уже "уперся"), а Riply.
ну а не так там то, что она привела пример копирования данных, что встречается сплошь и рядом, а не свопирования, пример которого (реальной нужды в нем) я просил привести.
> Повторяю, мне нужно это вовсе не чтоб картинки переворачивать.
а для чего? что им делать? сколько раз просили привести задачу.
> то вот реальный кусок кода, именно так как там сейчас есть.
и опять ты приводишь, по терминам из sniknik © (16.11.08 15:12) [37] "код забега через улицу". гордишься им, приводишь показания секундомера, сравнения с предыдущим забегом...
а тебя всегда просили сказать ЗАЧЕМ ты бежишь, т.е. задачу/цель, а не способ реализации, разве не понятно? если за хлебом, то может оглянутся. может булочная и на этой стороне, т.е. ближе есть. и бежать не нужно будет и быстрее обернешься...
вот тут что за Data? что и зачем "переворачивается"? очередной надуманный пример или действительно что то необходимое, по другому не решаемое.
← →
Тын-Дын © (2008-11-18 21:11) [69]
> @!!ex © (18.11.08 12:59) [58]
> > [57] {RASkov} © (18.11.08 11:59)
>
> Пример, плиз.
Да столько раз приводили примеры с многоуровневыми вложенными циклами, что повторяться смысла не имеет.
А также много раз говорилось, что не стоит повторять дурь за авторитетами, а лучше думать головой и применять инструменты там, где это необходимо.
Если применяемый инструмент повышает читабельность и прозрачность кода - его нужно применять, а не слушать расхожие фразы о том. что "GOTO - это некошерно".
← →
Johnmen © (2008-11-18 21:29) [70]
> @!!ex © (18.11.08 09:51) [53]
> Нет не бывает. Если я увижу что кто-то из моих
> прогеров использует goto, это будет причиной для серьезной
> разборки, вплоть до увольнения программиста, если не "внемлет".
Я бы сам ушел от самодура...
← →
main © (2008-11-18 23:34) [71]
> sniknik © (18.11.08 20:43) [68]
> ...
> вот тут что за Data? ...
Извиняюсь. Но представь себе, мне даже и в голову не могло прийти,
что здесь может кто-то НЕ догадаться по контексту что такое Data.
Давай проверим, угадай, что такое Data? :)
А уж потом и продолжишь учить меня, что мне не надо делать.
Страницы: 1 2 вся ветка
Текущий архив: 2008.12.28;
Скачать: CL | DM;
Память: 0.7 MB
Время: 0.05 c