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

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

Скорость работы с объектами в Delphi


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

Strange man ©   (2007-07-17 20:55:00) 

Скажите пожалуйста, с чем быстрее работать - с "class-like" records или с классами? Насколько велика разница? Если учитывать, что записи тоже будут создаваться динамически, т. к. в основном они используются как Array of record.
Ещё встречный вопрос: с чем быстрее работать - с памятью в стэке или с памятью, выделенной динамически? Почему?
Поиск не помонает: http://www.google.com/search?hl=ru&q=%D1%87%D1%82%D0%BE+%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%B5%D0%B5+class+record&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=


Strange man   (2007-07-19 22:05:00) [1]


> DevilDevil ©   (19.07.07 18:38) [72]

Извини)
Ну во первых рекорды в любом случаенезаменимы при написании геометрических объектов (векторов, матриц, сфер и т. д.). Ну а вопрос то был в том, что использовать для описания такких объектов, как боты, оружее, карты и т. д. Сейчас думаю использовать рекорды.


oxffff   (2007-07-19 19:08:00) [2]

7


DevilDevil   (2007-07-19 19:07:00) [3]


> oxffff ©   (19.07.07 18:58) [73]

какая версия, больше 6 ?


oxffff   (2007-07-19 18:58:00) [4]


> Спасибо, учту


LOL.

Ты бы лучше дружок занялся нормальной оптимизацией BSP, portals, octree.

А лучше бы открыл бы SDK DIRECT 3D. И почитал.

General Performance Tips
Follow these general guidelines to increase the performance of your application.

Clear only when you must.
Minimize state changes and group the remaining state changes.
Use smaller textures, if you can do so.
Draw objects in your scene from front to back.
Use triangle strips instead of lists and fans. For optimal vertex cache performance, arrange strips to reuse triangle vertices sooner, rather than later.
Gracefully degrade special effects that require a disproportionate share of system resources.
Constantly test your application's performance.
Minimize vertex buffer switches.
Use static vertex buffers where possible.
Use one large static vertex buffer per flexible vertex format (FVF) for static objects, rather than one per object.
If your application needs random access into the vertex buffer in accelerated graphics port (AGP) memory, choose a vertex format size that is a multiple of 32 bytes. Otherwise, select the smallest appropriate format.
Draw using indexed primitives. This can allow for more efficient vertex caching within hardware.
If the depth buffer format contains a stencil channel, always clear the depth and stencil channels at the same time.
Combine the shader instruction and the data output where possible. For example:

P.S.

Для классов.
У меня в любом случае 3 инструкции, что с with, что без
Что я не так делаю?


DevilDevil   (2007-07-19 18:38:00) [5]

не буду отвечать на вопросы в следующий раз, ну на фиг!

Я ему тут печатаю-печатаю, а он про рекорды рассказать не может...


Strange man   (2007-07-19 18:12:00) [6]


> - по возможности сжимать текстуры
> - отработать механизм: хранить, какая в последний раз была
> активизирована текстура. и, если нужны, её размеры . Не
> активировать текстуру, которая была активирована последней.
>
> - минимизировать "переключение" текущей текстуры.
>
> Такая оптимизация даст прирост в разы.

Спасибо, учту


DevilDevil   (2007-07-19 18:07:00) [7]

Это не то место, которое надо оптимизировать!

Оптимизировать надо вывод графики.

- для 3D не выводить неотображаемые участки, оптимизация геометрии.
- стараться не использовать больших текстур (1024x1024) имхо уже много
- по возможности сжимать текстуры
- отработать механизм: хранить, какая в последний раз была активизирована текстура. и, если нужны, её размеры . Не активировать текстуру, которая была активирована последней.
- минимизировать "переключение" текущей текстуры.

Такая оптимизация даст прирост в разы.
Оптимизируя доступ к полям, ты не получишь и процента!

А что ты там хочешь record-ами делать.
Если удобнее классами, делай классами!

P.S. первый закон оптимизации: "оптимизировтаь надо слабые места!"


Strange man   (2007-07-19 17:48:00) [8]


> Нет, нет, так просто ты не отделаешься!
> Рассказывай, что у тебя за задача такая? Не расскажешь подробно
> - повешусь, тебя потом всю жизнь совесть будет мучать!

Да всё гораздо проще. Просто хочу написать игру, вот сначала и выясняю, стоит использовать классы, или нет, чтобы не делать грубых ошибок :) На первый взгляд вроде мелочь, а как оказалось, разница в скорость в полтора раза...


DevilDevil   (2007-07-19 17:15:00) [9]

в "защиту" классов всё же скажу:

1) надеюсь, в TurboDelphi всё будет исправлено. А даже если не в Turbo, то в следующих версиях.

2) если с объектом предполагается проделать множество действий, то имеет смысл написать функцию, одним из параметров в которой будет этот класс. Или это будет метод этого же класса. В таком случае указатель на данные класса сразу будет храниться в регистре.

P.S.
> Большое спасибо!


Нет, нет, так просто ты не отделаешься!
Рассказывай, что у тебя за задача такая? Не расскажешь подробно - повешусь, тебя потом всю жизнь совесть будет мучать!


Strange man   (2007-07-19 17:01:00) [10]


> DevilDevil ©   (19.07.07 16:49) [66]
>
> Если написать pr.a := pr.b + pr.c;
> тогда будет как с классом. :)
>
> То есть with для классов не делает оптимизации, а для record-
> ов делает.

Так и есть :) Выходит у записей всё-таки преимущество перед классами :)
Большое спасибо!


DevilDevil   (2007-07-19 16:49:00) [11]

Я провёл тест. Гы!

Если написать pr.a := pr.b + pr.c;
тогда будет как с классом. :)

То есть with для классов не делает оптимизации, а для record-ов делает.

Потестите кто-нибудь на TurboDelphi, может лучше стало.


DevilDevil   (2007-07-19 16:17:00) [12]

VMT - таблица виртуальных методов.

Пример. У каждого класса есть виртуальный метод Destroy. Если в своём классе ты напишешь виртуальный метод Destroy, то в таблице на месте метода Destroy будет содержаться указатель на твой метод Destroy, а не на метод твоего предка.

> то код генерируется такой же, как для r2[0]. Или я не то
> сделал?> выставить в опциях компилятора оптимизацию Оптимизация
> у меня включена была с самого начала


что то здесь не чисто...


Strange man   (2007-07-19 16:10:00) [13]


> Сергей М. ©   (19.07.07 15:09) [61]
> > with cl do a := b + c;
> Мало ли в Бразилии "Педро" ?)
> Строчка
> with MyClass.Create(..) do a := b + c;
> дает блохоловам ровно три asm-инструкции)

Но мне не надо вызывать create, класс уже создан, мне надо только изменить поле а.

> oxffff ©   (19.07.07 15:10) [62]
> [ [xxx] ] адрес VTB
>
> DevilDevil ©   (19.07.07 15:18) [63]
> Кроме заданных тобой данных, класс содержит некоторые свои
> данные

vtb - это виртуальная таблица чего-то? :) Где можно прочитать об этом?

> надо посмотреть TObject

В справке про vtb ничго не сказано

> сделай r3 : ^TR. Проинициализируй и попробуй к нему так
> же обращаться. Скорее всего выйдет так же, как с классом.

Если
var pr: ^tr;
pr:=@r1;
with pr^ do a:=b+c;

то код генерируется такой же, как для r2[0]. Или я не то сделал?

> выставить в опциях компилятора оптимизацию

Оптимизация у меня включена была с самого начала


DevilDevil   (2007-07-19 15:18:00) [14]

ээээмм..

1) самое быстрое обращение будет к полям r1
2) r2 - переменная, хранящая указатель на r2[0]; переменная-динамический массив содержит указатель на первый элемент такого массива.
3) сделай r3 : ^TR. Проинициализируй и попробуй к нему так же обращаться. Скорее всего выйдет так же, как с классом.
4) попробуй выставить в опциях компилятора оптимизацию и сделай Build проекту. Мне кажется, инициализация одной и той же константой пройдёт.
5) указатель на рекорд = равен указателю на первый его элемент. так же как и с массивами. С классами иначе. Кроме заданных тобой данных, класс содержит некоторые свои данные (указатель на таблицу методов, например), надо посмотреть TObject.


oxffff   (2007-07-19 15:10:00) [15]


> Что находится в [xxx]?


[xxx] Адрес объекта.
[ [xxx] ] адрес VTB
[[xxx]+$04] значение первого поля a


Сергей М.   (2007-07-19 15:09:00) [16]


> with cl do a := b + c;


Мало ли в Бразилии "Педро" ?)

Строчка

with MyClass.Create(..) do a := b + c;

дает блохоловам ровно три asm-инструкции)


Strange man   (2007-07-19 14:45:00) [17]


> DevilDevil ©   (19.07.07 14:03) [59]

Вот код с записью (r2: array of TR; setLength(r2, 1)):

with r2[0] do a := b + c;

mov eax, [a]               // Все расчёты ведём относительно первого поля "a"
mov edx, [eax + $04]   // edx = b
add edx, [eax + $08]    // edx = b + c
mov eax, edx              // eax = a = b + c


Здесь всё как надо. Смещение записи запоминается один раз. Тогда по логике и с классом должно быть также(cl: TC):

with cl do a := b + c;

mov eax, [xxx]             // Все расчёты ведём относительно смещения [xxx]
mov edx, [eax + $08]    // edx = b
add edx, [eax + $0c]    // edx = b + c
mov [eax + $04], edx   // a = edx = b + c


НО на практике получается так

with cl do a := b + c;

mov eax, [xxx]                    // 1
mov eax, [eax +  $08]          // eax = b
mov edx, [xxx]                    // 2
add eax, [edx + $0c]           // eax = b + c
mov edx, [xxx]                   // 3
mov [edx + $04], eax          // a = eax = b + c


Почему смещение [xxx] запоминается 3 раза? Это особенность использования классов? Это первый вопрос.

А второй вопрос: почему расчёты ведутся относительно [xxx], а не относительно первого поля "a"? Что находится в [xxx]?


DevilDevil   (2007-07-19 14:03:00) [18]

> Сергей М. ©   (19.07.07 13:40) [57]

Я цитировал тебя, а обращался к нему.

> Strange man   (19.07.07 13:43) [58]

mov eax, [xxx]  // занести в eax значение переменной
mov eax, [eax +  $08] // buf := eax.SomeField;
mov edx, [xxx] // занести в edx значение переменной2
add eax, [edx + $0c] // buf := buf + edx.SomeField2;
mov edx, [xxx] // занести в edx значение переменной3
mov [edx + $04], eax // edx.SomeField3 := buf;


врядли можно заставить компилятор это с оптимизировать. Хотя, всё может быть, поставь оптимизацию в опциях компилятора, может Delphi "сотворит чудо"

1) говори, какая у тебя итоговая задача
2) показывай код, который был переведён компилятором в такой асм-код


Strange man   (2007-07-19 13:43:00) [19]


> Если честно, не совсем понимаю смысл теста, лучше скажи,
>  что в конечном итоге должно быть - мы подскажем слабые
> места.

Объясни пожалуйста, как заставить компилятор генерировать

mov eax, [xxx + $04]
mov edx, [eax + $04]
add edx, [eax + $08]
mov eax, edx


или хотя бы

mov eax, [xxx]
mov edx, [eax + $08]
add edx, [eax + $0c]
mov [eax + $04], edx


вместо

mov eax, [xxx]  
mov eax, [eax +  $08]
mov edx, [xxx]
add eax, [edx + $0c]
mov edx, [xxx]
mov [edx + $04], eax


А то полулучается медленнее в полтора раза


> если там [ebp - что-то], значит сначала он "сохраняет" значение,
>  находящееся в локальной переменной. Локальная переменная
> - указатель или объект класса.
>
> если вообще какая то константа, то "сохраняет" значение,
>  находящееся в глобальной переменной.

Нет, там просто смещение.

У меня класс
TC = class
  a, b, c: Integer;
  procedure Proc;
end;


А xxx - это [a - 4]. Что это может быть?


Сергей М.   (2007-07-19 13:40:00) [20]


> вряд ли это может пригодиться в твоей задачи


Это не моя задача)


> врядли осилишь реализацию


Да что ты ?!)


> SIMD - имхо муть


Угу. Просто так придуман, не для вас, игролепов-блохоловов)


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

Наверх

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