Re: Почему размер массива нужно увеличивать именно вдвое?
От: Alex Lakers  
Дата: 02.05.12 06:53
Оценка: 2 (1) +1 :)
Если исходный массив имел длину 1 и требуется вставить n элементов, то кол-во операций изменения размера будет равно где-то lgN, что дешево.
Re[5]: Вдвое - ошибка! Правильно 1.32, но не всегда
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.05.12 08:02
Оценка: 9 (1) -1
Здравствуйте, Lloyd, Вы писали:

L>Размер каких обхектов вы имели в виду, когда говорили о "больших объектах"? Об элементах массива или о чем-то другом?

Надо полагать, обо всех, подразумеваемых в терминологии Microsoft: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx.
На практике — о достаточно длинных массивах, независимо от ссылочности типа их элементов.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Вдвое - ошибка! Правильно 1.32, но не всегда
От: Lloyd Россия  
Дата: 03.05.12 19:43
Оценка: -2
Здравствуйте, hi_octane, Вы писали:

L>>Чтобы получить большой не-ссылочный объект надо очень сильно постараться.

_>Не уловил мысль. А почему важна не-ссылочность?

Размер каких обхектов вы имели в виду, когда говорили о "больших объектах"? Об элементах массива или о чем-то другом?
Re: Вдвое - ошибка! Правильно 1.32, но не всегда
От: hi_octane Беларусь  
Дата: 03.05.12 11:14
Оценка: 8 (1)
S>Может кто-либо сказать или дать ссылку на статью с научным обоснование ответа на мой вопрос?

Вопрос более сложный чем кажется. Правильный коэффициент зависит от стратегии работы с памятью (аллокатора).

Могу дать сслыку на грамотное обоснование почему в случае использования буфера с выделением/возвратом блоков разного размера именно вдвое как раз не надо

пост remark'a про кэф выделения памяти
Автор: remark
Дата: 26.05.08


В .NET это менее актуально, так как GC делает уплотнение мелких объектов. Но для больших объектов — резидентов LOH (которых лучше вообще не иметь), снова актуально. Только насчёт именно 1.32 не уверен — копал эту тему годы тому назад.
Re[6]: Вдвое - ошибка! Правильно 1.32, но не всегда
От: Lloyd Россия  
Дата: 04.05.12 11:16
Оценка: +1
Здравствуйте, rumatavz, Вы писали:

L>>Массив — ссылочный тип.


R>Тогда я как и hi_octane тоже не уловил вашу мысль.


Да ее там и не было. Просто ступил.
Почему размер массива нужно увеличивать именно вдвое?
От: Shuisky  
Дата: 02.05.12 06:33
Оценка:
День добрый!

Почему при максимальной заполненности массива его размер нужно увеличивать именно вдвое (наиболее оптимальное значение)?
Единственно что приходит в голову это то, что поиск по массивам внутренними структурами CLR происходит бинарным поиском, то есть делением пополам.

Может кто-либо сказать или дать ссылку на статью с научным обоснование ответа на мой вопрос?
array resize
Re: Почему размер массива нужно увеличивать именно вдвое?
От: dilmah США  
Дата: 02.05.12 07:09
Оценка:
почему желательно увеличивать в чем то типа геометрической прогрессии ответили выше.

Почему именно в 2, а не в 3 раза -- а это вовсе и не факт. Вполне возможно в твоем приложении будет лучше увеличивать на 20%, а может в 5 раз.

Я думаю это определяется твоим приложением, соотношением затрат на выделение памяти, затрат на копирование и необходимостью экономить память
Re[2]: Почему размер массива нужно увеличивать именно вдвое?
От: Lloyd Россия  
Дата: 02.05.12 08:00
Оценка:
Здравствуйте, Alex Lakers, Вы писали:

AL>Если исходный массив имел длину 1 и требуется вставить n элементов, то кол-во операций изменения размера будет равно где-то lgN, что дешево.


А если увеличивать не вдвое, а впятеро, то кол-во изменений будет и того меньше.
Почему тогда увеличивают не впятеро?
Re: Почему размер массива нужно увеличивать именно вдвое?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.05.12 08:23
Оценка:
Здравствуйте, Shuisky, Вы писали:

S>День добрый!


S>Почему при максимальной заполненности массива его размер нужно увеличивать именно вдвое (наиболее оптимальное значение)?

S>Единственно что приходит в голову это то, что поиск по массивам внутренними структурами CLR происходит бинарным поиском, то есть делением пополам.

S>Может кто-либо сказать или дать ссылку на статью с научным обоснование ответа на мой вопрос?

Не всегда. Помнится в Delphi было 25%. Но суть в том, что при малом увеличении память больше фрагментируется, а при большем при достижении определенных значений может и не хватить как памяти, так и выход размера объекта за кэш процессора.
Вот от этих факторов и ищи оптимум. И им будет 2 кратное увеличение.
и солнце б утром не вставало, когда бы не было меня
Re: Почему размер массива нужно увеличивать именно вдвое?
От: icWasya  
Дата: 02.05.12 11:18
Оценка:
Здравствуйте, Shuisky, Вы писали:

S>День добрый!


S>Почему при максимальной заполненности массива его размер нужно увеличивать именно вдвое (наиболее оптимальное значение)?

S>Единственно что приходит в голову это то, что поиск по массивам внутренними структурами CLR происходит бинарным поиском, то есть делением пополам.

S>Может кто-либо сказать или дать ссылку на статью с научным обоснование ответа на мой вопрос?


Вообще говоря с памятью дело обстоит так
Какуюу бы стратегию выделения/перевыделения/освобождения Вы не взяли,
всегда найдётся алгоритм, который будет работать наименне эффективно именно при такой стратегии.
Re: Почему размер массива нужно увеличивать именно вдвое?
От: Pzz Россия https://github.com/alexpevzner
Дата: 02.05.12 11:25
Оценка:
Здравствуйте, Shuisky, Вы писали:

S>Почему при максимальной заполненности массива его размер нужно увеличивать именно вдвое (наиболее оптимальное значение)?

S>Единственно что приходит в голову это то, что поиск по массивам внутренними структурами CLR происходит бинарным поиском, то есть делением пополам.

Потому, что это разумный компромисс между потерями памяти (из-за частичного заполнения массива) и издержками на реаллокацию.

Но нигде не сказано, что именно для вашей задачи увеличение вдвое оптимально. Может, именно в вашем случае надо увеличивать не вдвое, а впятеро, или вместо геометрической прогрессии использовать ряд Фиббоначи
Re[2]: Вдвое - ошибка! Правильно 1.32, но не всегда
От: Lloyd Россия  
Дата: 03.05.12 12:01
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>В .NET это менее актуально, так как GC делает уплотнение мелких объектов. Но для больших объектов — резидентов LOH (которых лучше вообще не иметь), снова актуально. Только насчёт именно 1.32 не уверен — копал эту тему годы тому назад.


Чтобы получить большой не-ссылочный объект надо очень сильно постараться.
Re[3]: Вдвое - ошибка! Правильно 1.32, но не всегда
От: hi_octane Беларусь  
Дата: 03.05.12 13:11
Оценка:
L>Чтобы получить большой не-ссылочный объект надо очень сильно постараться.
Не уловил мысль. А почему важна не-ссылочность?
Re[3]: Вдвое - ошибка! Правильно 1.32, но не всегда
От: rumatavz  
Дата: 03.05.12 14:58
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, hi_octane, Вы писали:


_>>В .NET это менее актуально, так как GC делает уплотнение мелких объектов. Но для больших объектов — резидентов LOH (которых лучше вообще не иметь), снова актуально. Только насчёт именно 1.32 не уверен — копал эту тему годы тому назад.


L>Чтобы получить большой не-ссылочный объект надо очень сильно постараться.


double'ы ложаться в LOH при гораздо меньшем размере, чем 85k, а именно при размере массива более 1000.
Re[4]: Вдвое - ошибка! Правильно 1.32, но не всегда
От: Lloyd Россия  
Дата: 03.05.12 19:45
Оценка:
Здравствуйте, rumatavz, Вы писали:

=L>>Чтобы получить большой не-ссылочный объект надо очень сильно постараться.

R>double'ы ложаться в LOH при гораздо меньшем размере, чем 85k, а именно при размере массива более 1000.


Массив — ссылочный тип.
Re[5]: Вдвое - ошибка! Правильно 1.32, но не всегда
От: hi_octane Беларусь  
Дата: 03.05.12 22:43
Оценка:
L>Размер каких обхектов вы имели в виду, когда говорили о "больших объектах"? Об элементах массива или о чем-то другом?

Скорее о самих массивах, чем об их элементах. Топикстартер ведь про обоснование именно удвоения размера массива спрашивал.
Re[6]: Вдвое - ошибка! Правильно 1.32, но не всегда
От: Lloyd Россия  
Дата: 03.05.12 22:48
Оценка:
Здравствуйте, hi_octane, Вы писали:

L>>Размер каких обхектов вы имели в виду, когда говорили о "больших объектах"? Об элементах массива или о чем-то другом?


_>Скорее о самих массивах, чем об их элементах.


Что значит "скорее"? Вы сомневаетесь, что именно вы же и имели в виду?
Re[5]: Вдвое - ошибка! Правильно 1.32, но не всегда
От: rumatavz  
Дата: 04.05.12 06:37
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, rumatavz, Вы писали:


L>=L>>Чтобы получить большой не-ссылочный объект надо очень сильно постараться.


R>>double'ы ложаться в LOH при гораздо меньшем размере, чем 85k, а именно при размере массива более 1000.


L>Массив — ссылочный тип.


Тогда я как и hi_octane тоже не уловил вашу мысль.
Re[6]: Вдвое - ошибка! Правильно 1.32, но не всегда
От: Lloyd Россия  
Дата: 04.05.12 10:51
Оценка:
Здравствуйте, Sinclair, Вы писали:

L>>Размер каких обхектов вы имели в виду, когда говорили о "больших объектах"? Об элементах массива или о чем-то другом?

S>Надо полагать, обо всех, подразумеваемых в терминологии Microsoft: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx.

Не надо полагать, достаточно дождаться ответа.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.