сколько весит пустая строка
От: -rsdn- Беларусь http://dsalodki.wix.com/resume
Дата: 07.03.14 17:43
Оценка:
почему так много?
        static void Main(string[] args)
        {
            Console.WriteLine(GC.GetTotalMemory(false));
            string str = string.Empty;
            Console.WriteLine(GC.GetTotalMemory(false));
        }


результат:
29556
37748
Re: сколько весит пустая строка
От: -rsdn- Беларусь http://dsalodki.wix.com/resume
Дата: 07.03.14 17:44
Оценка:
Здравствуйте, -rsdn-, Вы писали:


        static void Main(string[] args)
        {
            Console.WriteLine(GC.GetTotalMemory(false));

            Console.WriteLine(GC.GetTotalMemory(false));
                        string str = string.Empty;
            Console.WriteLine(GC.GetTotalMemory(false));
        }


29556
37748
37748
Re: сколько весит пустая строка
От: Аноним  
Дата: 07.03.14 18:11
Оценка: +7 :))
Здравствуйте, -rsdn-, Вы писали:

R>сколько весит пустая строка

R>почему так много?

Это весы так много весят.
Re: сколько весит пустая строка
От: andyag  
Дата: 07.03.14 20:39
Оценка: :))) :))
Здравствуйте, -rsdn-, Вы писали:

R>почему так много?

R>
R>        static void Main(string[] args)
R>        {
R>            Console.WriteLine(GC.GetTotalMemory(false));
R>            string str = string.Empty;
R>            Console.WriteLine(GC.GetTotalMemory(false));
R>        }
R>


R>результат:

R>29556
R>37748

Это потому что вы str объявили как string. Объявите как var — сразу станет меньше.
Re: сколько весит пустая строка
От: Mr.Delphist  
Дата: 09.03.14 11:23
Оценка: +1
Здравствуйте, -rsdn-, Вы писали:

R>почему так много?

R>
R>        static void Main(string[] args)
R>        {
R>            Console.WriteLine(GC.GetTotalMemory(false));
R>            string str = string.Empty;
R>            Console.WriteLine(GC.GetTotalMemory(false));
R>        }
R>


R>результат:

R>29556
R>37748

Узнаю, узнаю брата Сеню! О, сколько крови было пролито при боях измерениях размера пустого Delphi-экзешника

А теперь к теме. Вычитаем: 37748 — 29556 = 8192, т.е. ровно 8 килобайт. А это — две дефолтные 4К-страницы (если память не изменяет) мэппинга физической памяти на виртуальную. Т.е. процесс по каким-то своим собственным причинам частицу памяти строго более 4 килобайт но менее либо равную 8 килобайт. В ответ ему выдали две страницы (в силу гранулярности).

Мораль: единичные измерения плохи для статисследований — шумовых искажений over9000. Сделайте хотя бы сотню стрингов и разделите полученную дельту Total Memory на сотню — честнее будет.
Re: сколько весит пустая строка
От: Sinix  
Дата: 11.03.14 09:13
Оценка: 1 (1)
Здравствуйте, -rsdn-, Вы писали:

R>почему так много?

Твой код меряет потребление памяти под внутренние нужды GC, они необязательно будут сопоставимы с размером выделенной под строку памяти.

Если в generation heap достаточно места, то получим что-то типа
 37748
 37748

(у тебя во втором примере так и получается)

Если недостаточно — рантайм аллоцирует дополнительную память. Точное поведение: когда, как и сколько — это детали реализации, они могут поменяться в произвольный момент времени.

На хабрахабре есть две на удивление неплохие вводные статьи по внутренностям строк и stringbuilder, советую прочитать, большая часть вопросов должна отпасть:
http://habrahabr.ru/post/172627/
http://habrahabr.ru/post/172689/

Чтобы снизить влияние накладных расходов при измерении нужно, как минимум, вызвать принудительную сборку GC через .GetTotalMemory(true) и считать объём не на единичных аллокациях. Пример можно подсмотреть тут.

Если хочется больше подробностей — см
http://www.codeproject.com/Articles/3377/Strings-UNDOCUMENTED (о состоянии дел до CLR 4)
http://blogs.msdn.com/b/calvin_hsia/archive/2012/07/19/10331822.aspx и
http://stackoverflow.com/questions/5240971/where-does-net-place-the-string-value — о том, как проверить самому.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.