Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Быстрый Swap,


Страницы:   1 2 3 4

main ©   (2008-11-15 20:02:00) 

Нужна максимально быстрая процедура, которая меняет местами содержимое блоков памяти. Что-то вроде:

procedure QuickSwap( Source,Dest :pointer; count :integer );
begin
???
end;

Почему такой процедуры нет среди стандартных? О_о


main   (2008-11-18 23:34:00) [1]


> sniknik ©   (18.11.08 20:43) [68]
> ...
> вот тут что за Data? ...


Извиняюсь. Но представь себе, мне даже и в голову не могло прийти,
что здесь может кто-то НЕ догадаться по контексту что такое Data.

Давай проверим, угадай, что такое Data? :)
А уж потом и продолжишь учить меня, что мне не надо делать.


Johnmen   (2008-11-18 21:29:00) [2]


> @!!ex ©   (18.11.08 09:51) [53]
> Нет не бывает. Если я увижу что кто-то из моих
> прогеров использует goto, это будет причиной для серьезной
> разборки, вплоть до увольнения программиста, если не "внемлет".

Я бы сам ушел от самодура...


Тын-Дын   (2008-11-18 21:11:00) [3]


> @!!ex ©   (18.11.08 12:59) [58]
> > [57] {RASkov} ©   (18.11.08 11:59)
>
> Пример, плиз.


Да столько раз приводили примеры с многоуровневыми вложенными циклами, что повторяться смысла не имеет.
А также много раз говорилось, что не стоит повторять дурь за авторитетами, а лучше думать головой и применять инструменты там, где это необходимо.
Если применяемый инструмент повышает читабельность и прозрачность кода - его нужно применять, а не слушать расхожие фразы о том. что "GOTO - это некошерно".


sniknik   (2008-11-18 20:43:00) [4]

> Что не так? Я ж там сразу и поправился.
не знаю, где и когда ты поправился(кстати есть хорошие диеты... :)... но ответ это не тебе (тебе, имхо, бесполезно, ты уже "уперся"), а Riply.
ну а не так там то, что она привела пример копирования данных, что встречается сплошь и рядом, а не свопирования, пример которого (реальной нужды в нем) я просил привести.  

> Повторяю, мне нужно это вовсе не чтоб картинки переворачивать.
а для чего? что им делать? сколько раз просили привести задачу.

> то вот реальный кусок кода, именно так как там сейчас есть.
и опять ты приводишь, по терминам из sniknik ©   (16.11.08 15:12) [37] "код забега через улицу". гордишься им, приводишь показания секундомера, сравнения с предыдущим забегом...
а тебя всегда просили сказать ЗАЧЕМ ты бежишь, т.е. задачу/цель, а не способ реализации, разве не понятно? если за хлебом, то может оглянутся. может булочная и на этой стороне, т.е. ближе есть. и бежать не нужно будет и быстрее обернешься...

вот тут что за Data? что и зачем "переворачивается"? очередной надуманный пример или действительно что то необходимое, по другому не решаемое.


main   (2008-11-18 20:09:00) [5]


> main ©   (18.11.08 19:25) [63]
> Удалено модератором <Цитата>
>
>
> main ©   (18.11.08 19:26) [64]
> Удалено модератором


Не, не, не!!! Вы не подумайте чего. Просто поздоровался, а сообщение из-за каких-то глюков само продублировалось.


main   (2008-11-18 19:55:00) [6]

Что прицепились то к этой картинки? Повторяю, мне нужно это вовсе не чтоб картинки переворачивать. Но уж если продолжить про картинку, то вот реальный кусок кода, именно так как там сейчас есть.

Второй вариант этой функции
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 19:39:00) [7]


> 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:26:00) [8]

Удалено модератором


main   (2008-11-18 19:25:00) [9]

Удалено модератором


sniknik   (2008-11-18 18:59:00) [10]

> pSource и pDist в разных адресных пространствах :)
блин, ну как дети, честное слово...
и где же тут swap, если прямо из названия - одно источник, другое приемник? таких то примеров пруд пруди. в любой проге, даже без приплетания "разных адресных пространств".


Riply   (2008-11-18 17:52:00) [11]

> [54] sniknik ©   (18.11.08 10:05)
> Я там выше писал, что "редко, но иногда бывает необходимо ..."
> но ты так и не показал вариант когда это действительно необходимо...
> даже притянутый за уши (не по теме)

pSource и pDist в разных адресных пространствах :)


@!!ex   (2008-11-18 13:48:00) [12]

> [59] {RASkov} ©   (18.11.08 13:18)

за последнии три года работы, я гото видел один раз. В блоке шифрования данных. Вот там оно уместно, т.к. позволяет усложнить работу хакера, который будет дизассемблировать код.
Где еще уместно использовать гото, я не представляю. Хотя много кода видел, в том числе и больших серьезных проектов.


{RASkov}   (2008-11-18 13:18:00) [13]

> [58] @!!ex ©   (18.11.08 12:59)

Думаешь я сам постоянно им(goto) пользуюсь, чтоб так сходу пример грамотный нарисовать....) Вот как будет пример, так сразу покажу...
Но скажу точно, что я им пользуюсь(т.е. пользовался) и ничего плохого в этом не вижу... :)


@!!ex   (2008-11-18 12:59:00) [14]

> [57] {RASkov} ©   (18.11.08 11:59)

Пример, плиз.


{RASkov}   (2008-11-18 11:59:00) [15]

Бедный ГёуТу :)
Один раз его не правильно охарактеризовали, и все.... теперь увольнять хотят из-за этого.... А ведь просто сами не умеют готовить кошек...)
В некоторых случаях лучше goto использовать чем мудрить с процедурами.... и это правильно.
Ибо неумелое использование всего остального, кроме goto - точно так же вредно...


Тын-Дын   (2008-11-18 11:51:00) [16]


> Если я увижу что кто-то из моих прогеров использует goto,
>  это будет причиной для серьезной разборки, вплоть до увольнения
> программиста, если не "внемлет".


Бред какой.


Anatoly Podgoretsky   (2008-11-18 10:16:00) [17]

> sniknik  (18.11.2008 10:05:54)  [54]

Делаем наследника без рук, тут или то, или то.


sniknik   (2008-11-18 10:05:00) [18]

> Я там выше писал, что "редко, но иногда бывает необходимо ..."
но ты так и не показал вариант когда это действительно необходимо... даже притянутый за уши (не по теме)  переворот картинки как оказалось можно делать без этого.
а раз нет реального обоснования все твои "но иногда бывает необходимо" воспринимаются как "я ни хрена в этом не понимаю". ([50] пост не исключение)

> Если пару зависимых юнитов расположить последовательно в памяти, то можно получить доступ к полям др. юнита как к своим.
книжку не хочешь написать - "ООП глазами хакера, или делаем наследника своими руками и через ж..."?
будет пользоваться популярность... по аналогии с "дельфи глазами хакера". тебя не будут любить в определенных кругах, но для разных поклонников, ламеров это будет своего рода откровением...


@!!ex   (2008-11-18 09:51:00) [19]

> Знаете, это напоминает ситуацию с goto. Мудрый дядя преподаватель
> когда-то там сказал на 1 курсе - goto зло, и вот извращаются,
> придумывают как не использывать этот самый goto. Никто
> им и не пользуется этим goto, но иногда ж все-таки бывает,
> ведь так?

Нет не бывает. Если я увижу что кто-то из моих прогеров использует goto, это будет причиной для серьезной разборки, вплоть до увольнения программиста, если не "внемлет".


> Ну например, если выровнить данные по 16 байт, то можно
> использывать инструкции SSE.

SSE прекрасно работает и с невыровненными данными.


> Если пару зависимых юнитов расположить последовательно в
> памяти, то можно получить доступ к полям др. юнита как к
> своим.

Это тоже повод для увольнения.
Костыли в коде, с 90% вероятностью приведут к трудно обнаружимым багам.


Германн   (2008-11-18 04:10:00) [20]


> Если пару зависимых юнитов расположить последовательно в
> памяти, то можно получить доступ к полям др. юнита как к
> своим.

???
И кто-то тут упоминал термин "снобизм"!
?
И про "инструкции SSE"!


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо