Loading...
mgulubov avatar mgulubov 73 Точки

SpiralMatrix memory usage - difference between String[,] and char[,]

Привет,

 

Version I: http://pastebin.com/uCGg9qpM

Version II: http://pastebin.com/0P6qnnc2

 

Двете версии на кода по-горе, са почти идентични, като разликата е основно в това, че в първия вариант ползвам String[,] , а във втория char[,]. И двете версии работят правилно, но проблема е, че версията, която ползва String за двумерния масив, използва доста повече памет, от версията, която ползва char. Първата версия, ползва 26MB памет, при подадени параметри 666 devil, а втората версия - 9MB.

Въпроса ми е, от къде идва разликата? Реално String е масив от char елементи и при положение, че всеки елемент, който записвам и при двата случая се състои от максимум една буква, използваното място би трябвало да е еднакво и при двата case-a. Евентуално, ако C# ползва някакъв ArrayList за string обекта, с цел да намали броя на преоразмерявания, при добавяне на нови елементи?

0
Programming Basics
naskoprasko avatar naskoprasko 9 Точки

Елементите на string[] са N*(char[]),според мен е логично да е по-обемно...

0
mgulubov avatar mgulubov 73 Точки

Не и когато N = 1

0
naskoprasko avatar naskoprasko 9 Точки

Short и Long също може да  приемат една и съща стойност, но се заделя повече памет. Би трябвало концепцията да е същата като при променливите...все пак в едното се очаква да се въведе нещо повече от 1 символ, който ти е 4 байта да речем, а няколко по 4 ...



Едит: Може и да греша, но ми звучи логично.

0
20/02/2015 18:04:35
mgulubov avatar mgulubov 73 Точки

По-скоро не е това, понеже при short и long, реално имаш ограничение на броя байтове, които всеки от двата типа може да съдържа. При String обаче не е така. Там имаш ограничение, че един string не може да е по-голям от определено количество памет, което е някъде към 2ГБ. В смисъл, в C String-a буквално се дефинира като char[], за това интуитивната логика е, че String str = "a" & char[] str = new char[]{'a'}, ще са с еднаква големина от към памет.

1
20/02/2015 20:57:29
Filkolev avatar Filkolev 4482 Точки

Стрингът е референтен тип и за него трябва да се задели място в динамичната памет, което е по-бавно. Освен това той държи в себе си допълнителна информация, не само символите, които съдържа. Това е обект, нормално е да е с по-лоша производителност от примитивните типове.

Символите са числов тип и заемат доста по-малко памет, определено е по-удачно да работиш с тях в случая.

2
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.