Страница: 1 | 2 | 3 |
Вопрос: Type или Class???
Добавлено: 14.08.04 11:54
Автор вопроса: AgentFire | ICQ: 192496851
Я пишу игру.
Имеестя корабль с кучей свойств, но без методов и событий.
Что было бы быстрее использовать(производительность) — Type или Class?..
Ответы
Всего ответов: 33
Номер ответа: 1
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #1
Добавлено: 14.08.04 12:54
Ну так погоняй их в цикле. Засеки время начала и конца цикла и сравни их.
Вот так:
 im t1 as Single, t2 as Single
t1=Timer
'Цикл
t2=Timer
Msgbox t2-t1
Номер ответа: 2
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #2
Добавлено: 14.08.04 15:49
Разве так важна производительность? По принципу бритвы Оккама, раз нет методов и событий, использовать class нерационально.
Номер ответа: 3
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #3
Добавлено: 14.08.04 16:08
А в VB6 где хранится Type, а где Class?
Насколько я знаю, в .Net структуры хранятся в стеке и при передаче,
допустим, в функцию, копируется в памяти.
А классы хранятся в куче, данные не копируются, а передается лишь
ссылка...
А поэтому при большом объеме данных производительнее использовать
классы.
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 14.08.04 16:47
Хранить структуры в стеке? Какой ужас! Надеюсь, это только в .NET, чтобы приучать к ООП. В Си, по крайней мере, классы и структуры сделаны максимально похожими, за тем исключением, что структуры нельзя наследовать.
-------------------------------------------------
"Долгое время считалось, что в непредсказуемых поворотах лестниц Первертса зашифровано послание великих колдунов прошлого. Десятки ученых магов потратили не одну сотню лет жизни, пытаясь разгадать тайный смысл лестничных маневров, пока кто-то не догадался, что лестницы просто валяют дурака"
Порри Гаттер, часть 3
Номер ответа: 5
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 14.08.04 19:50
Ну не факт что куча быстрее.
Стёк для процессора родной. У него даже для него специальные операторы(PUSH/POP и т.д.) и регистры (EBP, ESP) имеются. Причём все адреса расчитываются компилятором и хранятся в экзешнике. Т.е. прога сама заранее знает где у неё какая структура лежать будет.
А при работе с кучей нужно сначала получить указатель на участок памяти (для этого требуется API-функция, которая отнимает время). Да и использовать его можно преимущественно в API-функциях, которые выполняются гораздо медленнее непосредственной работы процессора со стеком.
Номер ответа: 6
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #6
Добавлено: 14.08.04 20:33
Имхо, помещение указателя на класс в тек происходит быстрее, чем копирование структуры в верхушку стека, а оперирование классом и структурой, если не принимать во внимание сложность класса, происходит примерно одинаково быстро. Не забывай, что стек - это та же память, что и куча и "родной" он только на уровне удобства.
-------------------------------------------------
"Да-да, в ночь на 1 мая крышу Первертса срывало - иногда вместе с факультетскими башнями - и носило по миру."
Порри Гаттер, часть 3
Номер ответа: 7
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #7
Добавлено: 14.08.04 21:50
При небольших размерах структуры (Эплман говорил вроде, что до 80
байт, может врет) затраты на выделение памяти в куче больше чем
затраты не копирование структуры в стеке.
Номер ответа: 8
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #8
Добавлено: 14.08.04 22:33
Ну 80 байт это не небольшая структура...
-------------------------------------------------
"К сожалению, точные и мощные удары бывшего спецназовца не улучшили ситуацию. Гипергорох реагировал на атаки по методу Лернейской гидры: место срубленного побега тут же занимали два новых. Секундой позже к борьбе с зеленой стихией присоединились Порри, который с криком Огнемет-бы-сюда! поджег часть ветвей (а также меню на завтра), и Гаргантюа, вопящий иссушающие заклинания Каракумус, Кызылкумус и Понедельник-утрос, многократно усиленные влиянием Вальпургиевой ночи."
Порри Гаттер, часть 3
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 14.08.04 22:39
>Не забывай, что стек - это та же память, что и куча и "родной" он только на уровне удобства.
Родной он как раз для процессора, т.к. команды работы со стеком в процессор зашиты. И если для стека команды процессор выполлняет непосредственно, то для кучи алгоритм мне не известен. Но то что процессор не поддерживает комманд работы с кучей - это точно.
Номер ответа: 10
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #10
Добавлено: 14.08.04 22:48
> Родной он как раз для процессора
> "родной" он только на уровне удобства
Это всего лишь сокращение от mov [esp],arg:sub esp,sizeof arg. А работа с памятью еще "глубже" "зашита" в процессор И алгоритм там простейший: адрес кучи + оффсет.
Номер ответа: 11
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #11
Добавлено: 15.08.04 00:42
>И алгоритм там простейший: адрес кучи + оффсет.
Ага, а получаешь ты их с помощью API. Если стековые адреса считает компилятор, то адрес памяти из кучи считает система. Значит в первом случае будет быстрее в рантайме.
Ты помнишь какую нибудь API работы со стеком? Нет потому что это уже есть в процессоре. А API работы с кучей? Вот то то. Даже если эта API состоит из одного NOP'а (в чём я сильно сомневаюсь, тем более в .NET), то все равно на её вызов потребуется время, зависящее от загруженности системы.
Номер ответа: 12
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #12
Добавлено: 15.08.04 00:49
Ну дык указатель на кучу возвращается при выделении памяти в ней, т.е. API используется в самом начале. А оффсеты, если классы не виртуальные, также зашиты компилером в ехешник. Вот если есть late binding, тогда приходится все делать через ж... VTable. После получения этого указателя тебе больше не нужны будут никакие API.
-------------------------------------------------
"Зачем же эгоистичный волшебный кот полетел с авантюристкой, спросит читатель, у которого дома не живут коты. Он же мог в любой момент перенестись в безопасное место. Что его удерживало? Доброта? Самоотверженность? Желание помочь людям? Читатель, у которого дома есть коты, уже саркастически усмехается. Остальных придется разочаровать. Кисера удерживала на верблюжьем горбе обыкновенная лень."
Порри Гаттер, часть 3 (www.gatter.ru)
Номер ответа: 13
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #13
Добавлено: 15.08.04 00:58
>Ну дык указатель на кучу возвращается при выделении памяти в ней, т.е. API используется в самом начале.
Сколько кусков памяти выделишь, столько и будет API вызываться. Тем более что для работы с кучей существует вовсе не единственная функция. Посчитай их ради интереса в разделе "Memory Management Functions" MSDN.
Номер ответа: 14
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #14
Добавлено: 15.08.04 01:11
Думаю, что в случае с классами куча только выделяется HeapAlloc и освобождается HeapFree. И вполне возможно, что для всех экземпляров объектов с одной областью видимости она выделяется только один раз.
Номер ответа: 15
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #15
Добавлено: 15.08.04 01:20
Я думаю что для уточнения лучше посмотреть это дело под дизассемблером.