Страница: 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
       
    
       
  
 Я думаю что для уточнения лучше посмотреть это дело под дизассемблером.