Re[3]: собеседования, Реверс списка
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 09.10.13 18:46
Оценка: +10
Здравствуйте, gandjustas, Вы писали:

A>>C++ лагерь говорит что в С++ у списков нет внутреннего массива

G>vector<T> таки имеет внутренний массив, да еще и коэффициент увеличения 1.5, что приводит к более частым выделениям\освобождениям памяти.

С++ лагерь говорит, что vector<T> не является списком и показанным выше способом с ним никто в здравом уме не орудует.
Re: собеседования, Реверс списка
От: Abyx Россия  
Дата: 09.10.13 17:47
Оценка: 1 (1) +7 :)
Здравствуйте, Ikemefula, Вы писали:

I>P.S. Крикунам из лагеря С++ — для многих плюсовых контейнеров, которые ресайзят внутренний массив как это показано выше, п..ц наступит гораздо быстрее, практически мгновенно.

C++ лагерь говорит что в С++ у списков нет внутреннего массива
In Zen We Trust
Re[2]: собеседования, Реверс списка
От: fddima  
Дата: 09.10.13 17:51
Оценка: :))) :))) :))
Здравствуйте, Abyx, Вы писали:

I>>P.S. Крикунам из лагеря С++ — для многих плюсовых контейнеров, которые ресайзят внутренний массив как это показано выше, п..ц наступит гораздо быстрее, практически мгновенно.

A>C++ лагерь говорит что в С++ у списков нет внутреннего массива
Ой ли.
Re[5]: собеседования, Реверс списка
От: Vzhyk  
Дата: 09.10.13 18:40
Оценка: +7
Здравствуйте, Ikemefula, Вы писали:

I>Массивы, буфферы всякие — проблема одна и та же, если просто выделять да копировать. Проблема известна со времен Си, и везде говорилось, что надо юзать realloc, но стандартный хип не может гарантировать, что realloc увеличит размер, а не выделит на новом месте.


I>Судя по тому, что мне доводилось видеть, в С++ старую технику realloc давно забыли

И этот человек собеседует плюсовиков... ЧТД!
собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 17:41
Оценка: :))) :))
Здравствуйте, Erop, Вы писали:

E>Ну то решение, которое не нравится НС, если его сделать более или менее по уму, оно всего в два раза медленнее + одна-две аллокации под буфер массива, что на GC полная фигня, как бы...


Алё ! Ты математик или погулять вышел ?
НС>var list = new List<Item>();
НС>while (current != null)
НС>{
НС>  list.Add(current);
НС>  current = current.Next;
НС>}


Объясняю популярно
выделение памяти здесь НЕ линейное, хотя это не очевидно на первый взгляд.

Вот как выделяется память
T[] array = new T[value]; // здесь выделили
                if (this._size > 0)
                {
                    Array.Copy(this._items, 0, array, 0, this._size);
                }
                this._items = array; // а здесь появится основание для выделения

А вот как вычисляется новый размер
int num = (this._items.Length == 0) ? 4 : (this._items.Length * 2);


Здесь будет геометрическая прогрессия с первым членом навроде 11 и знаменателем 2.
Свойство вот этой конкретной прогрессии такое, что каждый следующий блок больше суммы всех предыдущих.

пример — 11, 22, 44, 88
Будет так, надо выделить 22, 11 освободить. остается дыра в 11. выделяем 44, остается дыра в 33, выделяем 88, остается дыра 77 и тд и тд
Память то будет освобождаться, но GC будет жрать все новую и новую память, ибо старый блок дохнет после того, как будет инициализирован новый.
Более того, память будет фрагменироваться не только массивами, но и хипами

Теоретически, GC может и будет двигать неудобные блоки. Но факт в том, что это работает до ~85кб, дальше GC (не в курсе про последние версии), ничего двигать не будет и память будет выделяться-освобождаться как попало.
На самом деле в GC есть оптимизации из за таких вот случаев, но я бы не сказал, что они сработают всегда. Если приложение нормально разогрето, в нем не будет нужного количества свободных блоков должного размера.
То есть, GC будет стараться двигать мелкие объекты(<85 кб), даже не двигать, а гонять их по адресному пространству.

То есть, фокус в том, что эта стратегия выделения очень неудобная для GC.
Итого — суммарно выделится памяти примерно (с*(1-q^n))/(1-q), где q = 2, с примерно 11 или близко к этому.
Столько же памяти и освободится, но из за фрагментации АП это как мертвому припарки — на больших списках это будет фейл, хотя свободной памяти будет хоть в 10 раз больше.

Вообще с добавлением большого количества элементов в ArrayList, List'T или Dictionary нужно быть осторожным, если не знаешь количество элементов для добавления.
Более того, очень осторожно нужно быть со скрытыми массивами, например в инвокейшнлистах и тд и тд. Казалось бы — сделали N подсписчиков, что тут такого ?
А реально выходит хаос память или заканчивается на ровном месте или GC будет педалить, педалить, педалить

E>>>Я так понимаю, если товарищ напишет тебе сортировку за O(N^3) или O(N!), ты этот код одобриши на том основании, что не было никаких требований про производительность ?


E>Нет. Не одобрю. Это очень плохой показатель, а у обсуждаемого "неправильного" кода, показатели-то не такие уж и плохие же. Просто тратит память, но не факт, что это проблема.


Нагрузка на GC — O(2^N) и вот такое решение ты яростно защищаешь, и на ровном месте у тебя Out Of Memory exception с долгими мучениями GC

P.S. Крикунам из лагеря С++ — для многих плюсовых контейнеров, которые ресайзят внутренний массив как это показано выше, п..ц наступит гораздо быстрее, практически мгновенно.
Re[18]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 11:13
Оценка: -2 :)))
Здравствуйте, vdimas, Вы писали:

V>Как пример boost::pool. Хотя и до него подобный вид аллокаторов — самый что ни на есть популярный в плюсах. Самое главное — он на заметно эффективнее даже управляемого GC. Вряд ли ты найдешь сейчас хоть одну плюсовую контору, где бы не использовали страничные аллокаторы и пулы объектов на них.


Про что и речь — сейчас почти любой проект на С++ это в т.ч. написание всевозможных аллокаторов.
Re[42]: собеседования, Реверс списка
От: Andir Россия
Дата: 22.10.13 05:32
Оценка: 7 (3) +1
Здравствуйте, Sinix, Вы писали:

S>2. Ок, в четвёртый раз: если написать софт, который

S>a. работает исключительно под x86
S>b. всё время аллоцирует короткоживущие массивы всё увеличивающегося размера
S>c. вперемешку аллоцирует долгоживущие массивы

Есть способ проще, надо всего лишь, чтобы приложение работало с COM-компонентом x86.
За свою практику я уже несколько раз видел проекты с OOM из-за фрагментации памяти именно в таких условиях. Ещё один опыт был в Silverlight приложении, которое тоже работает в x86-браузере ессно.

--
С Уважением, Andir!
using(<< RSDN@Home 1.2.0 alpha 5 rev. 72>>) { /* Работаем */ }
Re: собеседования, Реверс списка
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 09.10.13 18:27
Оценка: 4 (3) +1
Здравствуйте, Ikemefula, Вы писали:

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


I>Здесь будет геометрическая прогрессия с первым членом навроде 11 и знаменателем 2.

I>Свойство вот этой конкретной прогрессии такое, что каждый следующий блок больше суммы всех предыдущих.

I>пример — 11, 22, 44, 88

I>Будет так, надо выделить 22, 11 освободить. остается дыра в 11. выделяем 44, остается дыра в 33, выделяем 88, остается дыра 77 и тд и тд
I>Память то будет освобождаться, но GC будет жрать все новую и новую память, ибо старый блок дохнет после того, как будет инициализирован новый.
I>Более того, память будет фрагменироваться не только массивами, но и хипами

I>Теоретически, GC может и будет двигать неудобные блоки. Но факт в том, что это работает до ~85кб, дальше GC (не в курсе про последние версии), ничего двигать не будет и память будет выделяться-освобождаться как попало.

I>На самом деле в GC есть оптимизации из за таких вот случаев, но я бы не сказал, что они сработают всегда. Если приложение нормально разогрето, в нем не будет нужного количества свободных блоков должного размера.
I>То есть, GC будет стараться двигать мелкие объекты(<85 кб), даже не двигать, а гонять их по адресному пространству.


I>То есть, фокус в том, что эта стратегия выделения очень неудобная для GC.

I>Итого — суммарно выделится памяти примерно (с*(1-q^n))/(1-q), где q = 2, с примерно 11 или близко к этому.
I>Столько же памяти и освободится, но из за фрагментации АП это как мертвому припарки — на больших списках это будет фейл, хотя свободной памяти будет хоть в 10 раз больше.

Вроде все правильно написал, но вот с деталями накосячил. А дьявол, как известно, именно в них.

Начальный размер List<T> — 16 или 32 (надо уточнить, давно не смотрел сборки).
Простая математика говорит что границу LOH (85кб) пересекаем через 10-11 увеличений размеров буфера, за это время будет выделено 128кб.
Первое поколение GC кажись около 256кб, то есть за время такого "разворота" максимум будет одна Gen0 GC. И то вероятность крайне мала.
То есть до 1,000 элементов вроде как все ОК.

Далее LOH — он вроде как кусками по 16мб выделяется. И собирается только при Gen2. Соответственно если выделяется новый кусок, то запускается Gen2 GC. Он идет в фоне и в общем случае не влияет на скорость работы.
Чтобы список разросся до 16мб надо еще 10-11 увеличений размеров буфера.
То есть 1,000,000 (миллион) элементов и максимум один Gen2 GC.

Фактически одиночный разворот списка до миллиона элементов таким некрасивым образом не даст значительной нагрузки на GC.

А вот если надо каждую секунду надо 10 раз разворачивать список из миллионов элементов, то скорее всего зря был выбран односвязный список.

ЗЫ. Профилирование памяти говорит что самую большую нагрузку на GC дают строки. Больше любого алгоритма. И это не только веб-приложения.
Re[18]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 16.10.13 23:09
Оценка: 4 (2) :))
Здравствуйте, Erop, Вы писали:

E>Про С++ я рассказывал не потому, что там лучше или хуже, а потому, что про то, как в С++ я знаю. Я не думаю, что в С# как-то катастрофически хуже с этим делом и листом пользоваться нельзя-нельзя. Собственно я подставил под сомнение алармистское сообщение I. именно в том смысле, то не верю, что всё настолько плохо и поинтересовался у экспертов в дотнете как оно есть на самом деле, а не в фантазиях нашего напуганного фрагментацией АП коллеги


Наткнулся на статью с примером.
Вкратце:
есть byte[] bigBlock; и есть List<byte[]> smallBlocks;
На каждой итерации вечного цикла bigBlock пересоздается с размером большим на единицу, начиная с 16 MiB,
а в smallBlocks добавляется new byte[90000].
После приёма OOM выводится количество занимаемых мебибайт блоками в smallBlocks.
Вроде бы не слишком сложная задача для нормального аллокатора, но у автора получилось всего-навсего 20MiB.

Проводим независимый тест:
VS2005: 21MiB
VS2008: 21MiB
VS2010: 622MiB
VS2012: 1738MiB
Делаем аналогичный тест на C++ VS2005: 1915MiB

Как видно секретные технологии аллокации медленным темпом утекают в .NET
Вот что говорит автор статьи:

[...] This might not seem so bad: surely the smaller blocks can be put in the large gaps that are left behind?
Well, they can, but there’s a catch. As mentioned previously, .NET prefers to put new memory blocks at the end of the heap, as it has to do less work to find a space where a block will fit: This means that when there’s a new large block on the heap, the next smaller block will be allocated immediately after it, with the consequence that it will have to further extend the heap if the program ever wants to allocate a larger block.

Что очень похоже на правду в случае VS2005 и VS2008.

Спекуляция на тему как всё это развивалось:
В .NET есть два типа кучи — для маленьких(Small Object Heap) и больших объектов(Large Object Heap).
Во время сборки мусора SOH компактифицируется, поэтому политика аллокации может быть простейшей, например просто добавление в конец, пока не упрёмся, а потом вызываем GC.
Большие объекты, передвигать накладно, поэтому эти ребята решили добавить LOH, в которой нет компактификации. Но, политику аллокации координатно не пересмотрели. Пользователи конечно же сказали им большое спасибо :

It really takes a large amount of chutzpah to release a product with such a major flaw. It basically makes it almost impossible to write long-running server processes in .NET. This issue almost cost my company a contract since we were experiencing inexplicable OutOfmemoryExceptions in a very important product.

The problem can be solved by
a) treating large objects like normal objects and compacting the LOH during a generation 2 collection or
b) using a classic heap management algorithm like the one from Donald Knuth to ensure that the total size of the heap never exceeds two times the total number of allocated bytes.

I don't expect microsoft to do anything about this issue. After all, they are busy adding new language features like dynamic to C# in order to make it more buzzword compliant. And they did not do anything about any of the other highly rated feedback items I have submitted. But I think everybody should know about this issue so that they can avoid the .NET platform for important applications.

Теперь же пытаются думать задним числом, постепенно улучшая аллокатор, и добавляя костыли типа ручного вызова компактификации.
Но у C#-истов осадочек-то остался, и боятся они теперь больших объектов как огня

Кстати, по поводу боязни растущих векторов — если заменить List<byte[]>, на List<byte>, и соответственно добавлять в него всё что раньше было в блоках — байт за байтом — то даже на VS2005 получается достичь "фантастических" 511MiB, потому что будут не тысячи LO, а всего два
Re[36]: собеседования, Реверс списка
От: Erop Россия  
Дата: 19.10.13 05:19
Оценка: 3 (1) +1 -1 :)
Здравствуйте, Ikemefula, Вы писали:

I>А ты думал я тебе сказки рассказываю ?


Лично я с самого начала предполагал, что какая-то проблема есть, но ты либо неточно описываешь механизм её возникновения, либо не точно понимаешь её причины сам.

Пока что удалось выяснить что
1) дотнетовский аллокатор вообще очень плохо совместим с большими кускам памяти, в отличии от кучи других аллокаторов. Не в последнюю очередь и потому, что он вообще неправильно с большими объектами работает. На кой ему вообще сдались LOH? Зачем он АП пачками ест? Ну да это всё лирики, таки надо констатировать что тот дотнетовский аллокатор, который работает сейчас в программах у пользователей -- УГ

2) Что бы разобраться в этой проблеме сообществу шарпистов понадобилось 10 лет и решение нашлось в целом вообще в духе платформы, типа пусть авторы рантайма и фиксят, а пока некоторый класс алгоритмов юзать поостережёмся

На крайнк, если никак не обойтись, всегда мона на С++ сделать, где таких проблем нет, так как там народ с аллокаторами на короткой ноге, а в шарпе с аллокаторами мутить -- не барское типа дело.

Вот пока что такую картину вы с НС сложить смели своими показаниями и соображениями.

Если она в чём-то не точна, то ты можешь её уточнить, показать КАК ЕЩЁ решали проблему РАНЬШЕ, например...
А так, спасибо за инфу. Я раньше не думал, что идеология платформы столь сильно парализует волю разработчиков под неё
Или это всё-таки отбор?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 14.10.13 15:18
Оценка: -1 :)))
Здравствуйте, Marty, Вы писали:

E>>ну, например, как ты думаешь, если вот тупо взять и написать на плюсах std::vector<char> и начать в него добавлять по одному, миллион символов добавить удостся?..


M>А ты этим что хотел доказать?


M>millioncharsvector.cpp

M>Результат
M>
M>...
M>i = 689594368
M>i = 689595392
M>Error: bad allocation
M>


Эх, чОрт, не помог VirtualAlloc
Re[19]: собеседования, Реверс списка
От: Sinix  
Дата: 17.10.13 05:35
Оценка: +3 -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Теперь же пытаются думать задним числом, постепенно улучшая аллокатор, и добавляя костыли типа ручного вызова компактификации.

EP>Но у C#-истов осадочек-то остался, и боятся они теперь больших объектов как огня


Вы хоть чуть-чуть разберитесь, перед тем как писать. А то я вам тоже докажу, что c++ как огня боится перекрёстных ссылок, а haskell — мутабельных переменных
Re[45]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 15:07
Оценка: -1 :)))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Есть List, нужно заменить его на что-то более fragmentation-friendly, и естественно желательно не ухудшив сложность операций


Не всех операций, а только критичных, что покажет __профайлер__. Вообще оптимизируются исключительно __узкие__ места, а не все подряд.
Узкое место, например RemoveAt(0) — можно заменить на деку что на массивах
А если узкое место, например RemoveAt(index) — заменять на ту же деку СМЫСЛА НЕ ИМЕЕТ, ибо будет ровно та же проблема, только слегка амортизированая

I>>Это может сказать только профайлер.


EP>Давай ты не будешь разводить демагогию на тему node-based tree vs indexed chunks, необходимость профайлеров и всё-такие, ок?


Демагогия это у тебя, т.к. общие рассуждения о прекрасном при отрицании необходимости профайлера.
В реальном приложении обращения к коллекции не все одинаковые, а это разные операции у которых, внезапно, разная частота использования. И вот этот расклад, внезапно, показывает профайлер !

У меня в проекте IndexOf/Contains/RemoveAt/InsertAt каждый по отдельности работали несравнимо дольше, чем ElementAt, foreach, AddLast, RemoveLast, более того, намного дольше чем сам собтсвенно алгоритм.
При этом, наиболее частые операции добавления-удаления это InsertAt(0) и RemoveAt(0). бОльшая часть коллекций короткие, до 100, еще небольашя часть до 4000, больше этого всего 5-10 коллекций и в них от 100 тыс элементов. При этом, что в больших, что в малых коллекциях, суммарно одинаково элементов. То есть, сумма элементов больших коллекций == сумме элементов малых коллекций.
Ну и LOH, куда же без него.

Где узкое место ?
1 Первые четыре операции, в особенности InsertAt(0), RemoveAt(0)
2 LOH

Вот их и нужно оптимизировать, а на все остальное — насрать. В силу особенностей алгоритма количество вызовов зависит от количества хранимых элментов, то есть, при линейной асимптотике операций нарисовывается квадратичная сложность основного алгоритма. Реально она еще больше, сам алгоритм нелинейный.

Правильная оптимизация такая — подобрать структуру, которая радикально улучшит первые четыре, LOH, а на остальное можно даже забить. Например, насрать, если ElementAt станет линейным, а не константным. Когда это станет узким местом, вот тогда и надо будет оптимизировать.

Я, например, выбрал такую оптимизацию —

Contains — O(1)...O(N/chunk_size)
RemoveAt/InsertAt O(1)-O(N/chunk_size + K/4),
ElementAt — O(N/chunk_size + K/4)
RemoveAt(0),InsertAt(0) — O(1)
IndexOf — 0 (нуль)
N для малых, С*N, где С конская константа, примерно 32 или 64, точно не помню, для больших
LOH test — passed

Руководствуясь рассуждениями о прекрасном, я все только опаскудил, ибо ElementAt сделал линейным, а память распылил до невозможности
А по факту — общее время алгоритма с 6 часов стало менее 10 минут, OOM исчез, GC стал работать без лагов

Почему так получаетс ? потому что
1. ElementAt по частоте сильно уступал Contains и он так и не стал критическим местом.
2. С*2*N — только для больших коллекций и из этих больших коллекций осталась не 5-10, а 2-3

Итого — если у тебя есть возражения, покажи где я ошибся и что сделал неправильно, если тебе конечно есть что сказать. Рассуждения о прекрасном оставь для детей.
Re[8]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 14:19
Оценка: 3 (1) :))
Здравствуйте, Erop, Вы писали:

I>>В который раз говорю — не затраты на переаллокации, а скорость потребления адресного пространства.


E>Оценки какие-то будут?..


E>ну, например, как ты думаешь, если вот тупо взять и написать на плюсах std::vector<char> и начать в него добавлять по одному, миллион символов добавить удостся?..


А ты этим что хотел доказать?

millioncharsvector.cpp

#if !defined(_IOSTREAM_) && !defined(_STLP_IOSTREAM) && !defined(__STD_IOSTREAM__) && !defined(_CPP_IOSTREAM) && !defined(_GLIBCXX_IOSTREAM)
    #include <iostream>
#endif

#if !defined(_VECTOR_) && !defined(_STLP_VECTOR) && !defined(__STD_VECTOR__) && !defined(_CPP_VECTOR) && !defined(_GLIBCXX_VECTOR)
    #include <vector>
#endif

#if !defined(_EXCEPTION_) && !defined(__EXCEPTION__) && !defined(_STLP_EXCEPTION) && !defined(__STD_EXCEPTION)
    #include <exception>
#endif

#if !defined(_STDEXCEPT_) && !defined(_STLP_STDEXCEPT) && !defined(__STD_STDEXCEPT) && !defined(_CPP_STDEXCEPT) && !defined(_GLIBCXX_STDEXCEPT)
    #include <stdexcept>
#endif

#ifndef WIN32_LEAN_AND_MEAN
    #define WIN32_LEAN_AND_MEAN
#endif

#ifndef STRICT
    #define STRICT
#endif

#if !defined(_WINDOWS_)
    #include <windows.h>
#endif



int main(int argc, char* argv[])
   {
    try{
        const int maxI = 1024*1024*1024;
        std::vector<char> v;
        for(int i=0; i!=maxI; ++i)
           {
            if (i && i%1024 == 0) std::cout<<"i = "<<i<<"\n";
            char ch = ' ' + (char)(i%64);
            //v.append(1, ch);
            v.push_back(ch);
           }
        std::cout<<"Char at random position: '"<<v[GetTickCount()%maxI]<<"'\n";

       }
    catch( const std::exception &e )
       {
        std::cout<<"Error: "<<e.what()<<"\n";
       }
    catch( ... )
       {
        std::cout<<"Error: unknown\n";
       }
    
    return 0;
   }


Результат
...
i = 689594368
i = 689595392
Error: bad allocation
Маньяк Робокряк колесит по городу
Re[42]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 15:54
Оценка: 3 (1) +2
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Кому?

Всем, это же публичный форум, не?..

НС>Икемефуле? А почему тогда ты сделал вывод о "С#-разрабов в массе своей"? Я пока логики у тебя не улавливаю.

Бывает. В целом я не обещал, что до всех дойдёт...
Так что там у нас с общепринятым решением?

НС>Для чего того же? Для разворота списка?

Очень трудно поймать чёрную кошку в тёмной комнате, особенно если её не ловить...

НС>Но обычно доступа по индексу и не нужно.

Это можно интерпретировать так, что обычно алгоритмы, где таки нужно, программируют на более иных языках?..

НС>Разумеется, абсолютно универсального рецепта нет.

Ну вот я про то же самое, как бы...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: собеседования, Реверс списка
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 10.10.13 07:50
Оценка: 1 (1) +1 -1
Здравствуйте, gandjustas, Вы писали:

N>>С++ лагерь говорит, что vector<T> не является списком и показанным выше способом с ним никто в здравом уме не орудует.


G>Что значит не является списком? С точки зрения Д. Кнута таки является. а и его устройство аналогично .NETовскому List<T>.


Во-первых, std::vector<T>- это умная обёртка над буфером. Похожим на список его делают разве что итераторы, но итераторы можно прикрутить и к обычному куску памяти.
Во-вторых, от std::vector<T> никто не ждёт поведения типичного для работы со списками: быстрая вставка и удаление элементов, то же реверсирование и другие подобные задачи. Он не для этого сделан и, повторюсь, не используется для вышеперечисленных задач. Всем плевать, какое определение давал спискам Кнут и как устроен дотнетовский List<T> — std::vector<T> просто не предназначен, он плох для выполнения тех задач, под которые не заточен. Поэтому его и не назвали списком, а дали имя вектор. Подумай об этом.
Ну и в-третьих, если кто-нибудь захочет всё таки использовать std::vector<T> для несвойственных ему задач, то напишет (или найдёт в сети) подходящий для этого аллокатор, который будет вести себя оптимальным образом на конкретной задаче. И при этом будет работать лучше, чем любой универсальный GC.

Вот как поступает С++ лагерь.
Re[11]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 09:54
Оценка: +2 :)
Здравствуйте, Ikemefula, Вы писали:

I>Объясняю в который раз — речь про адресное пространство, а не память.


I>Адресное пространство != память.

I>Адресное пространство != память.
<...>
I>Адресное пространство != память.
I>Адресное пространство != память.
I>Адресное пространство != память.
I>Адресное пространство != память.

Ну чё, в копи-пасте ты спец. А теперь покажи свои оценки цены вопроса. Если считаешь, что в этом случае важнее расход адресного пространства -- посчитай и его, какие проблемы-то?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 13:36
Оценка: +2 :)
Здравствуйте, Ikemefula, Вы писали:

I>Специфическая, но на больших приложениях довольно часто дает проблемы, ибо там с фрагментацией по естественным причинам очень плохо. И фокус такой, что свалится GC необязательно на этом цикле. Т.е. пока найдешь и отловишь — семь раз поседеешь, если раньше не сталкивался.


некоторые люди, когда видят, что упала относительно болшая аллокация, начинают использовать ИНСТРУМЕНТЫ, что бы посмотреть что там в АП процесса и в кучах творится, как бы сразу, а не когда поседеют. Но тебе такие не нужны, я понимаю, тебе нужны такие, которые список верно угадают, как вертеть
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[30]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.13 19:20
Оценка: :)))
Здравствуйте, Erop, Вы писали:

I>>То есть, вся твоя мега идея "VirtualAlloc" заключается в том, что есть два хипа — для малых и больших объектов. Один управляется либой, второй — виндой.


E>Слушай, почитай, как виндовые кучи работают и как сишные Мои идеи тут вообще не при чём.


Уже давно почитал и тебе советую.

I>>Ты так и не смог показать, где и чем тебе помогает VirtualAlloc

E>Ну я постепенно понял, что тебе я ничего показать не смогу. Засим закругляю безнадёжные попытки.

Конечно не сможешь, потому что VirtualAlloc к дефрагментации АП никакого отношения не имеет, вообще.

I>>Я показал тебе самый минимальный случай фрагментации — всего два куска. Меньше просто не бывает. Если VirtualAlloc не может разрулить этот самый простой случай, значит, что он тебе ничем помочь в принципе не может.


E>Тем не менее, программы под виндой рабтают и проблем, вроде описанного тобой ужоса не имеют Чудо, как оно есть, только и всего.


Работают, и при этом винда НЕ умеет делать дефрагментацию АП внутри процесса, это умеет делать только GC.

I>>Ты помоему так и не понял, что такое адресное пространство.

E>Зато ты не понял, почему работают нормальные программы под виндой и не падают по ООМ из-за фрагментации АП, в отличии от твоих поделей

Мои — НЕ падают, при том что жрут вагон памяти.
Re[13]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 14.10.13 15:54
Оценка: :)))
Здравствуйте, Marty, Вы писали:

EP>>Давай по порядку. Что ты хотел своим тестом показать? И что по твоему он показал?

M>Я не совсем понял, что Erop хотел сказать, но судя по тону фразы он сомневался, что в вектор можно последовательно добавить миллион char'ов. или это сарказм был

Егор прочитал непойми где что "VirtualAlloc помогает". Объяснить, как именно помогает VirtualAlloc, он не смог, ограничился "Почитай Рихтера" и "читай как устроены хипы"

Своим примером ты показал, что VirtualAlloc ничем не помогает, а помогает grow factor 1.5 и то, слабовато, т.е. все равно всё сдохло. То есть, все работает, как и должно.
Re[16]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 14.10.13 15:56
Оценка: -3
Здравствуйте, vdimas, Вы писали:

V>Не факт. Периодически или же при невозможности найти подходящий непрерывный кусок памяти менеджер хипа занимается поиском и склейкой прилегающих пустых областей. При этом сами страницы упорядочиваются в иерархии по размерам по основанию двойки, т.е. склейка довольна дешева, две склеенные страницы образуют новую.


V>В общем, если будешь добавлять по 1-му символу в сишный вектор, то ничего военного не произойдет.


Тест в этом же треде с тобой не согласен — все дохнет как и должно быть Ты уже манагер, что ли ?
Re[18]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 13:48
Оценка: :)))
Здравствуйте, Erop, Вы писали:

I>>То есть, VirtualAlloc никак не помогает. Ровно тот же результат можно получить если выделять память сразу одним куском в 2гб и потом нарезать его на хипы для больших и малых объектов.


E>То есть VA -- это ШТАТНЫЙ в WinApi аллокатор АДРЕСНОГО ПРОСТРАНСТВА,..


Аллокатор адрессного пространства это шедевр

>Оно умеет не тока закомиченную память выдавать, но и зарезервированную, то есть АП как оно есть.


Аллокатор подразумевает ,что когда тебе нужен ресурс новый или старый закончился, аллокатор навыделяет тебе еще этого самого русурса.
Как это можно сделать — не совсем ясно. Наверное это будет так — есть окно от 1гб до 1.1гб, надо выделить 200мб, аллокатор адрессного пространства довыделит 100мб и опаньки — в окно 100мб размещаем 200мб данных, только байты будут нумероваться не целыми числами, а дробными

E>Поэтому чем меньше у тебя будет прослоек между твоим аллокатором памяти, в случае аллокации больших кусков, и аллокатором АП, тем меньше шансов нарваться на фрагментацию АП НЕ ПО ДЕЛУ...


То есть, VirtualAlloc ни при чем, т.к. это же можно повторить и без него, а именно с помощью конкретного сценария управления хипом.

I>>Все что дает VirtualAlloc это быстродействие.

E>Мальчик, иди, отсюда. Не, прапвда, ты вот правда думаешь, что если кусануть по VA сразу полгига памяти, а потом её там распределять как-то, то это будет медленнее, чем вызывать VA?

И это очевидно вобщем то. VirtualAlloc позволяет выбирать, когда именно коммитать физическую памяти. Без этого будут приседания с виртуальной памятью в обязательном порядке.

E>Собственно тебе ужо всё показали, рассказали и книжки нужные читать послали до полного просветления.


"аллокатор АДРЕСНОГО ПРОСТРАНСТВА"

E>Так что тему помогает там VA фрагментации или мешает закрыть, каждый останется при свом мнении, у кого подкреплённом тестами и знаниями, а у кого всякими там соображениями, не суть, и вернуться к тобой же созданному топику.


Ты так и не показал, как VirtualAlloc поможет в приведеных мною сценариях

E>Итак, до какого размера списка байтов можно в него пихать байты, что бы не парится о фрагментации?

E>До мегабайта можно? А до 10? А до 100?

Все ответы уже дадены — зависит от свободных окон в адресном пространстве.
Re[11]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.10.13 12:04
Оценка: +1 -2
Здравствуйте, Erop, Вы писали:

A>>я не хочу брать листочек и тратить минуту. я хочу разбираться с кодом с той скоростью с которой я его читаю


E>1) Тренеруйся


Тренироваться надо, но тем не менее код должен пониматься с той скоростью, с которой его читаешь. У Дворкина решение рабочее, но стиль написания примитивный, нужно вчитываться что бы понять.

У Abyx код предельно понятный сходу.

E>2) Код в защищаемом тоюой стиле лишь создаёт иллюзию понятности, то есть ты из него понимаешь, что хотел сказать автор, но то, что он действительно сказал наоборот тут сильнее спрятано...


Если код понятен с первого прочтения, то где эта самая иллюзия ?

E>Хинт: комментарии таки рулят


Комментарии это отстой. Комментарий всегда означает, что в коде существует проблема, но автору кода лень было решить её внятно и он накидал коментариев. Ну и коментарии нужно обновлять денно и нощно.
Re[37]: собеседования, Реверс списка
От: Sinix  
Дата: 21.10.13 06:04
Оценка: -1 :))
Здравствуйте, Erop, Вы писали:

E>Пока что удалось выяснить что

E>1) дотнетовский аллокатор вообще очень плохо совместим с большими кускам памяти, в отличии от кучи других аллокаторов. Не в последнюю очередь и потому, что он вообще неправильно с большими объектами работает.

Ошибка уже в первом пункте
Я наверно раза четыре написал, что шансы получить OOM в реальном приложении именно из-за фрагментации кучи стремятся к 0. Но даже этот 0 обходится элементарно — переходом на x64, обновлением фреймворка, или (наконец) изучением матчасти.

Дотнет (как и любой другой фреймворк/язык) имеет свою область применимости. Основные области для дотнета сейчас — энтерпрайз, сайты, мобильные приложения и (в следовом количестве) десктопный софт. Именно под них и затачивается рантайм/BCL/etc. Появляются новые требования, например, от разработчиков azure и мобильного софта — допиливается и сама платформа. Нет требований и ресурсов на их реализацию — никто и не шелохнётся.

Итак, раз уж мы говорим за 10 лет — где хоть одна статья с описанием нерешаемых проблем, вызванными особенностями LOH? Только плиз, написанная нормальным разработчиком со знанием матчасти, а не "Вау, мы поломали дотнет!"

P.S. Судя по вот этому:

На кой ему вообще сдались LOH? Зачем он АП пачками ест? Ну да это всё лирики, таки надо констатировать что тот дотнетовский аллокатор, который работает сейчас в программах у пользователей -- УГ

в ходе обсуждения проблему раздули до размеров мамонта.

Во-первых, аллокатор LOH принципиально ничем не отличается от аллокаторов в других языках — та жа куча + free list. Т.е. "На кой ему вообще сдались LOH? Зачем он АП пачками ест?" ровно с теми же основаниями можно спрашивать у c++

Во-вторых, реализация CLR (начиная со второго фреймворка) позволяет заменять отдельные части рантайма (аллокатор памяти/запуск потоков, GC, JIT итд) вплоть до написания своего clr-хоста. Например, в составе дотнета ещё с 1 фреймворка поставляется 2 gc — server и desktop. Т.е. чисто технически изменить логику аллокатора (и вообще его заменить) — проблем нет. И, если уж это было бы серьёзной проблемой — было бы пофикшено ещё в ранних бетах/ctp. Как появились ресурсы — поправили, но обратного переноса (с clr4 на clr2) не было по одной простой причине — MS не тратит ресурсы на добавление новых фич в старые версии продуктов. Политика.

E>А так, спасибо за инфу. Я раньше не думал, что идеология платформы столь сильно парализует волю разработчиков под неё

E>Или это всё-таки отбор?
Не, это наброс.
Re[44]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 21.10.13 13:34
Оценка: +2 :)
Здравствуйте, Ikemefula, Вы писали:

EP>>BigList это аналог std::map<std::size_t, T>, с O(log(N)) random access. А нужен именно аналог листа, чтобы после замены не выросла сложность алгоритма

I>С чего ты взял, что random access всегда является узким местом array-like структурах ?

Есть List, нужно заменить его на что-то более fragmentation-friendly, и естественно желательно не ухудшив сложность операций

I>Это может сказать только профайлер.


Слушай, тут уже обсудили сложность вставки N элементов в std::vector-like без reserve, и ты уже проделал нелёгкий путь O(2^N) -> O(N^2) -> O(N*log(N)) -> O(N):
http://www.rsdn.ru/forum/flame.comp/5325486.1
Автор: Ikemefula
Дата: 09.10.13

I>Нагрузка на GC — O(2^N) и вот такое решение ты яростно защищаешь

http://www.rsdn.ru/forum/flame.comp/5334577.1
Автор: Ikemefula
Дата: 17.10.13

I>Если N объектов в списке коррелирует с Е количеством объектов в системе, то на ровном месте получается плохая зависимость, т.к. время работы GC это O(E+V), где E количетсво объхектов, V количество ссылок между ними.
I>Итого, N коррелирует с E и это значит, что нагрузка на GC будет практически N^2.

http://www.rsdn.ru/forum/flame.comp/5334801.1
Автор: Ikemefula
Дата: 18.10.13

I>Я чучка погорячился про квадратичность, но сути это не меняет. N*log(N) с подключением свопа мало чем отличается для обсуждаемого размера АП.

Давай ты не будешь разводить демагогию на тему node-based tree vs indexed chunks, необходимость профайлеров и всё-такие, ок?

I>Нужно знать, насколько критичен этот random access. Во многих случаях List можно заменить на BigList или даже ScanList или даже LinkedList, а во многих случаях random access можно на раз получить с помощью простого словаря, который будет создаваться-разрушаться на каждую операцию. Если время работы алгоритма больше долей секунды, то издержками на копирование в словарь можно пренебречь.


Да и вообще, всё в БАЗУ упирается!
Re[51]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 17:40
Оценка: -1 :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>То есть, оптимизировать без реальной на то обходимости ? "у нас небольшой List давайте заменим на flat_map, потому что асимптотика подходит"


EP>у flat_map вставка O(N)


То есть, даже рассуждения о прекрасном не помогают ?

>>>Но как это относится к данному топику? У нас же "огромные и ужасные List'ы"

I>>Правильно. И ответ, на что менять List, дает ответ профайлер и требования, а не рассуждения о прекрасном.

EP>Профайлер дал ответ, что нужен random-access, что было ясно и без него(например, потому что реализуется heap), дальше что?


Профайлер должен сообщить следующе

1. время работы некоего алгоритма который использует коллекцию слишком велико
2. основное время работы это тот самый random-access

Вот тогда можно подбирать конкретную оптимизацию. И вот именно random-access как правило редкий случай, почти что экзотический. Там где он становится узким местом, почти наверняка проблема не в коллеции, а в платформе, если алгоритм верный. Чем тебе здесь дека поможет — совершенно не ясно.
Re[46]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 17:56
Оценка: +2 :)
Здравствуйте, Ikemefula, Вы писали:

I>Не всех операций, а только критичных, что покажет __профайлер__. Вообще оптимизируются исключительно __узкие__ места, а не все подряд.


а пессимизируются, зато все? Или как? В целом, подход весьма экологичен, и мне нравится. Если какие-то операции, не дай Бог преждевременно оптимизируешь, то профайлер покажет, что остальные тормозят, и надо ускорять код, а вот если тормоза аккуратненько ровным слоем размазать, то профайлер "покажет", что тормозит сервер, и надо ускорять датацентр...
В целом прикольно, чё.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[44]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 18:07
Оценка: 3 (1) +1
Здравствуйте, Ikemefula, Вы писали:

E>>Это можно интерпретировать так, что обычно алгоритмы, где таки нужно, программируют на более иных языках?..


I>Где таки нужно — нужно рассматривать конкретные случаи под профайлером. Если профайлер покажет, что узкое место это обращение по случайному индексу, и средствами дотнете не удастся обеспечить должное быстродействие, то будет использован С а может и С++


Понимаешь, некоторые люди тут, ещё на этапе проектирования и выбора алгоритмов и структур данных понимают временную сложность получающихся алгоритмов...
А некоторые по 10 лет с профайлером ловят эти элементарные в общем-то ошибки дизайна... Ну у всех свой хлеб и свой подход.

Самое же удивительное в этих "первых" и "вторых", что, судя по моему опыту, первым никогда не влом разбраться и поучится, зато вторые всегда всё знают, и всем объясняют, что попытки использовать голову вместо автоматических инструментов -- это колхоз...

НС>>>Разумеется, абсолютно универсального рецепта нет.

E>>Ну вот я про то же самое, как бы...

I>Это ты забираешь слова про VirtualAlloc ?

Это я понимаю, что рецепта нет в сишарпе...
В плюсах под win32 аллокаторы никогда такими убогими не были...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[43]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 21.10.13 13:49
Оценка: 2 (1) :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Существует ли какая-нибудь распространённая реализация ChunkedList?


ХЗ, не интересовался.
Re[4]: собеседования, Реверс списка
От: fddima  
Дата: 09.10.13 19:02
Оценка: +1 :)
Здравствуйте, LaptevVV, Вы писали:

LVV>Залезте в STL и посмотрите.

LVV>Внутренний массив есть у вектора, и список массивов есть у дека.
LVV>У списков — нет массива. Там память выделяется индивидуально.
Нечего там смотреть, более того смотрел и не раз, учить меня не надо. То что вы называете вектором — в .net BCL называется списком, иногда это же люди называют динамическим массивом. Связные списки и всякого рода деревья как ни странно в .net тоже есть, а чего нет — так же само можно реализовать. Зачем путать ADT с реальными имплементациями структур, которые везде одинаковые.
Re[26]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.13 04:44
Оценка: +2
Здравствуйте, Vzhyk, Вы писали:

I>>Вопрос — как имеено тебе поможет VirtualAlloc в этом сценарии ?

V>Почитай про то как работают менеджеры памяти, начни хотя бы с того же Рихтера или википедии.

Рихтер прямо говорит — никак не поможет.

Вот тебе стоит Рихтера почитать, глядишь, узнаешь что такое адресное пространство.
Re: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 11.10.13 13:02
Оценка: -1 :)
Здравствуйте, Ikemefula, Вы писали:

Коллеги, объясните мне, что здесь происходит ? Какие реаллокации ? Линейный однонаправленный список в С/C++ на базе ссылочной реализации переворачивается без какого бы то ни было выделения памяти.

Или я что-то не понял ?

Примечание : нехватка памяти при добавлении не обрабатывается.

struct ListElement
{
    int data;
    ListElement* next;
};

class List {
private :
    ListElement* begin;
public:
    List() { begin = NULL;}
    void AddToBegin(int x)
    {
        ListElement * temp = new ListElement;
        temp->data = x;
        temp->next = begin;
        begin = temp;
    }

    void Reverse()
    {
        ListElement * newBegin = NULL;
        ListElement * cur = begin;
        while(cur)
        {
            ListElement * next = cur->next;
            cur->next = newBegin;
            newBegin = cur;
            cur = next;
        }
        begin = newBegin;
    }

    void Print()
    {
        for(ListElement * cur = begin; cur; cur = cur->next)
            printf("%d\n",cur->data);
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    List l;
    l.AddToBegin(4);
    l.AddToBegin(3);
    l.AddToBegin(2);
    l.AddToBegin(1);
    l.Print();
    l.Reverse();
    l.Print();
    return 0;
}
With best regards
Pavel Dvorkin
Re[13]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 15:39
Оценка: +2
Здравствуйте, Marty, Вы писали:

EP>>Давай по порядку. Что ты хотел своим тестом показать? И что по твоему он показал?

M>Я не совсем понял, что Erop хотел сказать, но судя по тону фразы он сомневался, что в вектор можно последовательно добавить миллион char'ов. или это сарказм был

Это был сарказм. Поэтому я и не понял к чему был твой тест в ответ на сообщение Erop'а.

M>Тест же показал, что примерно 700 миллионов char'ов добавляются в конец без проблем.


Что не удивительно, учитывая что у MSVC'шного вектора capacity растёт на 50%. То есть в момент реаллокации в памяти находится 2.5x от текущей capacity.

EP>>И сразу, чтобы два раза не писать — покажи свой результат для std::deque.

M>А самому слабо? Весь код есть

Мне интересен был твой результат.
Re[14]: собеседования, Реверс списка
От: vdimas Россия  
Дата: 14.10.13 17:43
Оценка: +2
Здравствуйте, Ikemefula, Вы писали:


I>Своим примером ты показал, что VirtualAlloc ничем не помогает, а помогает grow factor 1.5 и то, слабовато, т.е. все равно всё сдохло. То есть, все работает, как и должно.


Ты утверждал, что все заткнется из-за дефрагментации, не?
И облажался, по результатам теста. Если в тесте после грубо 660 метров не удалось выделить память, то это значит, что всего было запрошено порядка 660*3=1980 метров. ЧТД.
Re[16]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 20:00
Оценка: +2
Здравствуйте, Marty, Вы писали:

M> Вышенаписанное вообщем-то подтверждает точку зрения Ikemefula, что некоторые менеджеры памяти для C++ не совсем совершенны.


В твоём примере как раз видно, что если и есть фрагментация, то мизерная. Теоретический потолок — 2GiB/2.5, причём это без dll'ек, без стэка и т.п.
Посмотри, например, по каким адресам у тебя dll'ки загрузились, куда .exe, где стэк находится и т.п
Re[16]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 23:22
Оценка: +1 :)
Здравствуйте, Erop, Вы писали:

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


M>>Я признаться, тоже не понял, как VirtualAlloc поможет. Тут скорее нужен свой аллокатор с использованием memory mapped files.


E>Я же уже писал.

E>Есть два эффекта.
E>1) Когда куче не хватает памяти, она кусает по VA ещё сегмент, в котором проолжает нарезать блоки, потом ещё сегмент, ещё сегмент и т. д. Трудность в том, что эти сегменты трудно освобождать, так как надо понять, что там нет занятых блоков...

Ну ты бывало мне уже доказывал, что я не прав, когда я был 100% уверен что я прав
Но тут ты точно не прав

VA, если я не ошибаюсь, возвращает адрес (в АП процесса) для запрошенного куска памяти. Она может не коммитить, а только резервировать физическую память (или не?). Но как VA может помочь с проблемой фрагментации АП, я как говорится, не догоняю.

А, да. Рихтера читал, Руссиновича со вторым евреем читал, все трое на полке пылятся (где читать, на какой странице, если что?); применял полученные знания в работе, в разных проектах, вроде все работало, но все равно тебя не могу понять
Маньяк Робокряк колесит по городу
Re[12]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.10.13 00:57
Оценка: :))
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Это покуда у тебя тесты. А как реальное приложение с кучей разных активностей, да если оно еще и многопоточное, то печаль начинается от объемов на порядок ниже.

Печаль начинается еще раньше, ретроспективно понимаешь, что выбор C# был не самой хорошей идеей, но что уж поделать
Маньяк Робокряк колесит по городу
Re[20]: собеседования, Реверс списка
От: Sinix  
Дата: 15.10.13 08:41
Оценка: -2
Здравствуйте, Erop, Вы писали:

E>Ну вот представь, что у тебя бесконечное АП, а памяти, тем не менее, есть всё те же 1900, скока удастся тут байтиков в вектор запихать?..


При известной настойчивости — вплоть до исчерпания max_size()
Re[20]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 11:08
Оценка: -1 :)
Здравствуйте, vdimas, Вы писали:

I>>

I>>Error: bad allocation


I>>"не дохнет" это оно ?


V>Дык, область в 2 гига кончилась. Как и должно быть. 680*3=x. )))


Протри глаза — 3 никак не может быть. Куда делось АП ?
Re[10]: собеседования, Реверс списка
От: Erop Россия  
Дата: 16.10.13 11:49
Оценка: +2
Здравствуйте, Abyx, Вы писали:

A>в "p->next = cur;" используются четыре сущности — p, ->next, operator=, cur.

A>читается это как "в p, члену класса next, присвоить cur"

A>а в "set_next(p, cur);" используются три сущности — set_next, p, cur.

A>читается это примерно как "p set_next cur".
A>(c "p.set_next(cur)" было бы чуть проще, хотя использование явного или неявного this вобщем-то не важно)


Знаешь, что? IMHO, если тебе доставляет сложности анализ и понимаени кода из этих семи присваиваний, то это, списки тебе лучше бы не разворачивать...

IMHO, это всё настолько просто и понятно, что пофигу. При этом ты напложил каких-то фантастических сущностей, про которые ещё не понятно что конкретно они делают и переусложнил всё раза в два, и втриаешь при этом про читабельность. А реально читабельные индентификаторы -- это есть хорошо. И кад в стиле "семь присваиваний" лучше бы ими снабдить, а пложение кучи функций с непонятными контрактами -- это плохо и переусложение...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[27]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 15:46
Оценка: -2
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Где?

EP>Так сколько в твоих "инвокейшнлистах" подписчиков, что это вызывает проблему?

Я уже давал ответ. Не умеешь читать — на кой ляд ты сюда вообще пишешь ?
Re[33]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 17:55
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>>>"Проблема актуальная для больших приложений в архитектуре навроде x86, где АП ограничено — всего 2гб, но в силу естественной фрагментации размер непрерывного отрезка АП может быть намного меньше, в 10 и более раз"

EP>>>Как показывает простейший тест естественная фрагментация стала действительно "естественной", а не следствием дубового аллокатора, только начиная с VS2012
I>>Естественная фрагментация это следствтие работы системы в естественных условиях в конкретном случае: рантайм, винда, данные пользователя и тд и тд.

EP>Опять терминологический спор. Ну ок: как показывает простейший тест естественна фрагментация стала намного благоприятней в следствии замены дубового аллокатора начиная с VS2012

EP>Теперь списков на x86 меньше боишься?

Подумай тем местом, что между ушами. В правильной стратегии аллокации c использованием GC эта проблема всё равно возникнет, только всего чуток позже, самую малость.
При этом, нагрузка на GC будет зависеть от
1. количества аллокаций
2. количества объектов вообще

Если N объектов в списке коррелирует с Е количеством объектов в системе, то на ровном месте получается плохая зависимость, т.к. время работы GC это O(E+V), где E количетсво объхектов, V количество ссылок между ними.
Итого, N коррелирует с E и это значит, что нагрузка на GC будет практически N^2. Список в любом случае будет вызывать фрагментацию, хоть убейся, этого не избежать. Даже всякие схемы уплотнения ничего радикально не меняют.
Задав капасити, можно обработать список равный размеру свободной памяти. Без этого будет втрое меньше и это фрагментация в чистом виде.

То есть, эта проблема общая для любых приложений на любых языках, которые расходуют память в объемах сравнимых с размером адресного пространства.

Для случаев без GC все получается гораздо хуже, именно с этой конкретной проблемой, дефрагментации у тебя нет и быть не может. То есть, все еще хуже чем с GC.

Отсюда следствие — как бы ты ни приседал с аллокацией , эта же проблема возникнет в любом языке, для любого контейнера на массиве, в котором grow factor == 2 без реаллокации, и в который добавление идет по одному элементу без задания начальной капасити. В идеальном случае можно выделить AП/3. Реально будет максимально доступное окно поделить на три. Все проги без GC уже сваливаются. GC продолжит сопротивляться, будет гонять объекты по адресному пространству, что влечет за собой жосцкий своп. Все что сможет GC, теоретически, ужать хипы так, что бы окно было одно единственное и после этого кинет OOM.
Re[25]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 17.10.13 19:04
Оценка: -2
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Это очень важный факт, который меняет в корне всю дискуссию.


Нет, это демонстрация того, что ыт полностью не в теме.

EP>Расскажи лучше как в VS2008 выбрать .NET 4.0


http://msdn.microsoft.com/en-us/library/w4atty68.aspx
Re[21]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 19:05
Оценка: -1 :)
Здравствуйте, Erop, Вы писали:

E>А так без кликов, просто в ноутпаде всё видно...


Это и есть колхоз времен коллективизации.

E>Кстати, почему ты считаешь, что доки проще апгрейдить, чем комментарии? Их ещё и размножать потом надо будет с версиями кода, и мёржить...


Не надо ничего размножать — доки находятся в единственном экземпляре на сервере в вики, конфлюэнце или шарепоинте. Надо модифировать фичу — берешь за основу старую версию, копируешь в фолдер новой версии и пишешь туда все что тебе надо.

E>Хорошо, если у тебя какой-то простой тупо-программистский код. А если у тебя какая-то наукоёмкая область или там куча эвристик каких-то в коде есть? Ты всё ещё уверен, что параллельное дереву версий исходников дерево версий подробной документации по всем эвристикам и доказательствам -- это хорошо?


Для наукоемкой особенно актуальна интеграция VCS, трекера и документации, иначе вспотеешь контролировать все вырожденые случаи. для тупо технического проекта вообще никакой документации может не быть, потому что как правило все и так в теме или все есть в гугле.

E>По идее документация нужна что бы разбираться в системе в целом, в архитектурных решениях и т. д. а вот как раз мелкие решения всякие, принятые "по месту" в документации очень редко оказываются адекватно описаны...


Мелкие вещи тоже надо тестировать. Объясни, каким раком тестировщики смогут покрыть твою мульку ручными/автоматическими тестами ?
Re[17]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 17.10.13 19:11
Оценка: -1 :)
Здравствуйте, Erop, Вы писали:

I>>То есть, ты сам для себя в коде напоминалки пишешь ? А кому они нужны кроме тебя ?

E>Ага, а ещё доказательства его работоспособности и т. п.

эм... вообще-то доказательством работоспособности может быть только (юнит)тест
In Zen We Trust
Re[37]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 21:49
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Элементарно — на добавление N элементов надо будет переместить N элментов в АП


EP>Подробнее.


Все предельно просто — случай когда количество всех объектов сильно зависит от этого N, например, добавляем тупо новые объекты, длина списка так же зависит от N.
Соответсвенно при наличии фрагментации нужно будет бегать по всему графу объектов, так как GC заранее не знает, что ему делать. Это уже само по себе N * log(N) если считать только сами объекты без ссылок на них, т.к. количество аллокаций только для списка это log(N). Перемещать нужно будет так же количество элментов, которое зависит от N, хоть и слабее и это будет или N или log(N). + если в дело вступит своп, то это бедствие. Выглядит на UI примерно так — приложение морозит полчаса и потом работает какое то время нормально, а иногда и дохнет от ООМ.


EP>>>2. Миллионный List из Point3D — это тоже ужас-ужас в квадрате?

I>>Не в курсе что это такое

EP>Структура с тремя double.


Это 50мб данных одним окном. В большом приложении на х32 это уже проблемный размер.
Re[40]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 22:22
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Я чучка погорячился про квадратичность, но сути это не меняет. N*log(N) с подключением свопа мало чем отличается для обсуждаемого размера АП.


EP>Ну ты даже O(N*log(N)) не показал. То о чём ты говоришь это O(N).


O(log(N)) аллокаций массива в списке, для каждой из них надо пробежать граф из O(N) элементов

Сколько это по твоему ?
Re[26]: собеседования, Реверс списка
От: Vzhyk  
Дата: 18.10.13 12:34
Оценка: +1 :)
Здравствуйте, Ikemefula, Вы писали:

E>>Я же говорю, от задачи зависит. Тупой кодинг автоматизирован довольно хорошо, а я не программист же. Я скорее математик

I>Я и говорю что ты не программист, твои каменты это однозначно демонстрируют.
Это великолепно. Такое даже не прокомментируешь.
Re[31]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 13:07
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Проблема действительно не в List, и чтение документации List'а тут ничем бы не помогло. Так как дефект был в аллокаторе.

I>>Это не дефект, а свойство аллокатора. Если это называть дефектом, то любая особенность станет дефектом
EP>Ну да, и кубическая сортировка — тоже не дефект?

...а в киеве дядька.

I>>Скажем, если вместо ручного копирования взять Array.resize и сделать так, что бы GC выделял память не последовательно, а скажем, примерно так — если блок находится в большом окне, выделить память в противоположном конце окна, то, внезапно, проблема с фрагментацией исчезнет и можно выделить больше чем N/3, что очевидно — четные аллокации будут в начале фрейма, нечетные — в конце. Середина будет оставаться свободной и выделить можно будет больше половины размера доступного АП.


EP>Давай, включайся, уже вообще не интересно


EP>Вот тебе картинка, * — это то, что занято list'ом:

EP>[ | | | | | | | | | | | | | |*|*|*|*|*|*|*|*]
EP>внешняя фрагментация нулевая
EP>Покажи как ты увеличишь capacity вдвое

Ты в какой то частный случай уперся и не хочешь думать.
Предположим, АП 50, размер списка — 32, это больше чем 50/3. Согласно твоей логике, более 16 выделить не получится, если двигать блоки нельзя.
Проверяем, стрелками указана граница АП: > нижняя, < верхняя
Начальный блок в листе это 4, итого

>4 8 16


В последовательной аллокации 16 лежит ровно посередине АП и действительно, АП/3 превзойти не получается.

Теперь выделение так, как я предложил:

>4

8<
>16
<32

Опаньки — 32,внезапно, влезло и это больше АП/3. Дальше уже не фрагментация, а тупо нехватка памяти.
Ровно тот же фокус можно повторить, если GC умеет менять размер блока или, по простому, сразу установив капасити 32.

Итого — все случаи, которые не позволяют выделить память более 16 это тупо, фрагментация и именно это я хотел сказать. Все твои рассуждения, идут лесом, ибо ты не удосуживаешься прочесть, надо по пять раз напоминать одно и то же.
Re[35]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 14:29
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Во-первых, ты это уже спрашивал. Ответ тут
Автор: Evgeny.Panasyuk
Дата: 18.10.13
.

EP>Во-вторых, мы же всё ещё обсуждаем тот пример где нет никакого reserve? Так вот, речь о том, что если аллокация фейлится когда grow_factor*capacity > total_free_memory, то будь хоть у тебя нулевая внешняя фрагментация — тебе бы это не помогло.
EP>Точно такая же ситуация будет и в x64.

Спасибо, капитан, речь то про другое была.

I>>Во вторых — если ты выделяешь треть и она не по середине, то слева или справа будет две трети, то есть, удваивается.

EP>Треть это порог. Перешагнёшь через него — и больше твоя capacity не сможет вырасти в два раза.
I>>Покажи на моём примере, где было АП 50, а то я твои идеи не понимаю
EP>Если мы пришли в любую capacity > 16 — то больше сделать 2x не получится

Спасибо, капитан, речь то про другое была.
Re[36]: собеседования, Реверс списка
От: Erop Россия  
Дата: 18.10.13 19:24
Оценка: +2
Здравствуйте, Ikemefula, Вы писали:

I>Я уже рассказывал, но ты же не читатель.


Это ты не читатель. Я же уже писал тут, что пока что складывается такое впечатление, что С#-разрабы в массе своей не смогли разобраться в причинах проблемы и просто перестали использовать большие вектороподобные коллекции

Пока что ты это только подтверждаешь...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[30]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 20:00
Оценка: -2
Здравствуйте, Ikemefula, Вы писали:

EP>>Ты лучше ответь на вопрос который в самом верху.

I>Ты лучше сформулируй проблему, которую хочешь решить. С вероятностью 99% НС уже дал исчерпывающий ответ.

Поясни как вот это
Автор: Ночной Смотрящий
Дата: 17.10.13
относится к обсуждаемой проблеме и приведённым примерам. И как бы возможность смены рантайма помогла бы всем этим людям в своё время.
Re[31]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 20:09
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Ты лучше ответь на вопрос который в самом верху.

I>>Ты лучше сформулируй проблему, которую хочешь решить. С вероятностью 99% НС уже дал исчерпывающий ответ.

EP>Поясни как вот это
Автор: Ночной Смотрящий
Дата: 17.10.13
относится к обсуждаемой проблеме и приведённым примерам. И как бы возможность смены рантайма помогла бы всем этим людям в своё время.


Объясняю — ты не раз и не два писал "а вон в той вижле GC не так работает"
А потом попросил совета, как сбилдить прожку не под той вижлой, очевидно, для проверки LOH

Не нужно ничего билдить в разных вижлах, правишь манифест, а билди хоть вижлой 2002го года один раз на все случаи жизни.

Всем этим людям смена вижлы не поможет никак — версия вижлы не влияет на ГЦ и рантайм.

Этим людям поможет
1. профайлер
2. /dev/brain
3. Новый GC

Какие еще у тебя вопросы ?
Re[38]: собеседования, Реверс списка
От: Erop Россия  
Дата: 19.10.13 02:23
Оценка: +1 :)
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Офигеть. А можно логическую цепочку, которая привела тебя к такому выводу?

Так никто так и не назвал ЧТО ОН ИСПОЛЬЗОВАЛ в качестве такой коллекции...

Вот ты, например, что использовал?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[41]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.10.13 17:25
Оценка: :))
Здравствуйте, Erop, Вы писали:

I>>А зачем комуто говорить, если я сам перечислил ?


E>Имя, сестра, имя!!!


Тренируйся в чтении форума, последние две-три страницы посмотри и найдешь, если тебе это надо.
Re[40]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 05:43
Оценка: +2
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Ты на вопрос можешь ответить?

Я же ответил.
Был задан прямой вопрос, что делали, если таки нужны были боьлшие непрерывные куски памяти, например в алгоритме требовались большие списки с доступом по индексу?

В ответ на этот простой вопрос было написано много всякого разного, что коротко можно передать так, что так делать вообще-то лучше не надо, но если уж приходится, то проблему решали каждый раз по месту и творчески.
Из чего я и делаю вывод, что никакого внятного общепринятого масштабируемого решения, не выработали...

Кстати, что бы опровергнуть этот ой вывод, вполне достаточно таки выкатить это внятное, общепринятое масштабируемое решение...

E>>Вот ты, например, что использовал?..

НС>Для чего?

Всё для того же. В алгоритме нужен большой вектор с доступом по индексу, но GC на таком листе дохнет из-за неудачной политики работы своего аллокатора больших объектов. Что в таком случае дылал лично ты, например? Или общего рецепта нет и каждый раз надо смотреть по месту?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[41]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 21.10.13 13:19
Оценка: +1 :)
Здравствуйте, Erop, Вы писали:

E>Был задан прямой вопрос, что делали, если таки нужны были боьлшие непрерывные куски памяти, например в алгоритме требовались большие списки с доступом по индексу?


Кому? Икемефуле? А почему тогда ты сделал вывод о "С#-разрабов в массе своей"? Я пока логики у тебя не улавливаю.

E>Кстати, что бы опровергнуть этот ой вывод, вполне достаточно таки выкатить это внятное, общепринятое масштабируемое решение...


Решение чего? Сферической задачи в вакууме?

E>>>Вот ты, например, что использовал?..

НС>>Для чего?
E>Всё для того же.

Для чего того же? Для разворота списка?

E> В алгоритме нужен большой вектор с доступом по индексу, но GC на таком листе дохнет из-за неудачной политики работы своего аллокатора больших объектов. Что в таком случае дылал лично ты, например?


Если обязательно с доступом по индексу, то ChunkedList. В какой то мере его можно воспринимать как упрощенную вариацию деки на чанках. Но обычно доступа по индексу и не нужно.

E> Или общего рецепта нет и каждый раз надо смотреть по месту?


Разумеется, абсолютно универсального рецепта нет.
Re[43]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 16:01
Оценка: :))
Здравствуйте, Erop, Вы писали:

НС>>Но обычно доступа по индексу и не нужно.

E>Это можно интерпретировать так, что обычно алгоритмы, где таки нужно, программируют на более иных языках?..

Где таки нужно — нужно рассматривать конкретные случаи под профайлером. Если профайлер покажет, что узкое место это обращение по случайному индексу, и средствами дотнете не удастся обеспечить должное быстродействие, то будет использован С а может и С++

НС>>Разумеется, абсолютно универсального рецепта нет.

E>Ну вот я про то же самое, как бы...

Это ты забираешь слова про VirtualAlloc ?
Re[45]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 17:53
Оценка: +1 -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Это может сказать только профайлер.


EP>Слушай, тут уже обсудили сложность вставки N элементов в std::vector-like без reserve, и ты уже проделал нелёгкий путь O(2^N) -> O(N^2) -> O(N*log(N)) -> O(N):



спокойно. к чему глумиться-то? Есть люди, которые могут оценить сложность алгоритма без профайлера, а есть, таки и такие, которые не могут.
Ну бывает жеж. Ну не всем же программистам обязательно иметь хоть какие-то знания по математике и информатике?
Некоторым не до того. Они повышают свою эффективность и изучают для этого ИНСТРУМЕНТЫ, которые РАЗГРУЖАЮТ голову, а не всякую математическу придурь (AKA колхоз), которая наоборот, голову ЗАГРУЖАЕТ.
Тоже подход, между прочим, и вовсе не всегда неправильный, кстати...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[49]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 19:30
Оценка: -1 :)
Здравствуйте, Erop, Вы писали:

E>А как ты думаешь, тормоза из-за неадекватного выбора коллекции, возникли 0 лет назад, и только в 2012 тебе их удалось заметить профайлером, или сначала их не было?


Я уже ответил на этот вопрос. 0 лет назад это сильно.

Тормоза они не с потолка берутся. Если время работы устраивает, то совершенно без разницы, насклько медленнее работа с коллекцией относительно идеального во всех отношениях варианта.

E>А то может у вас там всё так же неадекватно было запрограммировано, и вы потом профайлером 10 лет выпрямляли изначально кривую архитектуру?..


А может у тебя в ДНК чтото особенное ?
Re[45]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 19:49
Оценка: :))
Здравствуйте, Erop, Вы писали:

E>Понимаешь, некоторые люди тут, ещё на этапе проектирования и выбора алгоритмов и структур данных понимают временную сложность получающихся алгоритмов...

E>А некоторые по 10 лет с профайлером ловят эти элементарные в общем-то ошибки дизайна... Ну у всех свой хлеб и свой подход.
E>Самое же удивительное в этих "первых" и "вторых", что, судя по моему опыту, первым никогда не влом разбраться и поучится, зато вторые всегда всё знают, и всем объясняют, что попытки использовать голову вместо автоматических инструментов -- это колхоз...

Я тебе страшное скажу — на продуктах, где я работал, ключевые алгоритмы и структуры данных определялись не программистами, а математиками. Да и программисты в основном были с математическим образованием.
Скажем, про оптимизации которые я говорил, все просто — 4 человека в команде, из них два с математическим образованием, специалируются на теории вероятностей, алгоритмах и структурах данных. Собтсвенно идея структуры данных была не моя и я этого не скрываю.
И это, кстати говоря, не отменяет необходимость профайлера — никто в своем уме не проектирует структуры данных под вырост на любой размер данных.

Вобщем твои понты прошли мимо кассы.

E>В плюсах под win32 аллокаторы никогда такими убогими не были...


Были даже еще более убогими 10 лет назад С++ за С++ не считался, если с теперешним сравить.
Re[52]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 20:13
Оценка: +2
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>А мой опыт оптимизации реального кода говорит, что 90% устраняемых при этом проблем вовсе не из-за неправильно выбранных структур данных.


Дык, по идее, это же и означает, что в 90% случаев программистам удаётся таки как-то выбрать адекватные структуры данных ещё на этапе проектирования, а не исходя из показаний профайлра...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: собеседования, Реверс списка
От: Erop Россия  
Дата: 14.10.13 20:01
Оценка: 3 (1)
Здравствуйте, Marty, Вы писали:

M>Я признаться, тоже не понял, как VirtualAlloc поможет. Тут скорее нужен свой аллокатор с использованием memory mapped files.


Я же уже писал.
Есть два эффекта.
1) Когда куче не хватает памяти, она кусает по VA ещё сегмент, в котором проолжает нарезать блоки, потом ещё сегмент, ещё сегмент и т. д. Трудность в том, что эти сегменты трудно освобождать, так как надо понять, что там нет занятых блоков...

2) В программе может быть несколько компонент, пользующихся разными аллокаторами. И тогда все проблемы с сегментами из (1) или ещё какими возводятся в квадрат, и тогда вот и наступает клизма с фрагментацией АП.

Но, если все аллокаторы в программе аллокируют слишком большие куски сразу по VA, то тогда их можно освобождать, вопервых, и они могут переиспользоваться потом из ДРУГИХ аллокаторов, во-вторых...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 15.10.13 15:02
Оценка: 3 (1)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Да нет, тут сложнее. Напишет он или нет, и если напишет , то что именно — этого я не знаю. Но для него код действительно ужасный. Вот если бы я употребил бы template, перегрузил бы какие-то операторы, сделал бы какой-нибудь итератор, прицепил xyz_ptr и zyx_cast и т.д. — тогда его бы устроило. А когда пишется просто и коротко — это ужасно.


нет, совсем не так.

я хочу чтобы из Reverse были вытащены функции типа head, tail, add, и чтобы Reverse была написала в терминах этих операций, а не состояла их непонятных присваиваний

т.е. я хочу чтобы код был читаемым текстом, типа такого:

    void Reverse()
    {
        List reversedList;

        while (ListElement* head = sliceHead())
            reversedList.prepend(head);

        *this = reversedList;
    }

    ListElement* sliceHead();
    void prepend(ListElement*);


или может функциональный вариант (хотя читаемость хвостовой рекурсии — штука спорная)
In Zen We Trust
Re[11]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.13 16:51
Оценка: 2 (1)
Здравствуйте, Pavel Dvorkin, Вы писали:

I>>Две версии — старая, cs.exe, на С++, и новая, cs.exe, на C#. Новая выходит в следующем году.


PD>Из 2013 студии Preview ? То есть она оптимизирует C# сама ?


Примерно так. Оптимизации будут примерно те же, что и раньше:
1 часть в комплайл тайм, cs.exe (компилятор C# -> IL)
2 часть в рантайме джытом

Разница только в том, что cs.exe переписали с C++ на C#
Re[11]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 11.10.13 17:36
Оценка: 2 (1)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Из 2013 студии Preview ?


Даже в 2013 RTM компилятор старый, абсолютно идентичный тому, что в 2012. Если хочешь посмотреть новый — http://www.nuget.org/packages/Roslyn
Re[24]: собеседования, Реверс списка
От: fddima  
Дата: 17.10.13 12:31
Оценка: 2 (1)
Здравствуйте, Sinix, Вы писали:

S>в конце у нас получится нечто вроде

S>
S>...x....x.....x......x.......x........x..........x.. OuchMyMemoryException
S>

S>Как, очень актуальный сценарий?
FYI: Я уверен, ты и так в курсе, но был ещё один момент аллокатора: http://blogs.msdn.com/b/dotnet/archive/2011/10/04/large-object-heap-improvements-in-net-4-5.aspx

In .NET 4.5, we made two improvements to the large object heap. First, we significantly improved the way the runtime manages the free list, thereby making more effective use of fragments. Now the memory allocator will revisit the memory fragments that earlier allocation couldn’t use. Second, when in server GC mode, the runtime balances LOH allocations between each heap. Prior to .NET 4.5, we only balanced the SOH. We’ve observed substantial improvements in some of our LOH allocation benchmarks as a result of both changes.

Т.е. в <4.5 даже если свободные блоки были — аллокатор их более не рассматривал, если он уже был однажды отвергнут. Конечно это сильно упрощенно. И по моему где-то был более подробный пост.
Re[33]: собеседования, Реверс списка
От: Erop Россия  
Дата: 18.10.13 14:52
Оценка: 2 (1)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Поиски распространённого аналога std::deque продолжаются. Ведь что-то должно было вымучиться за 10 лет плохого аллокатора


Судя по тому, что говорят коллеги, складывается такое впечатление, что проблему предпочитали не лечить. а обходить, вообще избегая больших блоков, предпочитая структуры данных собранные из большого количества небольших...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[40]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 10:48
Оценка: 2 (1)
Здравствуйте, Sinix, Вы писали:

S>На практике за 10 лет не встречал ни разу. Как добиться — в курсе, но зачем так делать — ума не приложу

Ну, то есть, на практике этот острый угол просто обходят, в том числе и избегая индексируемых по числу больших коллекций. Я так тебя и понял. Прямого способа пофиксить косяк аллокатора на практике, как я понял, не применяют.


S>

S>шарповый аллокатор тупит на больших блоках
S>...
S>тот дотнетовский аллокатор, который работает сейчас в программах у пользователей -- УГ

Дык тупит и УГ же, если есть большие списки. Мало того, сама MS это признала и в текущей версии рантайма поправила, но у пользователей большинство программ пока что ещё на старом рантайме же?..

Если тебе обидно читать про неудовлетворительную работу аллокатора больших блоков в дотнете, как про УГ, то прошу прощения, не дума, что кто-то так трепетно к нему относится. Я не специально, Термин НРАББ тебя устроит?

S>

S>Евгений сейчас за два дня разобрался в проблеме лучше вас двоих обоих "спецов" по шарпу

Это про этих двух конкретных людей написано. И да, походу таки лучше.

S>

S>У тебя недержание контекста? Есть List. На кривом аллокаторе его использовать трудно — так?
S>...
S>прибежали C#'исты с криками о том, что я даже чуть-чуть не разбираюсь, нужно читать доки, что проблема давно обкостылевается

Это вообще не мои реплики... И я с ними если и согласен по сути, то не особо по форме.
S>Это _я_ пытаюсь найти за и против?
Твоего текста в процитированном нет. Но ты, как адекватный знаток платформы мог бы просто внести ясность по сути вопроса, а не рассказывать, что кто-то там зря разными шарпами компилировал, вместо того, что бы строчку в манифесте менять.
Хотя мне так кажется, что это не ты рассказывал.

В общем и в целом, я не знаю, возможно я что-то обидное нечаянно сказал, но суть всё равно свелась к двум тезиса.
1) АББРН
2) Эту проблему обходили выбирая другие алгоритмы/платформы, а не коллекции.

S>... 3. Использовать постоянный (кратный) размер блоков

Да, грануляция, я про то и говорил с самого начала. Только это хорошо бы, что бы поддерживалось таки в контейнере самом. Как называется аналог листа, но с грануляцией размеров буфера?
Ну и вторая беда, насколько я понял, как работал АББ раньше, даже грануляция ему поможет не так сильно, как могла бы.
S>4. Избегать лишних аллокаций
Это, скорее всего, просто отсрочит взрыв.

S>Эмм, ну а как поступают нативщики, если их не устраивает выхлоп текущей версии компилятора притом что в следующей оно уже исправлено? Переписывают?


Кто как. Проблемы тоже разные бывают, но в целом да, есть группы, корторые фиксят такого рода баги задолго до того, как протормозятся авторы компилятора...
Ну, в некоторые компиляторы, опять же, можно патчи свои предлагать...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[41]: собеседования, Реверс списка
От: Sinix  
Дата: 21.10.13 12:34
Оценка: 2 (1)
Здравствуйте, Erop, Вы писали:

S>>На практике за 10 лет не встречал ни разу. Как добиться — в курсе, но зачем так делать — ума не приложу

E>Ну, то есть, на практике этот острый угол просто обходят, в том числе и избегая индексируемых по числу больших коллекций. Я так тебя и понял. Прямого способа пофиксить косяк аллокатора на практике, как я понял, не применяют.

Неа. Именно что не встречал, т.е. не было необходимости обходить. "Прямые" способы (включая флаг VM hoarding для самых отчаянных) я уже приводил раза три, не меньше. Пока возражения сводятся к "не верю, проблема должна быть"

E>Дык тупит и УГ же, если есть большие списки. Мало того, сама MS это признала и в текущей версии рантайма поправила, но у пользователей большинство программ пока что ещё на старом рантайме же?..

1. Давай наконец пример, только реальный, а не из разряда "подстелил соломки потому что прочитал про фрагментацию".

2. Ок, в четвёртый раз: если написать софт, который
a. работает исключительно под x86
b. всё время аллоцирует короткоживущие массивы всё увеличивающегося размера
c. вперемешку аллоцирует долгоживущие массивы

— то да, благодаря фрагментации можно получить out of memory exception. Если любое из этих условий не соблюдается — исключения не будет. На практике этот сценарий крайне маловероятен, во всяком случае я не встречал упоминаний кроме как в контексте "не делайте так, будет плохо". Как дошли руки — грабли убрали, но это не значит что сценарий выше стал "хорошим" — мы по-прежнему засоряем АП и нагружаем GC.

E>Это вообще не мои реплики... И я с ними если и согласен по сути, то не особо по форме.

В курсе Имел в виду общую атмосферу в ветке, благодаря ей "Ты всё время тут пытаешься найти какие-то за и против шарпа" смотрится особенно шикарно Надо было уточнить сразу, согласен


E>Твоего текста в процитированном нет. Но ты, как адекватный знаток платформы мог бы просто внести ясность по сути вопроса, а не рассказывать, что кто-то там зря разными шарпами компилировал, вместо того, что бы строчку в манифесте менять.

Эмм? Я про "строчку в манифесте" точно не писал, вы там запутались уже


S>>... 3. Использовать постоянный (кратный) размер блоков

E>Да, грануляция, я про то и говорил с самого начала. Только это хорошо бы, что бы поддерживалось таки в контейнере самом. Как называется аналог листа, но с грануляцией размеров буфера?
Обычно зовётся paged list или chunked list. Из готовых есть BigList в PowerCollections, в своё время писал аналог, но не из-за LOH — нужны были эффективные immutable-списки. Может есть ещё что-то, но вспомнить не могу.

E>Ну и вторая беда, насколько я понял, как работал АББ раньше, даже грануляция ему поможет не так сильно, как могла бы.

Угу, частично фрагментация АП оставалась.

S>>4. Избегать лишних аллокаций

E>Это, скорее всего, просто отсрочит взрыв.
Неа. В единственном критичном примере именно куча мусора с всё увеличивающимся размером и вызывает фрагментацию LOH.
Re[24]: собеседования, Реверс списка
От: Erop Россия  
Дата: 18.10.13 07:12
Оценка: 1 (1)
Здравствуйте, Ikemefula, Вы писали:

I>А если требования в коде, то их смержить код сохранив корректные каменты это задача практически нереальная,

Ну кому нереальная, а кто-то что-то умеет, кроме как в два клика окошки открывать.
Это же дело-то известное, если руки кривые, то многое меняется


I>ибо надо заранее планировать каменты так что бы они не мешали мержу.

Ну так комментарии -- это же тоже часть кода. Вообще структуру всего кода надо заранее планировать и менять осознанно...

I>А то будет вот так — кто-то перенес функцию в отдельный файл, а при мерже получится так что структура каментов отличается от структуры нового кода.

Ну, скорее всего, этот "кто-то" будет неправ. Но так же он будет неправ, например, если название функции перестанет соответствовать её семантике.
И чем тут одно лучше другого я

I>Да, я в курсе. У меня есть один знакомый, который очень любит ручную работу. Он на почасовой оплате, смержит руками мегабайт кода за неделю, ему эту недели и оплатят.


мне за мёрж кода вообще не платят,..
Мне платят за лучшие в мире ТТХ моего изделия...

I>Ты похоже вообще в ИТ не работаешь. Документация даже мелких изменений должна быть вне кода, ибо не ты один работаешь с кодом. Тестеры, менеджеры, аналитики будут вынуждены пахать твой код, что бы разобраться ,что же ты там научитывал.


Ну разные бывают IT...
Вот у нас, например, есть обычно какие-т такие весьма внешние проявления фич и баг, а есть внутренние их причины и реализации и одно на другое очень небанально отображается, и тестеры с аналитеками просто не компетентны часто, что бы понять суть изменений...
Кроме того, ты всё время о правках думаешь, а бывает ещё и другой сценарий, когда какие-то варианты рассматривались при проектировании или разработке, и сразу был выбран какой-то один, но он не из одного варианта был выбран, а из нескольких на первый взгляд подходящих, и выбран был осознанно, и обоснованно. И если в коде будет указано, что был такой выбор и его обоснование было таким-то, это сильно сэкономит сиы тем, кто будет потом править если что.
Да, кстати у нас не принято делать необычный выбор необоснованно. Так что либо код должен быть стандартный, либо должно быть обоснование...

Кстати, вот, например, одна из технологий, которую я сейчас поддерживаю, имеет пять актуальных мажорных версий и около 100 минорных. То есть в дереве бранчей в системе контроля версий порядка 100 живых листов, где каждый лист -- отдельная моификация полного комплекта исходников. К этой штуке прилагается самомисная и самоподдерживаемая документация верхнего уровня. Которая имеется в пяти версиях по пяти мажорным версиям кода и куча документации более мелкого уровня, которая лежит в системе контроля версий и имеет те же версии, что и код, и вообще довольно сильно с кодом ассоциирована. Если ты разветвляешь какую-то часть кода, то автоматом разветвляешь и соответствующую документацию. И самая низкоуровневая документация живёт просто в коментах и других исходниках. У нас применяется не тока С++, но и ещё несколько самописных языков, где с комментами немного иная история

Соответственно, чисто по опыту,
1) Популярные у аналитиков инструменты используют форматы документов крайне недружественные автоматическому мёржу.
2) Большинство аналитиков умет писать и поддеривать срукуру документации дружественной к мёржу намного хуже большинства программистов.

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

I>Та же самая, только в твоем случае надо будет не только код с требованиями синхронизировать, а еще и код-каменты со спекой.


Спека -- это истрия из мира аутсорса. Типа сппека есть и я её реализую. А если спека такая, что наша новая версия должна уверенно сбивать новую версию амеркого файтера, а дальше крутись как хочешь, то расклады слегка другие...

Всё зависит от целей. Если твоя цель формально реализовать спеку, то история одна, а если цель попасть в какие-то ТТХ, то совсем-совсем другая...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 17:57
Оценка: +1
Здравствуйте, Abyx, Вы писали:

I>>P.S. Крикунам из лагеря С++ — для многих плюсовых контейнеров, которые ресайзят внутренний массив как это показано выше, п..ц наступит гораздо быстрее, практически мгновенно.

A>C++ лагерь говорит что в С++ у списков нет внутреннего массива

Аналог этого списка это vector или чтото навроде. В любом случае, есть контейнеры на таких массивах и выделяют память так как я показал.
Re[2]: собеседования, Реверс списка
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 09.10.13 18:29
Оценка: +1
Здравствуйте, Abyx, Вы писали:

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


I>>P.S. Крикунам из лагеря С++ — для многих плюсовых контейнеров, которые ресайзят внутренний массив как это показано выше, п..ц наступит гораздо быстрее, практически мгновенно.

A>C++ лагерь говорит что в С++ у списков нет внутреннего массива
vector<T> таки имеет внутренний массив, да еще и коэффициент увеличения 1.5, что приводит к более частым выделениям\освобождениям памяти.
Re[2]: собеседования, Реверс списка
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 09.10.13 18:40
Оценка: -1
Здравствуйте, Erop, Вы писали:

E>2) Неужели этому вашему листу с решёточкой нельзя намекнуть скока памяти брать сразу?

Конечно можно, прямо в конструкторе или выделить скоканадо потом.

I>>Память то будет освобождаться, но GC будет жрать все новую и новую память, ибо старый блок дохнет после того, как будет инициализирован новый.

I>>Более того, память будет фрагменироваться не только массивами, но и хипами
E>Я всегда подозревал, что GC -- это от слова "экскрименты", но не подозревал, что настолько.
E>Всё-таки я надеюсь, что эту "мегапроблему" как-то да решили, листов-то в шарпе просто тонны же заводят?..

I>>То есть, фокус в том, что эта стратегия выделения очень неудобная для GC.

E>Ну, что ещё раз говорит нам о том, что базовая стркутура данных несовсемтима с встроенным же в язык GC, и это типа хоршо? Я думаю, что те самые "оптимизации" таки работают
На самом деле они очень хорошо оттюнингованы под GC .NET и могут хранить миллионы элементов.
Но это не значит что вставка в цикле в список без выделения размера — хорошая идея.

Аналогично и для других структур данных есть антипаттерны использования, но и в них .NET показывает себя не хуже запидарасенных контейнеров STL.
Re[2]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 18:58
Оценка: :)
Здравствуйте, gandjustas, Вы писали:

I>>То есть, фокус в том, что эта стратегия выделения очень неудобная для GC.

I>>Итого — суммарно выделится памяти примерно (с*(1-q^n))/(1-q), где q = 2, с примерно 11 или близко к этому.
I>>Столько же памяти и освободится, но из за фрагментации АП это как мертвому припарки — на больших списках это будет фейл, хотя свободной памяти будет хоть в 10 раз больше.

G>Вроде все правильно написал, но вот с деталями накосячил. А дьявол, как известно, именно в них.


ля-ля-ля

G>Начальный размер List<T> — 16 или 32 (надо уточнить, давно не смотрел сборки).


4, просто 11 круглее И вообще — 11 это в троичной системе будет 4. Короче — не знаю, откуда взял это значение.

G>Далее LOH — он вроде как кусками по 16мб выделяется. И собирается только при Gen2. Соответственно если выделяется новый кусок, то запускается Gen2 GC. Он идет в фоне и в общем случае не влияет на скорость работы.

G>Чтобы список разросся до 16мб надо еще 10-11 увеличений размеров буфера.
G>То есть 1,000,000 (миллион) элементов и максимум один Gen2 GC.

G>Фактически одиночный разворот списка до миллиона элементов таким некрасивым образом не даст значительной нагрузки на GC.


Фактически получается так, что

1 В реальном приложении память уже юзается кем то и АП всегда хоть немного но фрагментировано, включая LOH
2 паттерн ниже встречается слишком часто, при чем список часто состоит в т.ч. из структур и размеры >миллиона
var list = new List<Item>();
while (condition())
{
  list.Add(current());
}

3 в дженерик лист кладутся не только ссылки, а еще и структуры, я откопал похожий паттерн при добавлении 10млн гуидов
4 рассчитывать на память в LOH или забывать про неё крайне глупо
Re[3]: собеседования, Реверс списка
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 09.10.13 19:12
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:


G>>Начальный размер List<T> — 16 или 32 (надо уточнить, давно не смотрел сборки).


I>4, просто 11 круглее И вообще — 11 это в троичной системе будет 4. Короче — не знаю, откуда взял это значение.

Даже если начальный размер 4, то это не сильно влияют на все остальное. В этом и суть нелинейного увеличения, при увеличении N затраты на добавление в конец стремятся к о(1) пока не упремся в память.

G>>Далее LOH — он вроде как кусками по 16мб выделяется. И собирается только при Gen2. Соответственно если выделяется новый кусок, то запускается Gen2 GC. Он идет в фоне и в общем случае не влияет на скорость работы.

G>>Чтобы список разросся до 16мб надо еще 10-11 увеличений размеров буфера.
G>>То есть 1,000,000 (миллион) элементов и максимум один Gen2 GC.

G>>Фактически одиночный разворот списка до миллиона элементов таким некрасивым образом не даст значительной нагрузки на GC.


I>Фактически получается так, что


I>1 В реальном приложении память уже юзается кем то и АП всегда хоть немного но фрагментировано, включая LOH

Да, но все равно будет максимум 1 Gen0 и 1 Gen2.

I>2 паттерн ниже встречается слишком часто, при чем список часто состоит в т.ч. из структур и размеры >миллиона

I>
I>var list = new List<Item>();
I>while (condition())
I>{
I>  list.Add(current());
I>}
I>

I>3 в дженерик лист кладутся не только ссылки, а еще и структуры, я откопал похожий паттерн при добавлении 10млн гуидов
I>4 рассчитывать на память в LOH или забывать про неё крайне глупо
Это все нерелевантно, так как обсуждение идет разворота списка.

Я же писал про бесполезность "разворота списка" как задачи, проверяющей знание чего-либо.
Re[4]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 19:21
Оценка: :)
Здравствуйте, Erop, Вы писали:

I>>Никак. В С++ при подобной технике увеличения ровно те же проблемы, только быстрее.

E>ну, то есть ты хочешь сказать, что std::vector в С++ прогаммах не испольуется, так как если используется, то жрёт память гигами?

Тебе стоит перечитать более внимательно — я говорю про адрессное пространство, а тебе мерещится память. Памяти в каждый момент будет выделен небольшой кусочек, а вот адресное пространство может истощиться, при том, что свободной памяти суммарно будет больше чем нужно.

I>>Не лист, а добавление большого количества элементов последовательно без указания стартового размера, как это было сделано в примере.


E>Э-э-э-э-э, разве это не основной сценарий?..


Частый, но не основной. Основной все таки когда количетсво элементов пару тысяч, ну десятков тысяч.

I>>Ну ты доказывал, что решение отличное, а нагрузку O(2^N) просчитать не смог. Ты математику забыл что ли ?


E>Про нагрузку O(2^N) ты ошибаешься. Всего будет примерно log2 (N / 11) аллокаций, общим объёмом примерно в 2N максимум...


В данном сценарии основную нагрузку дает суммарный объем аллокаций — O(2^N), если списки достаточно длинные, и это не синтетическое приложение, то OOM гарантирован даже если свободной памяти с 10-кратным запасом.

Нагрузка в кратце проявится вот так — GC будет переразмещать при каждой аллокации все больше и больше объектов, что включает в себя обновление ссылок на каждый перемещенный объект..
Re[6]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 19:41
Оценка: :)
Здравствуйте, Erop, Вы писали:

I>>В данном сценарии основную нагрузку дает суммарный объем аллокаций — O(2^N),


E>Не мог бы ты пояснить, откуда такая оценка?


Я все уже показал.

E>Я вернопонимаю, то уже для списка в 400 элемнтов, например, сумарный объём аллокаций привысит 10^100, то есть гугол?..


n это было количетсво аллокаций, а не размер списка.
Re[8]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 19:43
Оценка: :)
Здравствуйте, Erop, Вы писали:

I>>В который раз говорю — не затраты на переаллокации, а скорость потребления адресного пространства.


E>Оценки какие-то будут?..


2 в степени (количество аллокаций)
Re[12]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 09.10.13 20:57
Оценка: :)
Здравствуйте, Erop, Вы писали:

НС>>А чего тут оценять? Взял профайлер да померял

E>Ну я та подозреваю, что на список уйдёт меньше, чем на строчки...

Вот ты тоже невнимательно читаешь. Ikemefula говорит не про расход памяти как таковой, а про фрагментацию VA-спейса в 32-хбитном процессе. CLR компактифицирует только поколения, LOH у него управляется как в обычном менеджере памяти. Штатный менеджер памяти плюсовых рантаймов обычно вообще компактификацией не занимается никогда, так что эта проблема не исключительная фича CLR. Таким образом, рано или поздно при очередной переаллокации списка тебе просто не удастся найти непрерывный кусок спейса нужного размера, а на стандартных 2 гб по нынешним временам это не такая уж и уникальная ситуация. Если же мы, к примеру, плагин к студии пишем, то на более менее крупных солюшенах 2гб превращаются в 400-600 мег.
Но это, конечно, очень далеко за пределами собеседований. Искать человека, который с этим уже сталкивался — задача на годы .
Re[3]: собеседования, Реверс списка
От: landerhigh Пират  
Дата: 10.10.13 05:23
Оценка: :)
Здравствуйте, Ikemefula, Вы писали:


I>Аналог этого списка это vector или чтото навроде.


Что? Более того, кому в здравом уме и твердой памяти может понадобиться реверсить вектор?
www.blinnov.com
Re[14]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 12:30
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Ну не надо массивы больше 100 метров хреначить просто и всё. Они на это не рассчитаны просто. Но это довольно-таки специфическая проблема, вообще-то...


Специфическая, но на больших приложениях довольно часто дает проблемы, ибо там с фрагментацией по естественным причинам очень плохо. И фокус такой, что свалится GC необязательно на этом цикле. Т.е. пока найдешь и отловишь — семь раз поседеешь, если раньше не сталкивался.
Re[24]: собеседования, Реверс списка
От: Vzhyk  
Дата: 10.10.13 17:18
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Да.

E>Вторая тонкость -- грануляция. Так что куски легко переиспользуются.
Не надоело еще? NET — это уровень сильно выше, чтобы разбираться в том, как работают менеджеры памяти, это же не С и не С++, где без оного знания никуда. Ну вычитал он где-то немного странную сказку и теперь всем ее травит.
Re[25]: собеседования, Реверс списка
От: Vzhyk  
Дата: 10.10.13 18:31
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Вопрос — как имеено тебе поможет VirtualAlloc в этом сценарии ?

Почитай про то как работают менеджеры памяти, начни хотя бы с того же Рихтера или википедии.
Re[25]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 20:55
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Вопрос — как имеено тебе поможет VirtualAlloc в этом сценарии ?


В этом никак. Но этот сценарий не имеет ничего общего с политикой аллокаций листа, ровно как и вообще с реальностью. Да, реальные кучи на реальных сценариях фрагментируются до некоторой степени, но современные кучи обычно фрагментируются до степени фрагментации меньше двух... И ты, на минуточку, в своём фантастическом сценарии, тем не менее съел половину памяти и не отдал
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[26]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.13 04:21
Оценка: :)
Здравствуйте, Erop, Вы писали:

I>>Вопрос — как имеено тебе поможет VirtualAlloc в этом сценарии ?


E>В этом никак.


Правильно, и в любом другом тоже. Помогает не функция VirtualAlloc, а дефрагментация или руками писаные аллокаторы, ре-аллокаторы.

>Но этот сценарий не имеет ничего общего с политикой аллокаций листа, ровно как и вообще с реальностью.


Это потому, что ты не понимаешь разницу между адресным пространством и памятью.

>Да, реальные кучи на реальных сценариях фрагментируются до некоторой степени, но современные кучи обычно фрагментируются до степени фрагментации меньше двух...


Ну, допустим. Другой сценарий — выделяем 900мб, потом 200, потом 900. Итого — занято 2гб. Удаляем большие блоки по 900, свободной — 1800.
Выделяем 1гиг.

Итого — на этот раз степень фрагментации копеечная. Как здесь поможет VirtualAlloc ?




>И ты, на минуточку, в своём фантастическом сценарии, тем не менее съел половину памяти и не отдал
Re[27]: собеседования, Реверс списка
От: Erop Россия  
Дата: 11.10.13 07:35
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Правильно, и в любом другом тоже. Помогает не функция VirtualAlloc, а дефрагментация или руками писаные аллокаторы, ре-аллокаторы.


Нет, помогает то, что в конце-концов все аллокации где-то внутри сводятся к распределению выделенной по VA порции памяти. Таку порцию потом трудно отдать. Вот и весят эти сегменты алолокаторов, повышают фрагментацию АП. Если же большие аллокации делать сразу на VA, то когда ты эти блоки освободишь, АП дефрагментируется...

Но это одна сторона медали, вторая -- правильные политики аллокации, которые обеспечивают переиспользование блоков и снижение фрагментации. Конкретно для плюсовго вектора/вашего листа — такой политикой является грануляция. Если выделять куски памяти не случайного размера, а всегда выбирать какой-то и жёстко заданой линейки размеров гранул, то такие блоки будут чаще переиспользоваться и реже резаться на ошмётки...

В целом правда, почитай как аллокаторы работают, там много интересных идей, но для GC, как я понял из этого обсуждения, многие из этих идей неприменимы, так что реально большие коллекции надо хранить в листе листов, например, или в списке на ссылках или ещё как-то так, а не в буфере большого размера, потому, что GC с такой задачей справляется плохо и фрагментирует и свою память и АП процесса...

I>Это потому, что ты не понимаешь разницу между адресным пространством и памятью.

Это ты себе придумал. Я даже понимаю разницу между физическим и логичемким АП, а не только между памятью и АП

I>Ну, допустим. Другой сценарий — выделяем 900мб, потом 200, потом 900. Итого — занято 2гб. Удаляем большие блоки по 900, свободной — 1800.

I>Выделяем 1гиг.

Ты опять хочешь занять от половины свободной памяти...

В целом такие большие куски априори недоступны. Даже если вообще ничего не аллокировать, туда что-то может загрузиться, какая-нибудь dll-ка или хук, например, так что рассчитывать, что ты получишь половину АП одним куском наивно...

В нагруженной ситуации лучше не рассчитывать получить больше сотни метров, в ненагруженной и под виндой можно поднять аппетиты метров до 300-400, дальше уже ненадёжно очень будет.

Но, если у тебя алолокаторы нормально работают, то потом деградация дальше не идёт. То есть 100 метров, при достаточной свободной памяти, ты получишь всегда. Если, конечно, ты забил всю доступную память, ну типа уже аллокировал хаотически половину адресов в доступно АП, то не обязательно. Но это совсем уже на грани конца памяти работа, этого сценария лучше избегать, если нужна надёжная работа

I>Итого — на этот раз степень фрагментации копеечная. Как здесь поможет VirtualAlloc ?





>>И ты, на минуточку, в своём фантастическом сценарии, тем не менее съел половину памяти и не отдал
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 11.10.13 17:36
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Две версии — старая, cs.exe, на С++, и новая, cs.exe, на C#.


csc.exe

I> Новая выходит в следующем году.


Ой не факт. Ну то есть 2014 студия скорее всего будет в следующем году, но вот будет ли там Розлин — я бы пока особо не рассчитывал.
Re[30]: собеседования, Реверс списка
От: koodeer  
Дата: 12.10.13 15:25
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Зато ты не понял, почему работают нормальные программы под виндой и не падают по ООМ из-за фрагментации АП


Ещё как падают. Многие программы на 32-битной Винде падают именно из-за фрагментации АП, хотя свободной памяти достаточно. Из известных таких программ могу назвать браузеры Chrome и Firefox.
Re[15]: собеседования, Реверс списка
От: vdimas Россия  
Дата: 14.10.13 07:07
Оценка: +1
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Не важно сколько их влезет в память. Даже один крупный пересоздаваемый список способен со временем фрагментировать весь доступный спейс.


Не факт. Периодически или же при невозможности найти подходящий непрерывный кусок памяти менеджер хипа занимается поиском и склейкой прилегающих пустых областей. При этом сами страницы упорядочиваются в иерархии по размерам по основанию двойки, т.е. склейка довольна дешева, две склеенные страницы образуют новую.

В общем, если будешь добавлять по 1-му символу в сишный вектор, то ничего военного не произойдет. Никакой дефрагментации. Освобождаемые предыдущие блоки памяти будут представлять собой непрерывный кусок незанятого места.
Re[9]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 14:32
Оценка: +1
Здравствуйте, Marty, Вы писали:

E>>Оценки какие-то будут?..

E>>ну, например, как ты думаешь, если вот тупо взять и написать на плюсах std::vector<char> и начать в него добавлять по одному, миллион символов добавить удостся?..
M>А ты этим что хотел доказать?
M>millioncharsvector.cpp
M>
M>        const int maxI = 1024*1024*1024;
M>

M>Результат
M>
M>...
M>i = 689594368
M>i = 689595392
M>Error: bad allocation
M>

http://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D0%BB%D0%BB%D0%B8%D0%BE%D0%BD
Re[11]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 15:03
Оценка: +1
Здравствуйте, Marty, Вы писали:

EP>>http://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D0%BB%D0%BB%D0%B8%D0%BE%D0%BD

M>А ты что хотел сказать? Что у меня больше миллиона? Так я знаю, просто миллион отработал, я решил посмотреть, когда упадет, а файл переименовывать уже лень было.

Давай по порядку. Что ты хотел своим тестом показать? И что по твоему он показал?
И сразу, чтобы два раза не писать — покажи свой результат для std::deque.

E>>>ну, например, как ты думаешь, если вот тупо взять и написать на плюсах std::vector<char> и начать в него добавлять по одному, миллион символов добавить удостся?..
M>>А ты этим что хотел доказать?
M>>millioncharsvector.cpp

Re[17]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 16:35
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

V>>В общем, если будешь добавлять по 1-му символу в сишный вектор, то ничего военного не произойдет. В общем, если будешь добавлять по 1-му символу в сишный вектор, то ничего военного не произойдет. Никакой дефрагментации. Освобождаемые предыдущие блоки памяти будут представлять собой непрерывный кусок незанятого места.

I>Тест в этом же треде с тобой не согласен — все дохнет как и должно быть Ты уже манагер, что ли ?

Если ты утверждаешь что это фрагментация, то попробуй сделать (или попроси Marty) тот же тест но добавив и v.reserve(1000*1000*680); в начало.
Re[18]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 14.10.13 17:17
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Если ты утверждаешь что это фрагментация, то попробуй сделать (или попроси Marty) тот же тест но добавив и v.reserve(1000*1000*680); в начало.


Конечно фрагментация, т.к. требуемый размер всей свободной памяти больше чем запрашиваемый.
Re[18]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 20:42
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>>> Вышенаписанное вообщем-то подтверждает точку зрения Ikemefula, что некоторые менеджеры памяти для C++ не совсем совершенны.

EP>>В твоём примере как раз видно, что если и есть фрагментация, то мизерная. Теоретический потолок — 2GiB/2.5, причём это без dll'ек, без стэка и т.п.
EP>>Посмотри, например, по каким адресам у тебя dll'ки загрузились, куда .exe, где стэк находится и т.п
M>Мизер не мизер, но память делит как минимум на две половины, из которых целое не склеить.

Это не фрагментация.
Фрагметация — это пример который приводил Ikemefula раньше — там где посредине АП есть что-то небольшое, что мешает выделить большой кусок.
Тут же просто нехватка памяти. Если бы те ~50 аллокаций что были у тебя действительно фрагментировали бы кучу — то аллокация сфейлилась бы гораздо раньше.

M>Стек — да, он скорее всего однозначно в АП пользовательских данных процесса. По поводу dll-ек — утверждать ничего не буду, но они разве не в другие 2Гб АП грузятся? Или те 2Гб только на нужды ядра и user-space dll там не селятся? Тогда да, надо бы пройтись еще по dll-кам процесса, где они лежат и чье место на самом деле занимают.

M>Но мне это делать лень Я свою задачу выполнил — подкинул на вентилятордал повод для дальнейших исследований и поисков истины уж простите, но дискуссия интересная, да и давно я в проф. форуме не обозначался

На MSVC2010SP1x32 (не знаю что там у тебя) самый низкий адрес у msvcp100.dll — 0x664C0000. Верх .exe'шника — 0x00A27000. ESP = 0x0140FBC0.
Разница между msvcp100.dll и ESP ~ 1695MB (мегабайт, не мебибайт). Делим на 2.5: 678 MB — что-то знакомое
Re[10]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 23:56
Оценка: +1
Здравствуйте, Erop, Вы писали:

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


E>>>ну, например, как ты думаешь, если вот тупо взять и написать на плюсах std::vector<char> и начать в него добавлять по одному, миллион символов добавить удостся?..


M>>А ты этим что хотел доказать?


E>Я задал вопрос, я, например, думал и думаю, что метров до 100 можно не парится, потом могут начаться варианты...


А, вот я и добрался до ответа на мой первый ответ в этой теме По пути правда потестил на скорую руку очевидные варианты, ну, просто, чтоб закрыть лишние ветки флейма

А по существу — с мыслью, обозначенной чуть выше без сарказма, я вполне согласен. Мои тесты на скорую руку вроде показывают, что не парится можно примерно до 500мб. Плюс-минус немножко. А если больше, то там и танцев с бубнами будет больше. Когда и как часто надо дергать за Dispose-костыли, апологеты GC нам тут конечно ничего не скажут, это не в их интересах
Маньяк Робокряк колесит по городу
Re[11]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 15.10.13 00:39
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>А по существу — с мыслью, обозначенной чуть выше без сарказма, я вполне согласен. Мои тесты на скорую руку вроде показывают, что не парится можно примерно до 500мб


Это покуда у тебя тесты. А как реальное приложение с кучей разных активностей, да если оно еще и многопоточное, то печаль начинается от объемов на порядок ниже.
Re[16]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 15.10.13 00:48
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>3. показать лёгкость замены вектора на деку (которой afaik нет в стандартном .net'е)


Есть. LinkedList называется.
Re[11]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 02:30
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>А, вот я и добрался до ответа на мой первый ответ в этой теме По пути правда потестил на скорую руку очевидные варианты, ну, просто, чтоб закрыть лишние ветки флейма


M>А по существу — с мыслью, обозначенной чуть выше без сарказма, я вполне согласен. Мои тесты на скорую руку вроде показывают, что не парится можно примерно до 500мб. Плюс-минус немножко.


У тебя в тесте слишком стерильная ситуация. Всего один аллокатор и очень простая прога без сторонних DLL там всяких, привязанных к каким-то адресам загрузки, например, да и вектор тоже всего один и большой блок памяти тоже. В реальности вся эта штука не настолько хорошо работает, но до 100 метров на блок точно можно не парится. До 400, если ситуация не слишком нагруженная, и просто не фрагментировать АП попусту. Дальше ужо тонцы
Меня поразило тут то, что I. считает вектор нереально дорогим по памяти, мне кажется, что он преувеличивает

M>А если больше, то там и танцев с бубнами будет больше. Когда и как часто надо дергать за Dispose-костыли, апологеты GC нам тут конечно ничего не скажут, это не в их интересах


Ну это ещё и надо узнать же перед тем, как сказать
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: собеседования, Реверс списка
От: -n1l-  
Дата: 15.10.13 02:33
Оценка: -1
Лол, сейчас неосилятор ссылок расскажет нам всем, как нужно писать код.
Re[17]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 08:09
Оценка: +1
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Я так понимаю, примерно 100% вновь присоединившихся чуть выше по нитке даже не читают. Тогда напомню тебе, что речь изначально шла про проблемы именно в дотнете, а про С++ разговор зашел, потому что Ероп начал рассказывать, что в С++ таких проблем нет.


До 100 метров -- нет, выше -- это уже процентов 10 от доступного АП, что как бы намекает нам, что программе надо быть готовой к тому, что все данные в непрерывны кусок не лягут.

Про С++ я рассказывал не потому, что там лучше или хуже, а потому, что про то, как в С++ я знаю. Я не думаю, что в С# как-то катастрофически хуже с этим делом и листом пользоваться нельзя-нельзя. Собственно я подставил под сомнение алармистское сообщение I. именно в том смысле, то не верю, что всё настолько плохо и поинтересовался у экспертов в дотнете как оно есть на самом деле, а не в фантазиях нашего напуганного фрагментацией АП коллеги
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[18]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 08:12
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>Т.е. в дотнете проблемы есть, в плюсах нет?

M> о чем речь шла изначально, факт на лице, как говорят.

Самое паскудное, что никто из знатоков дотнета так и не привёл никаких конкретных цифр.
Типа любой лист сфрагментирует всё АП при достаточно долгой работе. И всё тут.
Я вот конкретный вопрос задал, лист объёмом буфера в метр сфрагментирует или нет? А в 10, а в 100? Нет ответа, хотя по плюсам я дал и оценки и цифры, а ты даже тест выкатил
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[19]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 08:20
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>Мой тест #1 сказал, что можно выделить одномоменто в свежей программе 1900Мб. Ты этот момент пролистал не глядя?

M>Не совсем понял, как одномоментная аллокация памяти поможет опровергнуть гипотезу, что фрагментация мешает?

Дык 1900 / 2.5 = 720 где-то не?..


M>На 64х битах можно в 99.9(9)% задач говорить о бесконечной памяти (вернее, о бесконечном АП), и проблема фрагментации тут не стоит.


Ну вот представь, что у тебя бесконечное АП, а памяти, тем не менее, есть всё те же 1900, скока удастся тут байтиков в вектор запихать?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[19]: собеседования, Реверс списка
От: Sinix  
Дата: 15.10.13 09:06
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Типа любой лист сфрагментирует всё АП при достаточно долгой работе. И всё тут.

E>Я вот конкретный вопрос задал, лист объёмом буфера в метр сфрагментирует или нет? А в 10, а в 100? Нет ответа, хотя по плюсам я дал и оценки и цифры, а ты даже тест выкатил

It depends. При правильно написанном коде фрагментации практически не будет (например, если избегать промежуточных аллокаций, задать capacity или поискать реализацию ChunkedList вместо стандартного List<T>). При неправильном — упадёт и при практически пустом АП. В 4.5 с этим полегче: аллокатор чаще переиспользует пустые фрагменты +(начиная с 4.5.1) добавлена возможность дефрагментацию LOH по требованию.
Re[20]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 09:12
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>It depends. При правильно написанном коде фрагментации практически не будет (например, если избегать промежуточных аллокаций, задать capacity или поискать реализацию ChunkedList вместо стандартного List<T>). При неправильном — упадёт и при практически пустом АП. В 4.5 с этим полегче: аллокатор чаще переиспользует пустые фрагменты +(начиная с 4.5.1) добавлена возможность дефрагментацию LOH по требованию.


И снова никакой конкретики. До скольки метров буфера типичного листа в программе ещё можно не парится о фрагментации АП?

Просто если речь о том, что до 100, как в С++, то я бы тут уже начал парится скорее за то, что бы всё своевременно освободилось, скорее. А если до 10, например, то тут, уже порядок плюсам проигрываем, а если и до 1, то это вообще просто полный фейл листа...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[16]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 11:06
Оценка: :)
Здравствуйте, Erop, Вы писали:

M>>Я признаться, тоже не понял, как VirtualAlloc поможет. Тут скорее нужен свой аллокатор с использованием memory mapped files.


E>Я же уже писал.

E>Есть два эффекта.
E>1) Когда куче не хватает памяти, она кусает по VA ещё сегмент, в котором проолжает нарезать блоки, потом ещё сегмент, ещё сегмент и т. д. Трудность в том, что эти сегменты трудно освобождать, так как надо понять, что там нет занятых блоков...
E>2) В программе может быть несколько компонент, пользующихся разными аллокаторами. И тогда все проблемы с сегментами из (1) или ещё какими возводятся в квадрат, и тогда вот и наступает клизма с фрагментацией АП.
E>Но, если все аллокаторы в программе аллокируют слишком большие куски сразу по VA, то тогда их можно освобождать, вопервых, и они могут переиспользоваться потом из ДРУГИХ аллокаторов, во-вторых...

То есть, VirtualAlloc никак не помогает. Ровно тот же результат можно получить если выделять память сразу одним куском в 2гб и потом нарезать его на хипы для больших и малых объектов.

Все что дает VirtualAlloc это быстродействие.
Re[15]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 13:33
Оценка: :)
Здравствуйте, Erop, Вы писали:

I>>Не нужно ни десятков, ни сотен, часто хватает и 100 тыс и даже менее.


E>Во-о-о-от, началась конкретка. Я верноп онимаю, что 100 тысяч элементов -- это полмегабайта памяти?


Эта конкретика уже в пятый раз приводится.

E>Или речь о элементах по килобайту каждый?..


Читай внимательно.
Re[19]: собеседования, Реверс списка
От: vdimas Россия  
Дата: 15.10.13 15:00
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Про что и речь — сейчас почти любой проект на С++ это в т.ч. написание всевозможных аллокаторов.


Кстате, страничный аллокатор или пул объектов — неплохая тестовая задачка для студента или вчерашнего студента. Как раз ему на час-другой работы.

Попробуй сам да замерь время. При том, что ты давно не брал плюсов в руки, вряд ли у тебя на это уйдет более часа. Т.е. рассуждать даже не о чем.
Re[8]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 15.10.13 18:40
Оценка: +1
Здравствуйте, Abyx, Вы писали:

EP>>Например у тебя же получается лишняя операция
Автор: Abyx
Дата: 11.10.13
, так? slice лишний раз зануляет next.

EP>>Возможно компилятор сможет его убрать после inline'а, или даже если не за-inline'ит то это будет скорей всего не критично, но всё же это реальный объективный недостаток.
A>Да, я видел что slice зануляет next, и написал так потому что считаю что современные компиляторы уберут это лишнее присваивание.
A>Если же производительность списка будет узким местом, и компилятор не сделает такую оптимизацию, можно будет ввести функцию details::slice_fast()

Скорей всего компиляторы уберут лишнее зануление (так как это элементарно, в этой их SSA). Мой поинт в том, что если абстракция приводит к лишним действиям, то это либо плохая абстракция, либо она не до конца проработана.

EP>>Другой реальный объективный момент, который относится ко всем трём примерам (или сколько там было) — в том что операция "reverse целого списка" элементарно превращается в "prepend перевёрнутого куска списка к другому списку".

EP>>Это тоже — реально объективный критерий.
A>да, но про другие структуры данных речь не шла, значит писать более универсальную функцию было бы нарушением YAGNI.

Во-первых это делается элементарно, главное только заметить это. Например в std::copy_n — этого не заметили и сделали плохой интерфейс.
Во-вторых этот buzz-word точно также применим к slice и prepend — задача-то была просто список развернуть.

EP>>Вот, например, один из вариантов Александра Степанова.

EP>>
EP>>
Это тоже по-твоему "ужасный говнокод с мешаниной old_successor, result, first и кучей присваиваний"?


A>нет, это не говнокод.

A>во-первых этот код читается уже значительно лучше, т.к. тут используются функции successor и set_successor.

Мне хоть и нравится как выглядит:
I old_successor = successor(first);
set_successor(first, result);

но по факту, это не так сильно отличается от:
auto next = cur->next;
cur->next = newBegin;

successor(first) — "достаёт next", set_successor — "устанавливает next".

A>возможно рекурсивный вариант кому-то покажется лучше, но ФП vs ИП — это действительно дело субъективное


Только это всё равно тоже самое ИП. Вот если бы set_successor возвращал новый узел.
К тому же не вижу смысла код делать похожим на ФП в тех местах, где он просто органически выражается в ИП. Да и tail-call хоть оптимизируется, но не везде, и не всегда (например может ударить в debug), так как нет гарантии стандарта.
Re[10]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 16.10.13 11:39
Оценка: +1
Здравствуйте, Abyx, Вы писали:

A>это будет нарушением DRY, такой код сложно поддерживать.

A>когда надо будет что-то поменять, придется править больше строчек

А что тут вообще потребуется менять ?
И кстати, тебе не кажется , что заботясь о последующих модификациях (которые то ли будут, то ли нет), ты пока что делаешь менее эффективное (например) решение для данного кода, который реально будет работать ? То есть он будет хуже, чем он мог бы быть, и будет в таком виде работать. Это реально. А вот придется ли его модифицировать — это еще большой вопрос. В плане реверса списка — я, признаться, не очень вижу, что тут придется модифицировать когда бы то ни было.

Ну и безотносительно к списку. А ты уверен, что DRY — это прямо-таки принцип, от которого никогда нельзя отступать ? Ни при каких условиях ?

У меня такое впечатление, что современное программирование сформулировало ряд принципов (DRY в т.ч.), которые вообще-то сами по себе вовсе не плохи, но после этого почему-то возвело их в абсолют, и чуть ли не анафеме готово подвергнуть отступление от них. А они всего лишь некие рекомендации, со своей ценой, которую иногда стоит платить, а иногда и вовсе нет, так как цена слишком дорогой оказывается.

Вот ответь на такой вопрос. В твоем коде есть лишнее действие, как отметили до меня. Предположим, выяснится по результатам профилировки, что оно отнимает существенное время, и это существенно для программы. (Разумееется, я не говорю о твоем занулении next, я вообще). И вот выясняется, что со всеми хорошими принципами вроде DRY, модульности, выделения сущностей ты переписать этот код без этого лишнего действия не можешь Вопрос же такой — останешься при принципах и проиграешь в производительности , или же махнешь рукой на принципы и напишешь без них ?



PD>>Ну и чем это лучше. Ладно, о том, что это может быть менее эффективно (если не заинлайнится) — промолчу. Но и просто по стилю — чем это лучше ? Чем это понятнее ? Мне надо отвлечься от чтения reverse, посмотреть код set_next, понять, что она делает, запомнить, что она делает (ее вызов может еще раз повториться, опять ее смотреть ?), потом вернуться к reverse и продолжить изучение. Хоть убей, не понимаю, чем это лучше простого присваивания полю.


A>в "p->next = cur;" используются четыре сущности — p, ->next, operator=, cur.

A>читается это как "в p, члену класса next, присвоить cur"

A>а в "set_next(p, cur);" используются три сущности — set_next, p, cur.

A>читается это примерно как "p set_next cur".
A>(c "p.set_next(cur)" было бы чуть проще, хотя использование явного или неявного this вобщем-то не важно)

Слушай, ты это серьезно ? Если впрямь серьезно, то у меня даже слов нет. Какая-то бессмысленная схоластика в совершенно примитивной ситуации.

A>смотреть реализацию set_next ни в коем случае не надо, она должна делать то что написано в ее названии — set next ListElement,


А отлаживать все же надо, и быть уверенным, что она делает именно то, что надо — все же придется.

A>преимущество в том, что вместо примитивных сущностей ->next и operator= мы используем более высокоуровневую операцию set_next (при этом мы не знаем ее реализацию).


Для меня — чистой воды схоластика.

A>и если постоянно использовать высокоуровневые операции, в т.ч. вместо "элемент newBegin присвоить NULL" — "новый список reversedList",

A>то код будет текстом описывающим операции над сущностями List и ListElement, а не мешаниной из присваиваний потрохов ListElement и каких-то переменных

Здесь мы не договоримся.

PD>>Да не надо тут долго смотреть. Берешь листочек, рисуешь список из трех элементов со стрелками, начинаешь выполнять на этом листочке, зачеркивая одни стрелки и рисуя другие. На втором элементе все будет ясно. Займет это минуту от силы.


A>я не хочу брать листочек и тратить минуту. я хочу разбираться с кодом с той скоростью с которой я его читаю


Что именно хочешь понять ? Что метод делает ? Для этого заголовка достаточно. Как работает ? Для этого придется в prepend и slice заглянуть — иначе откуда я могу быть уверен, что они именно то, что нужно делают ? По названию ? Тогда доверься Reverse по названию и не смотри его код. А иначе придется все же в них смотреть. И быстрее это не будет, в особенности с тем прототипом slice, о котором я писал. Там не одну минуту помедитируешь насчет того, всегда ли это верно работает. Да даже и без этого придется отвлечься от анализа Reverse, перейти к коду slice, потом вернуться... и хорошо если один раз.
With best regards
Pavel Dvorkin
Re[12]: собеседования, Реверс списка
От: Erop Россия  
Дата: 17.10.13 04:37
Оценка: +1
Здравствуйте, Abyx, Вы писали:

A>переименовать next в m_next например.

А потом list в one_way_linked_nodes, скажем...
Бюджет-то на разработку резиновый, а решарпером ты из принципа не пользуешься, да?

A>да, такая опасность есть. однако "эффективность кода" тоже нужна не всегда.

Ну да, память и проц тоже резиновые, ага-ага...

A>это мелочь, но какая же важная мелочь, как например однообразное форматирование кода.


Суть проста. "правильное" форматирование кода нужно тока придуркам. Переведу на русский, если команда не может работать вместе из-за разногласий по форматированию, то её члены -- придурки.

При этом я не отрицаю, что когда однообразное форматирование есть, то это приятнее, но считать это "важным"?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 17.10.13 08:41
Оценка: :)
Здравствуйте, Erop, Вы писали:

A>>это мелочь, но какая же важная мелочь, как например однообразное форматирование кода.


E>Суть проста. "правильное" форматирование кода нужно тока придуркам.

я сказал "однообразное", а не "правильное".
In Zen We Trust
Re[14]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 17.10.13 10:26
Оценка: +1
Здравствуйте, Abyx, Вы писали:

A>нет, переименование API происходит гораздо реже чем переименование реализации.


set_next не API, а private method, еще не хватало его в public показывать.

PD>>Почему же ты тогда отстаиваешь свое решение с лишним действием ? Да, для списка — мелочь, но вопрос же в принципе. И речь идет ведь о коде неопределенного назначения, это тебе на обработка нажатия кнопки мыши , за которой следует чтение 10Мб файла, а поэтому можно сказать, что плевать мне на эффективность самого обработчика WM_LBUTTONDOWN. А вдруг где-то именно это лишнее присваивание вызовет потерю производительности ? И что тогда ? Копаться в этом slice, понять, что там лишнее действие, переделать все (его же просто так не уберешь там) ? Сколько времени уйдет на то, чтобы это место обнаружить ? Сколько времени уйдет, чтобы это исправить (то есть переписать в том виде, который я сделал) ? За это время я тебе все next в m_next в этом классе вручную переименую


A>компилятор уберет это лишнее присваивание.


А это еще большой вопрос. Одни уберет, другой нет. И потом — мы же об общем принципе говорим, а не об отдельном присваивании.

A>да, я бы написал

A>
A>struct Foo {
A>    void bar() { m_b = -m_b; }
A>private:
A>    int m_b;
A>};
A>

A>если у Foo есть такая операция bar.

Ну да. Еще заведи bar1 с операцией !, потом bar2 с операцией ~, потом всякие (+-*/)=, то-то код понятнее станет...

А если Foo никакого нет ? А есть просто

int x = 10;

//...

x = — x;

И здесь заведешь

void neg(int&x)
{
x = -x;
}

Замечательный стиль получится


PD>>1. Ты изучаешь класс, коду которого доверяешь. В этом случае тебе вообще незачем смотреть на реализацию. Сигнатуры Reverse достаточно (плюс док, если надо)

PD>>2. Ты изучаешь класс, код которого хочешь понять (неважно для чего). В этом случае тебе придется смотреть весь код.
PD>>Если встретится полиморфизм, то будет гибрид. Придется в отношении полиморфных функций использовать (1), поскольку и впрямь исследовать нельзя. Так сказать, констатируем факт — здесь у нас неизвестно что, но с указанной сигнатурой и описанием действий, остается надеяться, что оно работает правильно. Принудительно заставляем доверять, так сказать. В отношении остального — либо (1) либо (2) в зависимости от того, что имеет место.
A>третье. я доверяю коду класса, и я хочу понять как работает код некоторого метода.
A>например есть std::forward_list. я ему доверяю, он работает. но мне интересно как у него сделана reverse(), и я заглядываю внутрь ее реализации в VC++
A>и вижу что там используются empty, begin, before_begin, _Before_end — что они делают понятно из названия, реализацию смотреть не надо
A>еще там есть _Splice_same_after, смотрим ее сигнатуру — void _Splice_same_after(const_iterator _Where, _Myt& _Right, const_iterator _First, const_iterator _Last)
A>ок, значит она вставляет [first, last) после where, реализацию смотреть не надо

A>с этим знанием возвращаемся к reverse() и теперь понятно как она работает — берет элементы из начала списка и перемещает в конец.


A>...но тут возникает вопрос, а откуда _Before_end берет конец? смотрим ее реализацию, а там цикл. ...!@№? получается в VC++ reverse сделана со сложностью O(2N)


Хм... Ты же сам себе противоречишь, не замечаешь ? В _Before_end ты почему-то заглянул, а вот _Splice_same_after — реализацию, говоришь, смотреть не надо. А почему ты уверен, что там все хорошо ? Мало ли что она вставляет, ты же не знаешь, как она это делает ? Доверяешь ? Тогда почему ей да, а reverse нет ? reverse-то, оказывается , O(2N), то есть не очень хорошо сделали, ну а вдруг они и вставку не очень хорошо сделали, там ведь если не O(1), а O(2), так то же самое будет...
Да, может, для списка просто не найдется способа испортить эту вставку , ну а, представь себе, что здесь не список, а дерево ? Там вставить можно по-разному, и эффективно, и не очень, и пока не разберешься, что там за дерево внутри, ничего не поймешь.

Вот тебе другой пример


void process(AnyClass& p)
{
for(int i = 0; i < p.length; i++)
  doSomething(p[i]);
}


Смотрим doSomething — O(1). Какова зависимость process в целом от p.length ? Можно ответить, не глядя в AnyClass::operator[] ?
With best regards
Pavel Dvorkin
Re[15]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 10:46
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

A>>нет, переименование API происходит гораздо реже чем переименование реализации.

PD>set_next не API, а private method, еще не хватало его в public показывать.

set_successor вполне может быть публичным интерфейсом итератора, что позволяет делать обобщённые алгоритмы отвязанные от конкретной реализации списка.
Например Александр Степанов вводит LinkedIterator (раз, два), который позволяет реализовать разные алгоритмы на списках.
Re[13]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 12:51
Оценка: +1
Здравствуйте, Erop, Вы писали:

E>Комментарии -- это лог намерений разработчика, а код -- то, что получилось из этих намерений.


Комментарии это непойми что, которое теоретически могло соответсвовать каким то намерениями.
А вот код это уже намерения в чистом виде.

E>А у тебя имена функций вместо комментариев используются, с той же степенью обязательности отсутствия вранья


Имена функций нужна для человека, в них и надо вкладывать смысл. Если ты пишешь c = (a + b)/2 и рядом камент "//вместо медианы берем среднее арифметическое", то тебя надо выпилить из конторы как можно раньше.
Re[16]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 17.10.13 12:54
Оценка: +1
Здравствуйте, Abyx, Вы писали:


A>также, вместо "ListElement * newBegin = NULL; // new list" лучше сделать "List newList;"

A>и вместо "begin = newBegin; // replace list elements" лучше сделать "*this = newList;"

Ладно, давай заканчивать. Точки несоприкосновения ясны, тут мы не договоримся. Слишком разные в этом плане подходы.

With best regards
Pavel Dvorkin
Re[19]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 15:46
Оценка: +1
Здравствуйте, Erop, Вы писали:

I>>То есть, информации заведомо больше, чем можно поместить в коментарии ?

E>Что за проблемы с помещением инфы в комментарии?

Когда ты колхозе работаешь то естественно никаких проблем нет. Многие всю жизнь сидят по ноздри в говне и намекают "а что за проблемы ?"

E>Вот, в частности, твой пример с медианой. Я так понимаю, что из кода тот факт, что медиану отвергли вообще не восстанавливается, а вот в твоём комментарии не хватает причины.

E>То есть правильный коммент был бы примерно такой:
//Используем среднее арифметическое, вместо медианы, потому, что медиану долго искать. 
E>//Оценку вносимой ошибки смотри в документе таком-то.


Нахер не надо. Нужно пользоваться внятным тулами для контроля версий которые интегрируются с трекером, а в трекере должны быть или сведения или линки на документацию.

Итого — в два три клика можно получить необходимую информацию и не надо загаживать код каментами, которые в обязательном порядке надо апдейтить, ибо если каменты не отображают реальное положение дел, это создает еще большую проблему.
Re[33]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 17:11
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Опять терминологический спор. Ну ок: как показывает простейший тест естественна фрагментация стала намного благоприятней в следствии замены дубового аллокатора начиная с VS2012

EP>Теперь списков на x86 меньше боишься?

Я их никогда не боялся Даже c идеальным GC в проложениях, критичных к расходу памяти, надо быть в курсе, как расходуется память. И тоже самое в С++, Джаве и где угодно — надо знать инструмент которым работаешь.
Re[20]: собеседования, Реверс списка
От: Erop Россия  
Дата: 17.10.13 18:15
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Итого — в два три клика можно получить необходимую информацию и не надо загаживать код каментами, которые в обязательном порядке надо апдейтить, ибо если каменты не отображают реальное положение дел, это создает еще большую проблему.


А так без кликов, просто в ноутпаде всё видно...
Кстати, почему ты считаешь, что доки проще апгрейдить, чем комментарии? Их ещё и размножать потом надо будет с версиями кода, и мёржить...

Хорошо, если у тебя какой-то простой тупо-программистский код. А если у тебя какая-то наукоёмкая область или там куча эвристик каких-то в коде есть? Ты всё ещё уверен, что параллельное дереву версий исходников дерево версий подробной документации по всем эвристикам и доказательствам -- это хорошо?

По идее документация нужна что бы разбираться в системе в целом, в архитектурных решениях и т. д. а вот как раз мелкие решения всякие, принятые "по месту" в документации очень редко оказываются адекватно описаны...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[35]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 18:49
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Задав капасити, можно обработать список равный размеру свободной памяти. Без этого будет втрое меньше и это фрагментация в чистом виде.


EP>Это не фрагментация, это в первую очередь отсутствие памяти. Даже при полном отсутствии всякой фрагментации, у тебя capacity не сможет вырасти в два раза, когда ты уже съел треть памяти, хоть ты тресни. Тебе уже это на протяжении нескольких страниц объясняли


Алё ! При правильном капасити не надо никуда вырастать — выделяешь столько, сколько надо и всё. Представь — есть 1гб список и АП 2гб, условно — больше никто не юзает память и АП. Выделяешь список с капасити 1гб, делаешь реверс и отдыхаешь. Вот больше 1гб не получится и вот это уже НЕ фрагментация, а тупо нехватка памяти. Все что сваливается меньше 1гб это фрагментация.

I>>То есть, эта проблема общая для любых приложений на любых языках, которые расходуют память в объемах сравнимых с размером адресного пространства.


EP>Ты рассказывал про конкретные приложения, которые падали в неожиданных местах, и приходилось долго чесать репу, так?


Мне ни разу не приходилось долго думать, что бы задетктить фрагментацию, но долго приходилось анализировать граф объектов, что бы выяснить, как его можно оптимизировать.

EP>Где это было, в какой среде? Случаем не в C# <=VS2008?


Начиная с TP5.5-BP7.0, потом TC2.0-BC3.1, Watcom C, потом VS 97 и заканчивая VS 2012, примерно так Вот на ассемблере этого не было, динамику как то не сильно использовал, извини.

I>>Для случаев без GC все получается гораздо хуже, именно с этой конкретной проблемой, дефрагментации у тебя нет и быть не может. То есть, все еще хуже чем с GC.


EP>Как будто в .NET <4.5.1 есть дефрагментация LOH


Там про GC вообще, а не конкретный.

I>>Отсюда следствие — как бы ты ни приседал с аллокацией , эта же проблема возникнет в любом языке, для любого контейнера на массиве, в котором grow factor == 2 без реаллокации, и в который добавление идет по одному элементу без задания начальной капасити. В идеальном случае можно выделить AП/3. Реально будет максимально доступное окно поделить на три.


EP>Наконец-то ты смог осилить вот эту задачку
Автор: Evgeny.Panasyuk
Дата: 14.10.13
. А раньше ведь спрашивал, "откуда 3x"
Автор: Ikemefula
Дата: 14.10.13
Молодец, возьми с полки пирожок.

EP>Какое озарение будет следующим?

Удивляюсь, как ты читать умеешь. У вектора grow factor 1.5, откуда 3 взялось ? Хотя, может ты 1.5 до 2х округляешь, извини, не в курсе новых тенденций в арифметике

I>>Все проги без GC уже сваливаются. GC продолжит сопротивляться, будет гонять объекты по адресному пространству, что влечет за собой жосцкий своп.


EP>Что там у тебя будет GC по LOH'у гонять?


Не по LOH, а по адресному пространству. Гонять — объекты. Или у тебя другие варианты есть ?
Re[18]: собеседования, Реверс списка
От: Erop Россия  
Дата: 17.10.13 19:28
Оценка: +1
Здравствуйте, Abyx, Вы писали:

A>эм... вообще-то доказательством работоспособности может быть только (юнит)тест


Про проблему останова слыхал? Так вот, одно из следствий состоит в том, что никакой тест не может гарантировать работоспособности. Но в некоторых случаях некоторые специально написанные алгоритмы можно доказать ФОРМАЛЬНО, это если требуется такой уровень надёжности.

Юнит-тест вообще для другого нужен, он ловит неожиданную порчу интерфейсов и отступления от контрактов, но с какой-то вероятностью, а не достоверно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[22]: собеседования, Реверс списка
От: Erop Россия  
Дата: 17.10.13 19:32
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Это и есть колхоз времен коллективизации.


Я, кстати, часто распечатки вообще читаю, ну, например, выхожу из дома в лес, сажусь на пинёк и читаю, что там у нас такого интересного напрограммировалось, что всё так неожиданно плохо...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[23]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 21:56
Оценка: :)
Здравствуйте, Erop, Вы писали:

I>>Не надо ничего размножать — доки находятся в единственном экземпляре на сервере в вики, конфлюэнце или шарепоинте. Надо модифировать фичу — берешь за основу старую версию, копируешь в фолдер новой версии и пишешь туда все что тебе надо.


E>Это и есть размножать... Если потом понадобится ещё и мержить правки в коде, то надо будет не забыть смёржить и доки, да ещё и сделать это корректно, кстати...


А если требования в коде, то их смержить код сохранив корректные каменты это задача практически нереальная, ибо надо заранее планировать каменты так что бы они не мешали мержу. А то будет вот так — ктото перенес функцию в отдельный файл, а при мерже получится так что структура каментов отличается от структуры нового кода.

I>>Для наукоемкой особенно актуальна интеграция VCS, трекера и документации, иначе вспотеешь контролировать все вырожденые случаи. для тупо технического проекта вообще никакой документации может не быть, потому что как правило все и так в теме или все есть в гугле.


E>Ну кто потеет, а кто без проблем контролирует...


Да, я в курсе. У меня есть один знакомый, который очень любит ручную работу. Он на почасовой оплате, смержит руками мегабайт кода за неделю, ему эту недели и оплатят.

I>>Мелкие вещи тоже надо тестировать. Объясни, каким раком тестировщики смогут покрыть твою мульку ручными/автоматическими тестами ?


E>Это никак не связано с тем, что ты где-то должен объяснить поддерживающим код коллегам ПРИЧИНЫ принятых в коде решений...


Ты похоже вообще в ИТ не работаешь. Документация даже мелких изменений должна быть вне кода, ибо не ты один работаешь с кодом. Тестеры, менеджеры, аналитики будут вынуждены пахать твой код, что бы разобраться ,что же ты там научитывал.

E>Про тестировать -- тема отдельная.


Та же самая, только в твоем случае надо будет не только код с требованиями синхронизировать, а еще и код-каменты со спекой.
Re[18]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 23:10
Оценка: +1
Здравствуйте, koodeer, Вы писали:

EP>>И что, в такой OS не будет файлов, мьютексов, соединений?

K>Я полагаю, в изначально управляемой среде их можно сделать такими, что среда будет полностью отслеживать их использование, и автоматически удалять/закрывать/освобождать.

Ну а что, например, делать с мьютексом? Ждать пока система его разлочит?
А если там какая-нибудь синхронизация чуть сложнее тривиальной — один мьютекс система отпустит, а другой нет, и внезапно наступает deadlock
Re[39]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 04:20
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Да и вообще ты так и не показал, где там фрагментация на диаграмме выше


"и полном отсутствии всякой фрагментации, у тебя capacity не сможет вырасти в два раза, когда ты уже съел треть памяти, хоть ты тресни."

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

I>>Потому что фрагментация вылазит всегда и везде, когда потребление памяти близко к размеру АП. Когда софт дорастет до границ х64, то там тоже вылезет проблема с фрагментацией. Радикально решить можно будет толко увеличением АП, то есть, переходом на 128 бит, а потом на 256 и так далее. Правда, есть шанс, что солнце погаснет раньше, чем мейнстрим дорастет до такой разрядности.


EP>Не надо тут про Солнце, конкретно отвечай — о какой VS говорил по ссылке.


На всех, а еще на джаве, питоне и джаваскрипте.

EP>Большая разница — обжегся ли ты об кривой аллокатор, либо об вполне оправданную фрагментацию (которая не является прямым следствием примитивной политики аллокации).


Я вроде ясно сказал — с фрагментацией регулярно сталкивался начиная с доса и заканчивая всякими виртуальными машинами. Допустим с дотнетом я первый раз столкнулся где то лет 10 назад, тогда я не был в курсе GC и особенностей его хипов.
Re[27]: собеседования, Реверс списка
От: Sinix  
Дата: 18.10.13 05:22
Оценка: +1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Весь топик про то, "какие опасные List'ы". Я в своём сообщении попытался разобраться в чём же дело.

EP>Вполне вероятно, что дело было в плохом аллокаторе.
Не, проблема не в list как таковом, а в его использовании без чтения документации.

EP>Так разборки начали .NET'чики с боязни больших объектов и List'ов. Видимо они не в курсе что разруливается — пришлось самому пример делать

Эммм... Ikemefula, при всём уважении, на моей памяти отмечается только в КСВ, да и то уже на коне, с опущенным забралом и надкушенным яблоком на щите

Дотнетчиков лучше искать в профильных разделах, мы в основном не буйные

EP>Я же не говорю что так нужно писать код, или что проблему нельзя обойти. Это пример является demo того, что был плохой аллокатор, и многие на нём могли обжечся

Многие — это очень сильно преувеличено. Не, серьёзно — как часто в прикладном коде требуется активно аллоцировать гигабайты в памяти, причём по мааленьким кусочкам да ещё вперемешку с мелкими долгоживущими массивами?

EP>О, кстати. Я спрашивал про аналог C++1998 std::deque — мне пытались впарить LinkedList
Автор: Evgeny.Panasyuk
Дата: 15.10.13
под видом деки. Может ты покажешь какую деку обычно используют в .NET — ведь должно же быть что-то стандартное, или распространённое, раз с List'ом такой ужас-ужас.

С List проблем нет, как уже не раз говорилось. В дотнете из коробки есть только однонаправленная Queue<T>, если нужен имено дек — есть готовые реализации, например http://nitodeque.codeplex.com/
Re[30]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 09:41
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Не, по ссылке реализация "всё в одном внутреннем массиве".


ок, не заметил.

S>Если нужно именно на чанках — есть BigList в PowerCollections, больше ничего на глаза не попадалось, специально не искал.


Вот, уже теплее "all page views=296189". Но судя по тому, что там, как они говорят, эффективные вставки в середину — это не прямой аналог std::deque.
Точно: "Getting or setting an item takes time O(log N), where N is the number of items in the list" против O(1) у std::deque. То есть это, по идее, аналог std::map<std::size_t,T>.
Re[25]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 12:21
Оценка: :)
Здравствуйте, Erop, Вы писали:

I>>А если требования в коде, то их смержить код сохранив корректные каменты это задача практически нереальная,

E>Ну кому нереальная, а кто-то что-то умеет, кроме как в два клика окошки открывать.
E>Это же дело-то известное, если руки кривые, то многое меняется

Да, а если за недельный мерж заплатят денег так и вовсе хорошо.

I>>ибо надо заранее планировать каменты так что бы они не мешали мержу.

E>Ну так комментарии -- это же тоже часть кода. Вообще структуру всего кода надо заранее планировать и менять осознанно...

И комментарии это всегда дополнительная нагрузка

I>>А то будет вот так — кто-то перенес функцию в отдельный файл, а при мерже получится так что структура каментов отличается от структуры нового кода.

E>Ну, скорее всего, этот "кто-то" будет неправ. Но так же он будет неправ, например, если название функции перестанет соответствовать её семантике.
E>И чем тут одно лучше другого я

С функциями это легче контролировать.

E>Мне платят за лучшие в мире ТТХ моего изделия...


Пудозреваю, ты один код пишешь, для себя одного.

Дальше мне лень стало
Re[29]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 12:31
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Проблема действительно не в List, и чтение документации List'а тут ничем бы не помогло. Так как дефект был в аллокаторе.


Это не дефект, а свойство аллокатора. Если это называть дефектом, то любая особенность станет дефектом
Для внятного разруливания таких случаев нужны подсказки аллокатору, хоть где угодно, менеджед или нативный аллокатор.
Скажем, если вместо ручного копирования взять Array.resize и сделать так, что бы GC выделял память не последовательно, а скажем, примерно так — если блок находится в большом окне, выделить память в противоположном конце окна, то, внезапно, проблема с фрагментацией исчезнет и можно выделить больше чем N/3, что очевидно — четные аллокации будут в начале фрейма, нечетные — в конце. Середина будет оставаться свободной и выделить можно будет больше половины размера доступного АП.
Re[32]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 13:06
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

EP>>Точно: "Getting or setting an item takes time O(log N), where N is the number of items in the list" против O(1) у std::deque. То есть это, по идее, аналог std::map<std::size_t,T>.

I>Биглист это точно отстой. Примитивная, на коленке, реализация деки рвет биглист как тузик грелку как раз потому что биглист это не аналог деки.

Поиски распространённого аналога std::deque продолжаются. Ведь что-то должно было вымучиться за 10 лет плохого аллокатора
Re[33]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 13:37
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Точно: "Getting or setting an item takes time O(log N), where N is the number of items in the list" против O(1) у std::deque. То есть это, по идее, аналог std::map<std::size_t,T>.

I>>Биглист это точно отстой. Примитивная, на коленке, реализация деки рвет биглист как тузик грелку как раз потому что биглист это не аналог деки.

EP>Поиски распространённого аналога std::deque продолжаются. Ведь что-то должно было вымучиться за 10 лет плохого аллокатора


А чем не угодила дека из STL.Net ?
http://msdn.microsoft.com/en-us/library/bb398188.aspx

Я правда не пользовался, только что нашел
Re[34]: собеседования, Реверс списка
От: Erop Россия  
Дата: 18.10.13 14:54
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>А чем не угодила дека из STL.Net ?

I>http://msdn.microsoft.com/en-us/library/bb398188.aspx

I>Я правда не пользовался, только что нашел


Тем и не угодила, что хотелось бы понять как проблему решали НА ПРАКТИКЕ...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[34]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 15:49
Оценка: +1
Здравствуйте, Erop, Вы писали:

EP>>Поиски распространённого аналога std::deque продолжаются. Ведь что-то должно было вымучиться за 10 лет плохого аллокатора

E>Судя по тому, что говорят коллеги, складывается такое впечатление, что проблему предпочитали не лечить. а обходить, вообще избегая больших блоков, предпочитая структуры данных собранные из большого количества небольших...

В этой Large Object Heap основные жители это массивы.
Как я понял, Large Object в виде структуры/класса при пороге 85kB получить крайне трудно. Особенно учитывая то, что fixed-size массивы там крайне неудобные (только unsafe context).
В такой ситуации std::deque, особенно с одинаковым размером chunk'а среди разных типов, решил бы кучу проблем. Все эти chunk'и можно было бы аллоцировать в простейшем и быстром free-list'е.
Из крупных объектов остался бы какой-нибудь interop, и внутренние массивы дэки (где указатели на chunk'и) — но их во-первых немного, а во-вторых они сравнительно маленькие.
Re[27]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 18.10.13 17:28
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Расскажи лучше как в VS2008 выбрать .NET 4.0

НС>>http://msdn.microsoft.com/en-us/library/w4atty68.aspx
EP>http://stackoverflow.com/questions/1986287/visual-studio-2008-support-for-new-net-4/1986317#1986317

Очередная демонстрация, что ты не в теме.
1) C# 4 это не тоже самое, что FW 4.0
2) Собранное компилятором C# 3 прекрасно работает в FW 4.0
Re[29]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 18.10.13 18:25
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Ты лучше ответь на вопрос который в самом верху.


Я на него уже ответил
Re[37]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 18:44
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Наоборот, очень легко. Для хештейбла это всего 5000 элементов.


EP>Ну так а что у hashtable внутри? Не массив случайно?


Целых два.

EP>А что там сравнивать — у deque'и при random access на одну косвенность больше. Линейная итерация, если реализовывать максимально эффективно, то получается практически также


Какую задачу ты хочешь декой решить ? итерации по линкед лист и по какому нибудь полу-массиву практически одинаково стоят.

У деки преимущество не в рандомном доступе, а в сложности рандомного добавления, удаления. Покажи задачу, на которой ты хочешь профит получить.
Re[39]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 19:17
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>И как это опровергает:

EP>

EP>>В этой Large Object Heap основные жители это массивы.

EP>?

А я где то написал опровержение ? Дай ссылку что ли

I>>Какую задачу ты хочешь декой решить?


EP>Аллокацию array-like данных в условиях фрагментации, топик разве не про это


Они все разные, array-like данные. Если не критично удаление-добавление по индексу, то от деки толку мало. То есть, выбирать структуры для оптимизации нужно под конкретные сценарии в приложении, а не руководствуясь соображениями о прекрасном.

Скажем для многих вещей сгодится какой нибудь BigList или ScanList из powercollections, а если в циклах тяжелые вычисления, то и вовсе сгодится разреженный массив на основе дерева.
Re[37]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 20:00
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Это ты не читатель. Я же уже писал тут, что пока что складывается такое впечатление, что С#-разрабы в массе своей не смогли разобраться в причинах проблемы и просто перестали использовать большие вектороподобные коллекции


Никто никогда не переставал. Где то в 20% приложений такие коллекции дают проблемы и как то люди справлялись, не думаешь ли ты, что только я один умный, смог забороть в проекте эту фрагментацию ?

Кроме того, там где нужны большие вектороподобные коллекции, C# гарантировано сливает нативным плюсам в большинстве сценариев. Подумай головой — дотнетчики они почти все бывшие плюсовики, что еще они могли заюзать ?
Re[41]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 20:27
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>>В этой Large Object Heap основные жители это массивы.

EP>>>[/q]
EP>>>?
I>>А я где то написал опровержение ? Дай ссылку что ли

EP>http://rsdn.ru/forum/flame.comp/5335848.1
Автор: Ikemefula
Дата: 18.10.13


EP>

EP>>>В этой Large Object Heap основные жители это массивы.
EP>>>Как я понял, Large Object в виде структуры/класса при пороге 85kB получить крайне трудно. Особенно учитывая то, что fixed-size массивы там крайне неудобные (только unsafe context).
I>>Наоборот, очень легко. Для хештейбла это всего 5000 элементов.


Так здесь совсем другое, вот класс хештейбла, он спокойно войдет в LOH при определнном размере Или ты имеешь ввиду одним куском шоб сразу все было ? Не совсем ясно, для чего это нужно

EP>>>Аллокацию array-like данных в условиях фрагментации, топик разве не про это

I>>Они все разные, array-like данные. Если не критично удаление-добавление по индексу, то от деки толку мало.

EP>Какая сложность добавления элемента в центр std::deque?


Ты лучше сразу напиши, с чем ты не согласен, а то я устал уже. Если вставка-удаление в деку хуже константы, то дека никому не нужна. В моей реализации — константа.
Типичный сценарий — удалить надо 1000...100000 элементов по индексу. Если структура линейная, то это фейл с лагами чуть не в минутах. Я на этом сэкономил с 6 часов до 5 минут, одной только декой.
Re[32]: собеседования, Реверс списка
От: Erop Россия  
Дата: 19.10.13 05:10
Оценка: -1
Здравствуйте, Ikemefula, Вы писали:

I>Не нужно ничего билдить в разных вижлах, правишь манифест, а билди хоть вижлой 2002го года один раз на все случаи жизни.


I>Какие еще у тебя вопросы ?


Если ты такой умный, ты сам мог провести эти тесты ПРАВИЛЬНО, а ещё в 2002-м там или 2003-м или когда у тебя проблемы с ООМ под С# начались? Мог разобраться с ними и придумать адекватную замену листу...

Евгений сейчас за два дня разобрался в проблеме лучше вас двоих обоих "спецов" по шарпу, что лично меня немного удивляет, однако, и как бы намекает...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[42]: собеседования, Реверс списка
От: Erop Россия  
Дата: 19.10.13 05:12
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Типичный сценарий — удалить надо 1000...100000 элементов по индексу. Если структура линейная, то это фейл с лагами чуть не в минутах. Я на этом сэкономил с 6 часов до 5 минут, одной только декой.


И при чём тут дека, фрагментация и GC?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[39]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.10.13 06:19
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Ночной Смотрящий, Вы писали:


НС>>Офигеть. А можно логическую цепочку, которая привела тебя к такому выводу?

E>Так никто так и не назвал ЧТО ОН ИСПОЛЬЗОВАЛ в качестве такой коллекции...

А зачем комуто говорить, если я сам перечислил ?
Re[43]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.10.13 06:55
Оценка: :)
Здравствуйте, Erop, Вы писали:

I>>Типичный сценарий — удалить надо 1000...100000 элементов по индексу. Если структура линейная, то это фейл с лагами чуть не в минутах. Я на этом сэкономил с 6 часов до 5 минут, одной только декой.


E>И при чём тут дека, фрагментация и GC?


Предлагаешь менять одну структуру на другую не глядя на другие проблемы, чисто руководствуясь соображениями о прекрасном ?
Re[43]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 19.10.13 23:23
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>И при чём тут дека


Мне вот тоже интересно. В исходной задаче смысла в ней 0, там LinkedList за глаза. А использовать ее для борьбы с фрагментацией VA вместо массива — как то уж очень жестко.
Re[44]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 05:45
Оценка: +1
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Мне вот тоже интересно. В исходной задаче смысла в ней 0, там LinkedList за глаза. А использовать ее для борьбы с фрагментацией VA вместо массива — как то уж очень жестко.


Почему её жёстко использовать вместо массива, если шарповый аллокатор тупит на больших блоках?
Что там так уж "жёстко" на твой взгляд?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[38]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 07:39
Оценка: +1
Здравствуйте, Sinix, Вы писали:

E>>1) дотнетовский аллокатор вообще очень плохо совместим с большими кускам памяти, в отличии от кучи других аллокаторов. Не в последнюю очередь и потому, что он вообще неправильно с большими объектами работает.


S>Ошибка уже в первом пункте

S>Я наверно раза четыре написал, что шансы получить OOM в реальном приложении именно из-за фрагментации кучи стремятся к 0. Но даже этот 0 обходится элементарно — переходом на x64, обновлением фреймворка, или (наконец) изучением матчасти.

В смысле "ошибка" Так етсь таки проблемы с фрагментацией LOH или нет?

S>Итак, раз уж мы говорим за 10 лет — где хоть одна статья с описанием нерешаемых проблем, вызванными особенностями LOH? Только плиз, написанная нормальным разработчиком со знанием матчасти, а не "Вау, мы поломали дотнет!"


Ты всё время тут пытаешься найти какие-то за и против шарпа. А мне это не интренесно, IMHO, это просто инструмент со своим кругом задач. И всё. Мне интересно, как решали таки проблему с плохой работой аллокатора больших объектов? Судя по гуглению форумов всяких, проблема таки была, а хорошего решения я не нашёл, в смысле при гуглении. И тут никто не сказал ничего кроме двух
1) перейти на х64
2) перейти на новый рантайм.

Ну, то есть решение и отладку проблемы разработчики пререложили на всторов рантайма. Так же, например, пользователи ворда не бросаются чего-то там допиливать в ворде, что бы оно не падало на больших документах, а обновляют ворд, например. Это не говорит о тех или иных людях чего-то плохого или хорошего, это просто другой подход, скорее всего он оправдан экономически и всё такое.
Но просто сама по ссебе разница в подходах тоже, похоже есть, и она забавная.

S>Во-первых, аллокатор LOH принципиально ничем не отличается от аллокаторов в других языках — та жа куча + free list. Т.е. "На кой ему вообще сдались LOH? Зачем он АП пачками ест?" ровно с теми же основаниями можно спрашивать у c++


В С++ популярные под виндой аллокаторы большие объекты сразу по VirtualAlloc выделяют, без пачек, и сразу же по virtualFree освобождают, тоже без пачек...

S>Не, это наброс.

Ну воздержись от набросов, и пиши конструктивно, чё...
Хотя в КСВ может это и лишнее...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[41]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 12:39
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

S>>На практике за 10 лет не встречал ни разу. Как добиться — в курсе, но зачем так делать — ума не приложу


EP>Так в чём ошибка? В том что это неправда, или в том что ты этого не встречал?


Все аллокаторы плохо совместимы с большими кусками данных Проблема с большими кусками данных в общем случае не решаема при фиксированом АП.

EP>Кстати, там советы вида:

EP>

>>The only way that I know of is Object Pooling, I know that it can be a pain in the rear(not the word I wanna choose), but it is an option.
EP>[...]
>>You could cap the size of the packets below the 80k limit. Then your buffers won't go on the LOH. Weigh up the speed gains from packets >80k against the need to specifically manage all the large objects.

EP>Что скорее подтверждает выводы озвученные Erop'ом

С большими списками есть одна проблема — в них много элементов В частности, это означает что потерь памяти будет слишком много.
Скажем в моем приложении в самых тяжелых случаях по 30млн объектов. Это значит, в кратце, что 240мб будет потрачено, если все эти объекты заменить на Object, то есть, ни грамма пользовательских данных.
Вы же с Егором хотите как то под особым углом посмотреть, так что бы проигнорировать все особенности GC как инструмена вообще, без привязки к дотнету, а потом сделать вывод : "Сообщество шарпистов ..."

Вроде ясно было показано, что проблема
1. свойственна для любого GC
2. не-GC аллокатора так же свойственна

А все ваши басни про VirtualAlloc только подкрепляют уверенность, что вы оба совершенно не в теме
Re[42]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 12:55
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Неа. Именно что не встречал, т.е. не было необходимости обходить. "Прямые" способы (включая флаг VM hoarding для самых отчаянных) я уже приводил раза три, не меньше. Пока возражения сводятся к "не верю, проблема должна быть"


VM hoarding только чуток оттянет конец

В фиксированом АП проблема не в общем случае не решается, хоть GC, хоть дефолтный С++ хип, хоть приседания с VirtualAlloc
Re[47]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 15:44
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>У тебя был случай, где нужны были InsertAt(0)/RemoveAt(0)/InsertAt(random)/RemoveAt(random), и изначально ты выбрал List, а потом заменил на что-то более подходящее?


Другие операции тоже были нужны List был выбран 10 лет назад, только сначала это был ArrayList, потом поменяли из за дженериков, и только в 2012м году профайлер показал, что узкое место это коллекции. До этого были другие узкие места, что вполне объяснимо.

EP>И ты пытаешься сказать что из этого следует, что std::deque вообще не нужна, и является лишь "рассуждением о прекрасном", а нужно что-то что даёт быструю вставку в середину?


Пока операция не является узким местом, List самое оптимальное во всех отношениях решение и достаётся забесплатно.

EP>Здесь обсуждаются случаи где изначально был List, и он был адекватным выбором, без всяких вставок в начало/середину, но из-за плохого аллокатора нужна альтернатива.


Вставки в начало-середину становятся критичными только когда размер коллекции превышает определенный порог, до этого они даже незаметны.

EP>То что тебе когда-то потребовалось что-то типа std::set/unordered_set/etc, и ты это смог распознать, это конечно чрезвычайно полезный для тебя опыт, и видимо отпечатался в памяти как что-то необычное и чрезвычайно увлекательное. Но к данной дискуссии это не имеет никакого отношения


Если рассуждать о прекрасном — то да.
Re[49]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 16:19
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Ещё раз, этот твой конкретный опыт выбора структур данных (видимо вообще единичный), мало относится к текущему обсуждению


Это общий оптимизации любых структур данных — смотреть расклад частоте вызовов + издержкам на отдельные операции

А вот подход "у нас большой List давайте заменим на Dequee, потому что асимптотика подходит" это рассуждения о прекрасном.

EP>>>Здесь обсуждаются случаи где изначально был List, и он был адекватным выбором, без всяких вставок в начало/середину, но из-за плохого аллокатора нужна альтернатива.

I>>Вставки в начало-середину становятся критичными только когда размер коллекции превышает определенный порог, до этого они даже незаметны.

EP>До определённого порога, они будут быстрее в обычных массивах — это, например, одно из оснований использовать boost::flat_map-like.


То есть, оптимизировать без реальной на то обходимости ? "у нас небольшой List давайте заменим на flat_map, потому что асимптотика подходит"

>Но как это относится к данному топику? У нас же "огромные и ужасные List'ы"


Правильно. И ответ, на что менять List, дает ответ профайлер и требования, а не рассуждения о прекрасном
.
Re[46]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 19:54
Оценка: -1
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>А, ну конечно — твоя версия что никто не знает на них ответов конечно же правдоподобнее А главное — как удобно то.


Не "никто", а люди, отметившиеся в теме. Например такие эксперты, как ты...

НС>Затем что посчитал интересным на них ответить. Но это вовсе не означает, что если я на какие то другие, напрямую мне не заданные вопросы в этом топике не ответил, то это означает что я не способен на них ответить.


Этот вопрос я тебе уже несколько раз задал напрямую. На всякий случай и здесь вот ещё раз спрашиваю...

НС>Ну так и скажи — продемонстрировать логическую цепочку не можешь.

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

НС>Если надо быстро считать, то тут точно на С++ писать придется. Но не из-за памяти, а потому что CLR до сих пор не имеет интринсиков для векторных расширений.


У-у-у, а зачем тут векторные расширения?..
Хотя можно, конечно, но не факт, что будет быстрее, кстати

НС>Нет, так не есть.

Доказательства?..

НС>У тебя какие то помехи в канале, я твою фразу не достраивал, я ее привел as is, путем копирования через буфер обмена.


Ну ты ещё раз подтвердил, что не поймёшь меня, потому, что хочешь не понять... И в чём профит?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[50]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 20:16
Оценка: :)
Здравствуйте, Ikemefula, Вы писали:

I>Тормоза они не с потолка берутся. Если время работы устраивает, то совершенно без разницы, насклько медленнее работа с коллекцией относительно идеального во всех отношениях варианта.


Угу. В целом мы с этого с НС начали, что есть целая школа такого программирования, когда стандартность и шаблонность кода ценится больше, чем его эффективность и элегантность. Я тока не пойму, почему ты бросился доказывать, что решение с обращением односвязного списка через промежуточный массив ссылок на элементы плохое. Ты же его ещё не профилировал, вроде?..

E>>А то может у вас там всё так же неадекватно было запрограммировано, и вы потом профайлером 10 лет выпрямляли изначально кривую архитектуру?..


I>А может у тебя в ДНК чтото особенное ?

Ну с этим-то я и не спорю. Я умный
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[51]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 21:06
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Угу. В целом мы с этого с НС начали, что есть целая школа такого программирования, когда стандартность и шаблонность кода ценится больше, чем его эффективность и элегантность. Я тока не пойму, почему ты бросился доказывать, что решение с обращением односвязного списка через промежуточный массив ссылок на элементы плохое.


Просто так. У меня КСВ это способ пар выбросить, а не чтото дельное показать. За прошлые две недели я вкинул кода больше, чем за всё лето, так что нужно было где то отвлекаться, что бы мозг не закипел.

Что касается обращения списка, то оно ужасное. Я хотя ошибся в масштабе проблемы, с математикой плохо, но в целом все верно — добавление в List без указания размераслишком часто не имеет права на жизнь. Нагрузка на GC слишком большая, хоть это и неочевидно.
Во вторых, оно громоздкое, втрое длиннее обычного решения "в лоб" — в большинстве случаев короткий код чаще всего понятнее, правильнее, быстрее и вообще эффективнее.
Вот надо будет к проекту студента "на вырост" подключить — он в таких местах накосячит будь здоров. А с понятным кодом таких мин не будет.
Re[53]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 21:43
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Это всё конечно очень интересно, но к чему всё это?

EP>Ты притянул за уши какой-то случай из своей практики, где замена вектора на деку не помогла бы, потому что (surprise!) вектор изначально был выбран не правильно

Сюрприз — код работал 10 лет правильно и вектор не был узким местом.

Вопрос — на каком основании считать правильность выбора вектора ? У тебя есть ответ или ограничишься рассуждениями о прекрасном ?

Более того — если отказаться от х32, то можно и нужно оставлять этот же вектор. Все что надо изменить — алгоритмы работы с данными, например InsertAt, RemoveAt и лишние Contains можно исключить вовсе. Новые алгоритмы будут жрать вчетверо больше памяти и раз в 10 больше АП, но это все достанется забесплатно.
Re[48]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 05:04
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Им то зачем ? Они уверенно отличают адресное пространство от памяти, и четко понимают, что VirtualAlloc в обсуждаемом вопрос как козе боян.


Второе -- это они зря. Вот у вас ООМ 10 лет и выскакивает поэтому...
Кстати "0 лет" -- это опечатка, правильно было читать "10 лет", но я думаю, что все, кроме тебя догадались, кстати

I>Представь себе продукт навроде САПР, в котором только дотнетного кода 50мб, а есть еще джава, С++, куча скриптов и даже кое что на ассемблере + кучка 3rd party либ. Над продуктом на старте работало почти пол-сотни человек, при том, что индусского кода в нём практически нет, и бОльшая часть — или математики, или с математическим образованием. Алгоритмы — свои же наработки из R&D, так и заимствования из разных разделов математики.


И что? Ты хочешь сказать, что этот проект сложнее, чем вы можете управлять, или что?
Обычно, когда разрабатывают что-то такое, то проводят, в том числе и нагрузочное тестирование. Ну типа самый большой документ, как ещё можно, самая объёмная операция и т. д. И что бы это тестирование провести выясняют на что у нас программа-то рассчитана и почему. В чём суть ограничений...

Могут, конечно, вылезти потом совсем неожиданные косяки, но чем лучше управление проектом, тем этих неожиданных косяков, а если вы 10 лет, как на вулкане живёте и строгаете затычки по результатам профилирования, то значит качество управления не очень хорошее. Я не хочу сказать, что у вас так или сяк, я не знаю как у вас. Я просто указал два полюса, тебе виднее к какому ближе ваша контора...

I>Но, не сомневаюсь, ты бы за день все требования вкурил, за второй проанализировал код, а за третий переписал все с нуля на С++.


В смысле? Какие требования?

I>Время нельзя потратить на всё подряд. Есть вещи, которые у меня получаются лучше математики. Так что я спокойно смотрю, если у кого то математика получается лучше, чем у меня.


Ну я же уже писал, что люди всякие нужны.
Занимайся тем, что у тебя получается, почему нет?
Только я не понимаю всё равно, чего ты споришь о сложности алгоритмов ничего в этом не понимая, и как ты понял, что использовать лист в задаче обращения списка накладно, хот ты это решение не профилировал...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[50]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 11:06
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Несовсем ясно, откуда с 2012 по 2013й взялось десять лет

Ты писал, что архитектуре 10 лет, но тормоза от листа вылечили тока в 2012...
А до того их не замечали. Или ты как-то неточно выразился?

I>Я хочу сказать, что проект сложнее чем ты себе нафантазировал.

А уоткуда ты знаешь, что я себе нафантазировал?..

I>Спасибо, капитан очевидность.

Пожалуйста, тогда у меня вопрос, если вы всё так и делали, как так полцчилось, что вы превысили проектные нагрузки, вы узнали из профайлера?

E>>Я просто указал два полюса, тебе виднее к какому ближе ваша контора...


I>Покажи откуда следует "строгаете затычки по результатам профилирования"


Ну, бывает так, а бывает этак, а как у вас -- тебе виднее. Я там оставил то, до чего ты походу не дочитал...

E>>В смысле? Какие требования?

I>О, дурачка включил.
Попробуй выражаться яснее...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[40]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 11:14
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Проблемы есть и было сказано, когда и при каких условиях они возникают.

А вот твой коллега утверждает
Автор: Sinix
Дата: 21.10.13
, что конкретно такая проблема -- редкость...

S>>>Итак, раз уж мы говорим за 10 лет — где хоть одна статья с описанием нерешаемых проблем, вызванными особенностями LOH? Только плиз, написанная нормальным разработчиком со знанием матчасти, а не "Вау, мы поломали дотнет!"


I>Это никакого отношения к фраментации АП не имеет. Я показал два сценария, в которых твой VirtualAlloc ничем не помогает.


Это всё, как ты говоришь, "рассуждения о прекрасном", а в реальности ещё как помогает, и я даже уже пару раз объяснял тут почему помогает, но Ikemefula-то, если и читатель, то уж точно не пониматель
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[53]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 12:59
Оценка: :)
Здравствуйте, Erop, Вы писали:

НС>>А мой опыт оптимизации реального кода говорит, что 90% устраняемых при этом проблем вовсе не из-за неправильно выбранных структур данных.


E>Дык, по идее, это же и означает, что в 90% случаев программистам удаётся таки как-то выбрать адекватные структуры данных ещё на этапе проектирования, а не исходя из показаний профайлра...


Это какая то особенная логика нужна. если 90% проблем "не из-за неправильно выбранных структур данных" то есть варианты

1. выбрали структуры правильно
2. выбрали структуры неправильно, но сами и пофиксили, с профайлером
3. выбрали структуры неправильно, но сами и пофиксили, без профайлера
4. выбрали структуры правильно, масштабировали без профайлера, в структурах не накосячили
5. выбрали структуры правильно, масштабировали с профайлером, в структурах не накосячили

Дальше сам можешь дополнить.
Re[47]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 13:18
Оценка: :)
Здравствуйте, Erop, Вы писали:

I>>>> (*) Ты похоже отказываешься понять, что "память закончится" это вещь сильно относительная.


I>> (****) Как бы очевидно, что если прога должна работать с объемом данных Х, то на этом объеме не должно быть ни ООМ, ни свопа, ни лагов, ни замерзаний.


I>>Вот тебе это очевидно ?


E>Мне не то, что бы неочевидно, а совсем не понятно, как (*) сочетается с (****)...


(*) появилось из за ">В любом случае, такое решение становится неработоспособно только тогда, когда уже и сам односвязный список слишком дорог, так как если элемент в нём больше, чем ссылка, то память закончится раньше, чем скажутся ограничения листа, а если меньше, то выходит, что там очень низкий кпд какой-то.."

Объясняю еще раз — нужно не рассуждать о прекрасном, а смотреть реальный расклад, что же с памятью в приложении. То есть, максимальный непрерывный фрейм

Итого, вариант, когда непрерывный фрейм маленький, не вписывается в твою концепцию идеального мира
Re[60]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 13:59
Оценка: :)
Здравствуйте, Ikemefula, Вы писали:

I>Нет никаких запросов Код — разный. Какую часть из 50мб показать ?

Чё? Тебе понадобилось 50 метров кода что бы попрофилировать реверс списка?
А ты прикольный...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[61]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 14:17
Оценка: :)
Здравствуйте, Erop, Вы писали:

I>>Нет никаких запросов Код — разный. Какую часть из 50мб показать ?

E>Чё? Тебе понадобилось 50 метров кода что бы попрофилировать реверс списка?

Ты успокойся, не волнуйся только — проблему, которая обозначена в самом верху, я в последний раз профайлил весной 2012. С тех пор ничего не изменилось и мне не надо писать еще какой то код, что бы получить те же самые результаты.
Re[48]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 21:33
Оценка: :)
Здравствуйте, Ночной Смотрящий, Вы писали:

E>>Не "никто", а люди, отметившиеся в теме. Например такие эксперты, как ты...

НС>Перешел на личности — слил.

Э-э-э, ты считаешь, что то, что я считаю тебя экспертом в дотнете -- это переход на личности?..

Не, самокритично, конечно, но несколько неожиданно...
IMHO, ты скромничаешь...

НС>Для быстрого вычисления сверток. DSP — он такой.

В данном случае для быстрого вычисления свёрток, надо из интеграла сигнала в конце диапазона вычесть интеграл сигнала в начале и просуммировать по диапазонам...
Чем тут тебе векторные расширения я
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: собеседования, Реверс списка
От: fddima  
Дата: 09.10.13 17:50
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Теоретически, GC может и будет двигать неудобные блоки. Но факт в том, что это работает до ~85кб, дальше GC (не в курсе про последние версии), ничего двигать не будет и память будет выделяться-освобождаться как попало.

I>На самом деле в GC есть оптимизации из за таких вот случаев, но я бы не сказал, что они сработают всегда. Если приложение нормально разогрето, в нем не будет нужного количества свободных блоков должного размера.
I>То есть, GC будет стараться двигать мелкие объекты(<85 кб), даже не двигать, а гонять их по адресному пространству.
В 4.5.1 будет LOH compacting.
Но в принципе, если кто сталкивался с реальным, а не теоретическим энтерпрайзом — Windows Server 2012+ — в основном там только сниться, или на новых инсталляциях, или нету. Так, что в ближайшее время — как бы пофигу на все их новые флюшки со своей дурацкой lock-in политикой.

Так что, как ни странно, но таки да.
Re[3]: собеседования, Реверс списка
От: LaptevVV Россия  
Дата: 09.10.13 17:55
Оценка:
Здравствуйте, fddima, Вы писали:

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


I>>>P.S. Крикунам из лагеря С++ — для многих плюсовых контейнеров, которые ресайзят внутренний массив как это показано выше, п..ц наступит гораздо быстрее, практически мгновенно.

A>>C++ лагерь говорит что в С++ у списков нет внутреннего массива
F> Ой ли.
Залезте в STL и посмотрите.
Внутренний массив есть у вектора, и список массивов есть у дека.
У списков — нет массива. Там память выделяется индивидуально.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 18:06
Оценка:
Здравствуйте, fddima, Вы писали:

I>>Теоретически, GC может и будет двигать неудобные блоки. Но факт в том, что это работает до ~85кб, дальше GC (не в курсе про последние версии), ничего двигать не будет и память будет выделяться-освобождаться как попало.

I>>На самом деле в GC есть оптимизации из за таких вот случаев, но я бы не сказал, что они сработают всегда. Если приложение нормально разогрето, в нем не будет нужного количества свободных блоков должного размера.
I>>То есть, GC будет стараться двигать мелкие объекты(<85 кб), даже не двигать, а гонять их по адресному пространству.
F> В 4.5.1 будет LOH compacting.
F> Но в принципе, если кто сталкивался с реальным, а не теоретическим энтерпрайзом — Windows Server 2012+ — в основном там только сниться, или на новых инсталляциях, или нету. Так, что в ближайшее время — как бы пофигу на все их новые флюшки со своей дурацкой lock-in политикой.

F> Так что, как ни странно, но таки да.


Вообще, не ясно, почему List'T до сих пор в таком вот виде, все что надо, уменьшить дефолтный grow factor, скажем 1.5, будет медленнее, зато окна будут заполняться сами собой в большинстве сценариев. Или хотя бы дать возможность юзать свой. Тоже самое нужно во всех коллекциях и особенно в инвокейшнлистах, а то забавляет когда студенты крик подымают "я добавляю эвентхандлер, памяти сто мегов а летит Out Of Memory"
Re: собеседования, Реверс списка
От: Erop Россия  
Дата: 09.10.13 18:24
Оценка:
Здравствуйте, Ikemefula, Вы писали:

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


E>>Ну то решение, которое не нравится НС, если его сделать более или менее по уму, оно всего в два раза медленнее + одна-две аллокации под буфер массива, что на GC полная фигня, как бы...


I>Алё ! Ты математик или погулять вышел ?

Начинаем новый тред с оскорблений? Занятно...

I>Объясняю популярно

I>выделение памяти здесь НЕ линейное, хотя это не очевидно на первый взгляд.
1) Ну будет логорифм от длины аллокаций, горе-горе-беда-беда...
Всё равно это o(N)...
2) Неужели этому вашему листу с решёточкой нельзя намекнуть скока памяти брать сразу?

I>Память то будет освобождаться, но GC будет жрать все новую и новую память, ибо старый блок дохнет после того, как будет инициализирован новый.

I>Более того, память будет фрагменироваться не только массивами, но и хипами
Я всегда подозревал, что GC -- это от слова "экскрименты", но не подозревал, что настолько.
Всё-таки я надеюсь, что эту "мегапроблему" как-то да решили, листов-то в шарпе просто тонны же заводят?..

I>То есть, фокус в том, что эта стратегия выделения очень неудобная для GC.

Ну, что ещё раз говорит нам о том, что базовая стркутура данных несовсемтима с встроенным же в язык GC, и это типа хоршо? Я думаю, что те самые "оптимизации" таки работают

I>Более того, очень осторожно нужно быть со скрытыми массивами, например в инвокейшнлистах и тд и тд. Казалось бы — сделали N подсписчиков, что тут такого ?

I>А реально выходит хаос память или заканчивается на ровном месте или GC будет педалить, педалить, педалить

Ну, конкретно в задаче со списком можно сначала посчитать длину, если это так уж критично. Будет ещё лишнее чтение всех указателей, а не толкьо лишняя запись

I>Нагрузка на GC — O(2^N) и вот такое решение ты яростно защищаешь, и на ровном месте у тебя Out Of Memory exception с долгими мучениями GC


Ну, то есть ты утверждаешь, что лист в шарпе -- это просто конец света какой-то? Как же программы то дотнетовские работают? нет, я знаю, чот тормознуто и хреново и много памяти кушают, но что-то я не верю, что такой код ухудшит ситуацию как-то кардинально...

I>P.S. Крикунам из лагеря С++ — для многих плюсовых контейнеров, которые ресайзят внутренний массив как это показано выше, п..ц наступит гораздо быстрее, практически мгновенно.

Чё, правда что ли?

Если чё, ты не сообщил ничего нового. Только сильно краски сгустил, а так всё нормуль
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 18:31
Оценка:
Здравствуйте, LaptevVV, Вы писали:

I>>>>P.S. Крикунам из лагеря С++ — для многих плюсовых контейнеров, которые ресайзят внутренний массив как это показано выше, п..ц наступит гораздо быстрее, практически мгновенно.

A>>>C++ лагерь говорит что в С++ у списков нет внутреннего массива
F>> Ой ли.
LVV>Залезте в STL и посмотрите.
LVV>Внутренний массив есть у вектора, и список массивов есть у дека.

Массивы, буфферы всякие — проблема одна и та же, если просто выделять да копировать. Проблема известна со времен Си, и везде говорилось, что надо юзать realloc, но стандартный хип не может гарантировать, что realloc увеличит размер, а не выделит на новом месте.

Судя по тому, что мне доводилось видеть, в С++ старую технику realloc давно забыли
Re[2]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 18:38
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Объясняю популярно

I>>выделение памяти здесь НЕ линейное, хотя это не очевидно на первый взгляд.
E>1) Ну будет логорифм от длины аллокаций, горе-горе-беда-беда...
E>Всё равно это o(N)...
E>2) Неужели этому вашему листу с решёточкой нельзя намекнуть скока памяти брать сразу?

До конца ты, понимаю, ниасилил, решил побыстрее блеснуть познаниями.

E>Всё-таки я надеюсь, что эту "мегапроблему" как-то да решили, листов-то в шарпе просто тонны же заводят?..


Никак. В С++ при подобной технике увеличения ровно те же проблемы, только быстрее.

I>>Более того, очень осторожно нужно быть со скрытыми массивами, например в инвокейшнлистах и тд и тд. Казалось бы — сделали N подсписчиков, что тут такого ?

I>>А реально выходит хаос память или заканчивается на ровном месте или GC будет педалить, педалить, педалить

E>Ну, конкретно в задаче со списком можно сначала посчитать длину, если это так уж критично. Будет ещё лишнее чтение всех указателей, а не толкьо лишняя запись


Можно. Фокус в том, приведеный код не содержал этого подсчета, а с подсчетом алгоритм становится еще сложнее.

I>>Нагрузка на GC — O(2^N) и вот такое решение ты яростно защищаешь, и на ровном месте у тебя Out Of Memory exception с долгими мучениями GC


E>Ну, то есть ты утверждаешь, что лист в шарпе -- это просто конец света какой-то? Как же программы то дотнетовские работают? нет, я знаю, чот тормознуто и хреново и много памяти кушают, но что-то я не верю, что такой код ухудшит ситуацию как-то кардинально...


Не лист, а добавление большого количества элементов последовательно без указания стартового размера, как это было сделано в примере.

E>Если чё, ты не сообщил ничего нового. Только сильно краски сгустил, а так всё нормуль


Ну ты доказывал, что решение отличное, а нагрузку O(2^N) просчитать не смог. Ты математику забыл что ли ?
Re[2]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 09.10.13 18:51
Оценка:
Здравствуйте, Erop, Вы писали:

E>2) Неужели этому вашему листу с решёточкой нельзя намекнуть скока памяти брать сразу?


Намекнуть то можно, вот только откуда ты узнаешь размер списка? Еще раз по нему пробежишься? И ты продолжаешь утверждать, что такой код, с вычислением и передачей размера, все равно проще правильного варианта?
Re[3]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 09.10.13 18:51
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>На самом деле они очень хорошо оттюнингованы под GC .NET и могут хранить миллионы элементов.


Хранить то могут, но в реальных приложениях, если нам надо работать под 32 битами (или даже в чужом 32-битном процессе) и миллионными списками, приходится писать специальный список, который внутри хранит данные чанками меньше 85К размером.

G>Но это не значит что вставка в цикле в список без выделения размера — хорошая идея.


А если размер заранее неизвестен?
Re[3]: собеседования, Реверс списка
От: Erop Россия  
Дата: 09.10.13 18:51
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Никак. В С++ при подобной технике увеличения ровно те же проблемы, только быстрее.

ну, то есть ты хочешь сказать, что std::vector в С++ прогаммах не испольуется, так как если используется, то жрёт память гигами?

I>Можно. Фокус в том, приведеный код не содержал этого подсчета, а с подсчетом алгоритм становится еще сложнее.

Ну я сильно подозреваю, что это тоже преждевременная оптимизация

I>Не лист, а добавление большого количества элементов последовательно без указания стартового размера, как это было сделано в примере.


Э-э-э-э-э, разве это не основной сценарий?..

I>Ну ты доказывал, что решение отличное, а нагрузку O(2^N) просчитать не смог. Ты математику забыл что ли ?


Про нагрузку O(2^N) ты ошибаешься. Всего будет примерно log2 (N / 11) аллокаций, общим объёмом примерно в 2N максимум... И то, если там аллокатор не полные неучи пилили, оно должно это жело как-то гранулировать и блоки можно легко переиспользовать разными массивами. У нас элемент массива же просто ссылка, он стандартного размера, блоки в нормальной программе должны переиспользоваться, неиспользуемых дырок не возникать и всё такое.
Короче ложная тревога.

Но, впрочем, ты пожешь попрофилировать. Взять прогу, которая что-то ещё делает, и добавить в неё такой массив, и посмотреть, как он скажется на её свойствах...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: собеседования, Реверс списка
От: Erop Россия  
Дата: 09.10.13 18:56
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Аналогично и для других структур данных есть антипаттерны использования, но и в них .NET показывает себя не хуже ************ контейнеров STL.


Что-то я всё раво сомневаюсь, что добавление в массив по одному -- это такой уж антипатерн.
Всё-таки массив под это проетировался. Я так понимаю, что в обсуждаемом листе будут храниться ссылки, так что размеры блоков будут типа стандартными и будут переиспользоваться всеми массивами в программе, так что с грануляцией всё в порядке.
Алолокаций будет логарифмическое количество, то есть o(N), а мы понимаем, что затраты времени на пополнение массива это по любому никак не меньше, чем O(N)...
Суммарный объём аллокаций будет тоже O( N ) и коэффициент там будет какой-то не очень грандиозный, типа от двух до трёх будет колебаться, в зависимости от того, как N близко к 11 * 2^K...

В общем что-то я не вижу тут никакой супер-катастрофы... На шарпе весь код так памятью разбрасывается и ничего, все довольны...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: собеседования, Реверс списка
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 09.10.13 18:57
Оценка:
Здравствуйте, Nuzhny, Вы писали:

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


A>>>C++ лагерь говорит что в С++ у списков нет внутреннего массива

G>>vector<T> таки имеет внутренний массив, да еще и коэффициент увеличения 1.5, что приводит к более частым выделениям\освобождениям памяти.

N>С++ лагерь говорит, что vector<T> не является списком и показанным выше способом с ним никто в здравом уме не орудует.


Что значит не является списком? С точки зрения Д. Кнута таки является. а и его устройство аналогично .NETовскому List<T>.
Re[4]: собеседования, Реверс списка
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 09.10.13 19:01
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, gandjustas, Вы писали:


G>>На самом деле они очень хорошо оттюнингованы под GC .NET и могут хранить миллионы элементов.


НС>Хранить то могут, но в реальных приложениях, если нам надо работать под 32 битами (или даже в чужом 32-битном процессе) и миллионными списками, приходится писать специальный список, который внутри хранит данные чанками меньше 85К размером.

В реальных приложениях структура зависит от использования.

G>>Но это не значит что вставка в цикле в список без выделения размера — хорошая идея.

НС>А если размер заранее неизвестен?
Значит оценка есть какая-то. Не зная статистических характеристик бесполезно пытаться что-то оптимизировать в реальном приложении.
Re[6]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 19:22
Оценка:
Здравствуйте, Vzhyk, Вы писали:

I>>Массивы, буфферы всякие — проблема одна и та же, если просто выделять да копировать. Проблема известна со времен Си, и везде говорилось, что надо юзать realloc, но стандартный хип не может гарантировать, что realloc увеличит размер, а не выделит на новом месте.


I>>Судя по тому, что мне доводилось видеть, в С++ старую технику realloc давно забыли

V>И этот человек собеседует плюсовиков... ЧТД!

Во первых — лет 8 как не собеседую плюсовиков.
Во вторых — код говорит сам за себя.

Что бы сократить, угадаю твой следующий аргумент

V "Кого набрал, такой и код"

Ответ тебе напомнить или ты сам вспомнишь ?
Re[5]: собеседования, Реверс списка
От: Erop Россия  
Дата: 09.10.13 19:23
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Судя по тому, что мне доводилось видеть, в С++ старую технику realloc давно забыли

realloc не гарантирует сохранения адреса буфера, к сожалению, поэтому для сложных данных не годится,..

Зато есть VirtualAlloc с возможностью резервировать и комитить, ну в *правильных системах* в смысле
А вообще-то затраты на переаллокации вектора ты сильно преувеличиваешь. Конечно лучше их избегать, но они всё равно малы, по сравнеию с работой с самими данными. Просто аллокации/освобождения, если не из пула в С++ дорогие.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 19:28
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Даже если начальный размер 4, то это не сильно влияют на все остальное. В этом и суть нелинейного увеличения, при увеличении N затраты на добавление в конец стремятся к о(1) пока не упремся в память.


Не в память, а в адресное пространтсво. И с этого момента все интересное только начинается.

I>>Фактически получается так, что


I>>1 В реальном приложении память уже юзается кем то и АП всегда хоть немного но фрагментировано, включая LOH

G>Да, но все равно будет максимум 1 Gen0 и 1 Gen2.

Профайлер с тобой категорически не согласен. Хотя для приложений на коленке возможно так и будет.

I>>2 паттерн ниже встречается слишком часто, при чем список часто состоит в т.ч. из структур и размеры >миллиона

I>>
I>>var list = new List<Item>();
I>>while (condition())
I>>{
I>>  list.Add(current());
I>>}
I>>

I>>3 в дженерик лист кладутся не только ссылки, а еще и структуры, я откопал похожий паттерн при добавлении 10млн гуидов
I>>4 рассчитывать на память в LOH или забывать про неё крайне глупо
G>Это все нерелевантно, так как обсуждение идет разворота списка.

Ты не волнуйся, я хорошо помню, как реверс списка ты реализовал в виде реверса строки через стрингбилдер.

G>Я же писал про бесполезность "разворота списка" как задачи, проверяющей знание чего-либо.


Она не проверяет знание, она проверяет умение решить нетиповую задачу, воспользовавшись базовыми вещами — циклами, ссылками и головой.
Re[6]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.10.13 19:31
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Судя по тому, что мне доводилось видеть, в С++ старую технику realloc давно забыли

E>realloc не гарантирует сохранения адреса буфера, к сожалению, поэтому для сложных данных не годится,..

Спасибо, капитан, ты повторил ровно мои слова.

E>А вообще-то затраты на переаллокации вектора ты сильно преувеличиваешь. Конечно лучше их избегать, но они всё равно малы, по сравнеию с работой с самими данными. Просто аллокации/освобождения, если не из пула в С++ дорогие.


В который раз говорю — не затраты на переаллокации, а скорость потребления адресного пространства.
Re[5]: собеседования, Реверс списка
От: Erop Россия  
Дата: 09.10.13 19:34
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>В данном сценарии основную нагрузку дает суммарный объем аллокаций — O(2^N),


Не мог бы ты пояснить, откуда такая оценка?
Я вернопонимаю, то уже для списка в 400 элемнтов, например, сумарный объём аллокаций привысит 10^100, то есть гугол?..

Реальность несколько отличается от твоего взгляда на вещи. Самая большая аллокация будет ближайшая сверху к N степень двойки, например для 400, это будет 512.
Суммарный объем всех предыдущих будет меньше 512, то есть общий объём для списка из 400 элементов не превысит 1023, а на самом деле и того меньше, то есть потратится где-то до 4К памяти, половина из которой ещё и остантся удобных размеров для переиспользования ДРУГИМИ списками...

Что-то я вообще никакой трагедии в этом не вижу
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: собеседования, Реверс списка
От: Erop Россия  
Дата: 09.10.13 19:37
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>В который раз говорю — не затраты на переаллокации, а скорость потребления адресного пространства.



Оценки какие-то будут?..

ну, например, как ты думаешь, если вот тупо взять и написать на плюсах std::vector<char> и начать в него добавлять по одному, миллион символов добавить удостся?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: собеседования, Реверс списка
От: Erop Россия  
Дата: 09.10.13 20:03
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>n это было количетсво аллокаций, а не размер списка.


Ну так оно же логарифмически растёт с размером? В результате получаем, что оверхед примерно линейный от размера списка. Да ещё и с коэффициентом от 2 до 3 где-то. В чём тогда трагедия?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: собеседования, Реверс списка
От: Erop Россия  
Дата: 09.10.13 20:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>2 в степени (количество аллокаций)


Ну вот хотим мы, например, мегабайтный список замутить. Типа 256 * 1024 ссылки положить в него.

На какой-нибудь простой объектик, ну, например, на короткие случайные строчки.

не мог бы ты оценить, если средний размер случайной строки, скажем 16, то сколько памяти уйдёт на строки, а ксколько на аллокации самого списка?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 09.10.13 20:20
Оценка:
Здравствуйте, Erop, Вы писали:

E>не мог бы ты оценить, если средний размер случайной строки, скажем 16, то сколько памяти уйдёт на строки, а ксколько на аллокации самого списка?..


А чего тут оценять? Взял профайлер да померял
Re[11]: собеседования, Реверс списка
От: Erop Россия  
Дата: 09.10.13 20:39
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>А чего тут оценять? Взял профайлер да померял


Ну я та подозреваю, что на список уйдёт меньше, чем на строчки...
Так что мне всё равно не ясен весь этот ужас перед последовательным добавлением...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: собеседования, Реверс списка
От: Erop Россия  
Дата: 09.10.13 21:08
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Вот ты тоже невнимательно читаешь. Ikemefula говорит не про расход памяти как таковой, а про фрагментацию VA-спейса в 32-хбитном процессе.


Я это понимаю, и даже сталкивался, только это уже очень большие списки нужны. Таких и в память влезет несколько десятков только...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: собеседования, Реверс списка
От: fddima  
Дата: 09.10.13 21:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Вообще, не ясно, почему List'T до сих пор в таком вот виде, все что надо, уменьшить дефолтный grow factor, скажем 1.5, будет медленнее, зато окна будут заполняться сами собой в большинстве сценариев. Или хотя бы дать возможность юзать свой. Тоже самое нужно во всех коллекциях и особенно в инвокейшнлистах, а то забавляет когда студенты крик подымают "я добавляю эвентхандлер, памяти сто мегов а летит Out Of Memory"

Такой — скорее всего потому, что достаточно хорош для большинства вещей/людей. Я честно говоря от List'T никогда не страдал, хотя и в зауженных местах старался ему задать капасити сразу, если оно вдобавок доподлинно заранее известно.
Но в принципе — на перерасход памяти натыкался, что с плюсами, что с нетом, хотя это всегда было связано с ошибками/недосмотром в самом коде.
Самое клёвое — это когда в одном процессе борятся несколько независимых сборщиков мусора. Тогда происходит всё то о чём ты написал, но только в квадрате.
Re: собеседования, Реверс списка
От: Codechanger Россия  
Дата: 10.10.13 06:42
Оценка:
Здравствуйте, Ikemefula, Вы писали:

Сейчас вроде бы имеет смысл в подобных случаях применять Bcl.Immutable. Там хоть с выделением памяти нет такого беспредела,ну и перфоманс в целом поровнее и побыстрее в среднем. Ну и опять же, народ к элементам ФП приучать, к тому, что коллекцию изменить нельзя.
Re[2]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 09:41
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Сейчас вроде бы имеет смысл в подобных случаях применять Bcl.Immutable. Там хоть с выделением памяти нет такого беспредела,ну и перфоманс в целом поровнее и побыстрее в среднем. Ну и опять же, народ к элементам ФП приучать, к тому, что коллекцию изменить нельзя.


Дотнет пока не дорос до таких коллекций, любое добавление в коллекцию фактически создание нового и разрушение старого. С фрагментацией проблем не будет, но увеличивается количество объектов значительно и получается тот же хаос. Собтсвенно ФП коллекции безбожно тормозят сами по себе.
Re[4]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 09:45
Оценка:
Здравствуйте, landerhigh, Вы писали:

I>>Аналог этого списка это vector или чтото навроде.


L>Что? Более того, кому в здравом уме и твердой памяти может понадобиться реверсить вектор?


Проблемы вызывает код ниже. Выдели болдом строчки, в которых тебе видится реверс списка
var list = new List<Item>();
while (condition())
{
 list.Add(current());
}
Re[10]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 09:50
Оценка:
Здравствуйте, Erop, Вы писали:

I>>2 в степени (количество аллокаций)


E>Ну вот хотим мы, например, мегабайтный список замутить. Типа 256 * 1024 ссылки положить в него.


256К ссылок даст всего 18 аллокаций, это небольшая проблема.

E>не мог бы ты оценить, если средний размер случайной строки, скажем 16, то сколько памяти уйдёт на строки, а ксколько на аллокации самого списка?..


Объясняю в который раз — речь про адресное пространство, а не память.

Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Адресное пространство != память.
Re[8]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 09:51
Оценка:
Здравствуйте, Erop, Вы писали:

I>>n это было количетсво аллокаций, а не размер списка.


E>Ну так оно же логарифмически растёт с размером? В результате получаем, что оверхед примерно линейный от размера списка. Да ещё и с коэффициентом от 2 до 3 где-то. В чём тогда трагедия?


Еще раз — речь про адресное пространство, а не оверхед по памяти.
Re[9]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 09:55
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Еще раз — речь про адресное пространство, а не оверхед по памяти.


У тебя убогий GC неконтролируемо адресное пространство процесса фрагментирует? У-ти-у-ти-у-ти, как я тебе сочувствую.

Оценки масштаба трагедии, вызванной списком ил миллиона или четверти миллиона коротких строк, таки будут?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 10:10
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну чё, в копи-пасте ты спец. А теперь покажи свои оценки цены вопроса. Если считаешь, что в этом случае важнее расход адресного пространства -- посчитай и его, какие проблемы-то?


Цена вопроса == стабильность приложения. Дальше зависит от того, что это за приложение.

Проблема актуальная для больших приложений в архитектуре навроде x86, где АП ограничено — всего 2гб, но в силу естественной фрагментации размер непрерывного отрезка АП может быть намного меньше, в 10 и более раз.
Re[10]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 10:12
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Еще раз — речь про адресное пространство, а не оверхед по памяти.


E>У тебя убогий GC неконтролируемо адресное пространство процесса фрагментирует? У-ти-у-ти-у-ти, как я тебе сочувствую.


Не GC, а аллокации фрагментируют. GC с этим борется.

E>Оценки масштаба трагедии, вызванной списком ил миллиона или четверти миллиона коротких строк, таки будут?..


Оценка мастштаба трагедии для твоего случая уже дадена в первых ответах — никакой трагедии, абсолютно, ибо GC не выйдет за пределы одного-двух хипов (16мб).
Re[14]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 10.10.13 10:16
Оценка:
Здравствуйте, Erop, Вы писали:

E>Я это понимаю, и даже сталкивался, только это уже очень большие списки нужны.


Да не особо большие. Списочек в десяток миллионов ссылок при активном использовании уже такое вполне способен обеспечить.

E> Таких и в память влезет несколько десятков только...


Не важно сколько их влезет в память. Даже один крупный пересоздаваемый список способен со временем фрагментировать весь доступный спейс.
Re[6]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 10:17
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Во-первых, std::vector<T>- это умная обёртка над буфером. Похожим на список его делают разве что итераторы, но итераторы можно прикрутить и к обычному куску памяти.

N>Во-вторых, от std::vector<T> никто не ждёт поведения типичного для работы со списками: быстрая вставка и удаление элементов, то же реверсирование и другие подобные задачи. Он не для этого сделан и, повторюсь, не используется для вышеперечисленных задач. Всем плевать, какое определение давал спискам Кнут и как устроен дотнетовский List<T> — std::vector<T> просто не предназначен, он плох для выполнения тех задач, под которые не заточен. Поэтому его и не назвали списком, а дали имя вектор. Подумай об этом.

В дотнете зря поменяли название ArrayList, когда решили добавить дженерики. Был бы толковй ArrayList'T и не было бы многих проблем.
Re[12]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 11:25
Оценка:
Здравствуйте, Erop, Вы писали:

E>Так что мне всё равно не ясен весь этот ужас перед последовательным добавлением...


Ситуация довольно редкая, если граф объектов небольшой, миллион-два, в LOH никто не гадит и нативных модулей, сборок немного.
А если загружено N нативных модулей, граф объектов большой, интенсивно используется интероп, большое количество сборок, в LOH уже есть много хипов, то рассчитывать более чем на два три хипа(каждый 16мб) я бы не стал. И для больших приложений, если никто не опимизировал АП, это обычное дело.
Скажем гибридные приложения это просто АДъ , когда в одном процессе сразу всё.

В промежуточных вычислениях периодически случаются списки длиной 10млн и более, бывает и до 100 млн. Вроде запас по памяти приличный, но прилага ведет себя странно — преиодически мерзнет надолго, потом отмерзает или иногда сваливается от OOM.
Начинаешь сокращать расход памяти, местами помогает, а местами становится еще хуже — сваливается быстрее. Еще сокращаешь — на одних сценариях работает лучше, на других еще быстрее сваливается Фокус в том, что простое сокращение расхода памяти большей частью в АП ничего кардинально не меняет — как были дырки, так и остались.

У GC нет никакой информации о том, где лучше искать свободные блоки. Потому выбран сценарий который удовлетворяет 80% приложений — освобождаем наобум(почти) до тех пор пока не найдем. Не нашлось — двигаем блоки до тех пор пока не найдем. Двигать любые блоки нельзя — часть блоков не двигаются. Как только уперлись в это — OOM.

В х64 эта проблема неактуальна, АП много больше чем доступно памяти. Для х86, проблема очень актуальна, если приложение большое, см выше.
Re[3]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 10.10.13 11:29
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Собтсвенно ФП коллекции безбожно тормозят сами по себе.


Однако построенный на них компилятор шарпа работает в разы быстрее нативного.
Re[13]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 11:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Проблема актуальная для больших приложений в архитектуре навроде x86, где АП ограничено — всего 2гб, но в силу естественной фрагментации размер непрерывного отрезка АП может быть намного меньше, в 10 и более раз.



Ну не надо массивы больше 100 метров хреначить просто и всё. Они на это не рассчитаны просто. Но это довольно-таки специфическая проблема, вообще-то...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 11:39
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Оценка мастштаба трагедии для твоего случая уже дадена в первых ответах — никакой трагедии, абсолютно, ибо GC не выйдет за пределы одного-двух хипов (16мб).


И к чему тогда весь кипишь и стоны, что все умрут?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 11:41
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Да не особо большие. Списочек в десяток миллионов ссылок при активном использовании уже такое вполне способен обеспечить.


40 метров буфера уже хватает? Не особо хорошо работает тогда в дотнете менеджмнт памяти

НС>Не важно сколько их влезет в память. Даже один крупный пересоздаваемый список способен со временем фрагментировать весь доступный спейс.


Странно, а чё, про грануляцию там не слыхали что ли?

Если мы пока что про винду, то msvc'шная куча, например, большие аллокации делает сразу через VirtualAlloc, и потом их же и освобождает, так что отдают обратно системе, при освобождении...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 11:45
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>В х64 эта проблема неактуальна, АП много больше чем доступно памяти. Для х86, проблема очень актуальна, если приложение большое, см выше.


ну я же уже писал, что сочувствую. Это просто ещё раз показывает, что большие списки не надо на шарпе делать, в С, например, памятью рулить можно намного более осмысленно, в том числе и фрагментацией АП процесса.

Кстати, а раскидать объекты/подсистемы по нескольким процессам не помогает?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: собеседования, Реверс списка
От: landerhigh Пират  
Дата: 10.10.13 11:51
Оценка:
Здравствуйте, Ikemefula, Вы писали:

L>>Что? Более того, кому в здравом уме и твердой памяти может понадобиться реверсить вектор?


I>Проблемы вызывает код ниже. Выдели болдом строчки, в которых тебе видится реверс списка

I>
I>var list = new List<Item>();
I>while (condition())
I>{
I> list.Add(current());
I>}
I>


Я в код н вчитывался , по заголовку оценил.
Но в C++ список — это тебе не массив какой, описанных тобой ужасов с распределением памяти не ожидается.
www.blinnov.com
Re[6]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 12:23
Оценка:
Здравствуйте, landerhigh, Вы писали:


L>Я в код н вчитывался , по заголовку оценил.

L>Но в C++ список — это тебе не массив какой, описанных тобой ужасов с распределением памяти не ожидается.

А контейнеры на массивах вызывают чудесный аналог realloc который гарантирует перераспределение по месту ? Чудеса !
Re[14]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 12:26
Оценка:
Здравствуйте, Erop, Вы писали:

I>>В х64 эта проблема неактуальна, АП много больше чем доступно памяти. Для х86, проблема очень актуальна, если приложение большое, см выше.


E>ну я же уже писал, что сочувствую. Это просто ещё раз показывает, что большие списки не надо на шарпе делать, в С, например, памятью рулить можно намного более осмысленно, в том числе и фрагментацией АП процесса.


В C# тоже можно, нужно просто другие коллекции юзать или хотя бы следить за capacity.

E>Кстати, а раскидать объекты/подсистемы по нескольким процессам не помогает?


Так и делается. Но все таки участки в другой процесс не вынесешь, издержки слишком большие и сложность архитектуры выходит намного выше.
Re[12]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 12:27
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Оценка мастштаба трагедии для твоего случая уже дадена в первых ответах — никакой трагедии, абсолютно, ибо GC не выйдет за пределы одного-двух хипов (16мб).


E>И к чему тогда весь кипишь и стоны, что все умрут?


Я уже описал, где и когда это критично. Повторить ?
Re[4]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 12:31
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

I>>Собтсвенно ФП коллекции безбожно тормозят сами по себе.


НС>Однако построенный на них компилятор шарпа работает в разы быстрее нативного.


Я в курсе, но это не значит, что сами по себе они работают быстрее
Re[15]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 13:33
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Так и делается. Но все таки участки в другой процесс не вынесешь, издержки слишком большие и сложность архитектуры выходит намного выше.


а память разделять между процессами дорого выходит?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 13:34
Оценка:
Здравствуйте, Ikemefula, Вы писали:


E>>И к чему тогда весь кипишь и стоны, что все умрут?


I>Я уже описал, где и когда это критично. Повторить ?


Э-э-э, ты эту тему насал с какого-то кидания калом, как выяснилось, речь шла о редком специальном случае и только. Тебе не хочется извиниться?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: собеседования, Реверс списка
От: landerhigh Пират  
Дата: 10.10.13 13:40
Оценка:
Здравствуйте, Ikemefula, Вы писали:


L>>Но в C++ список — это тебе не массив какой, описанных тобой ужасов с распределением памяти не ожидается.


I>А контейнеры на массивах вызывают чудесный аналог realloc который гарантирует перераспределение по месту ? Чудеса !


А контейнеры на массивах предполагают включение девайса /dev/head при их использовании
www.blinnov.com
Re[16]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 14:01
Оценка:
Здравствуйте, Erop, Вы писали:

E>некоторые люди, когда видят, что упала относительно болшая аллокация, начинают использовать ИНСТРУМЕНТЫ, что бы посмотреть что там в АП процесса и в кучах творится, как бы сразу, а не когда поседеют.


Когда падают большие аллокации, все просто. Проблема когда неочевидно, что аллокации большие или их много, ты вот до сих пор не понял этот вопрос, или приложение начинает падать непойми почему в разных местах.

>Но тебе такие не нужны, я понимаю, тебе нужны такие, которые список верно угадают, как вертеть


Про устройство памяти это практически обязательный вопрос в любой области, хоть джава, хоть плюсы, хоть джаваскрипт.
Re[16]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 14:01
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Так и делается. Но все таки участки в другой процесс не вынесешь, издержки слишком большие и сложность архитектуры выходит намного выше.


E>а память разделять между процессами дорого выходит?


По разному. Если данные потоковые — то легко.
Re[14]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 14:03
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Я уже описал, где и когда это критично. Повторить ?


E>Э-э-э, ты эту тему насал с какого-то кидания калом, как выяснилось, речь шла о редком специальном случае и только. Тебе не хочется извиниться?..


Начни с себя.
Re[17]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 14:03
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Когда падают большие аллокации, все просто. Проблема когда неочевидно, что аллокации большие или их много, ты вот до сих пор не понял этот вопрос, или приложение начинает падать непойми почему в разных местах.

Я-то как раз понял, и умею и детектировать проблему и решать
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 14:23
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Начни с себя.


Я топиков со слов "Алё ! Ты математик или погулять вышел ?" как бы не начинал...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[18]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 14:35
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Когда падают большие аллокации, все просто. Проблема когда неочевидно, что аллокации большие или их много, ты вот до сих пор не понял этот вопрос, или приложение начинает падать непойми почему в разных местах.

E>Я-то как раз понял, и умею и детектировать проблему и решать

Както неочевидно — ты до сих пор пытаешься рассуждать про память, когда я говорю про адресное пространство
Re[16]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 14:36
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Начни с себя.


E>Я топиков со слов "Алё ! Ты математик или погулять вышел ?" как бы не начинал...


И что тут необычного для КСВ ?
Re[19]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 14:41
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Както неочевидно — ты до сих пор пытаешься рассуждать про память, когда я говорю про адресное пространство


Какая разница? Всё равно всё сводится к VirtualAlloc в конце концов. Просто GC дотнетический, как я понял, не умеет отдавать большие куски, или плохо умеет и рулить этим нельзя или неудобно.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[20]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 14:53
Оценка:
Здравствуйте, Erop, Вы писали:

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


I>>Както неочевидно — ты до сих пор пытаешься рассуждать про память, когда я говорю про адресное пространство


E>Какая разница? Всё равно всё сводится к VirtualAlloc в конце концов. Просто GC дотнетический, как я понял, не умеет отдавать большие куски, или плохо умеет и рулить этим нельзя или неудобно.


Разница такая — большое потребление памяти всегда большое потребление АП. малое потребление памяти совсем необязательно малое потребление АП. GC дотнета умеет отдавать и разруливать болшие куски намного лучше, чем большинство плюсовых аллокаторов.
Re[21]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 15:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Разница такая — большое потребление памяти всегда большое потребление АП. малое потребление памяти совсем необязательно малое потребление АП. GC дотнета умеет отдавать и разруливать болшие куски намного лучше, чем большинство плюсовых аллокаторов.


Что такое "большинство"? рантайм дефолтного компилятора куски боьлше какого-то порога, вроде 40К аллокируют сразу по VirtualAlloc,..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[22]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 16:14
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Разница такая — большое потребление памяти всегда большое потребление АП. малое потребление памяти совсем необязательно малое потребление АП. GC дотнета умеет отдавать и разруливать болшие куски намного лучше, чем большинство плюсовых аллокаторов.


E>Что такое "большинство"? рантайм дефолтного компилятора куски боьлше какого-то порога, вроде 40К аллокируют сразу по VirtualAlloc,..


Это как то решает проблемы с фрагментацией ?
Re[23]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 16:21
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Это как то решает проблемы с фрагментацией ?


Да.
Вторая тонкость -- грануляция. Так что куски легко переиспользуются.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[24]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.13 18:08
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Это как то решает проблемы с фрагментацией ?


E>Да.


Покажи каким образом. Представь себе такое — есть свободной памяти ажно 2гб

Выюзаем блоками по 60кб всю память, как ты утверждал — все это пойдет чуть не напрямую через VirtualAlloc
Освобождаем каждый второй блок — свободной памяти стало ажно гигабайт.
Теперь делаем тоже самое, но размер блока делаем 100кб — раз ты утверждаешь, что проблемы фрагментации решаются через VirtualAlloc, то стало быть нет никаких проблем.

Вопрос — как имеено тебе поможет VirtualAlloc в этом сценарии ?
Re[5]: собеседования, Реверс списка
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.10.13 18:51
Оценка:
Здравствуйте, Ikemefula, Вы писали:

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


G>>Даже если начальный размер 4, то это не сильно влияют на все остальное. В этом и суть нелинейного увеличения, при увеличении N затраты на добавление в конец стремятся к о(1) пока не упремся в память.


I>Не в память, а в адресное пространтсво. И с этого момента все интересное только начинается.

Уже года 3 как только в x64 работаю, там в первую очередь в память упираешься. Обо когда оперативка забивается GC начинает работать активнее, что еще сильнее бьет по производительности.

I>>>Фактически получается так, что


I>>>1 В реальном приложении память уже юзается кем то и АП всегда хоть немного но фрагментировано, включая LOH

G>>Да, но все равно будет максимум 1 Gen0 и 1 Gen2.
I>Профайлер с тобой категорически не согласен. Хотя для приложений на коленке возможно так и будет.
Даже если будет 2-3 GC по другим причинам — это небольшой impact. Если будет сильно больше сборок мусора, тогда надо причину в другом месте искать.

G>>Это все нерелевантно, так как обсуждение идет разворота списка.

I>Ты не волнуйся, я хорошо помню, как реверс списка ты реализовал в виде реверса строки через стрингбилдер.
Я реверс списка еще тут писал: http://rsdn.ru/forum/job/4633021.1
Автор: gandjustas
Дата: 24.02.12

А разворот строки был совсем из дугой ветки.


G>>Я же писал про бесполезность "разворота списка" как задачи, проверяющей знание чего-либо.

I>Она не проверяет знание, она проверяет умение решить нетиповую задачу, воспользовавшись базовыми вещами — циклами, ссылками и головой.
Я как-то всегда через fold и рекурсию выводил. Задача кстати вполне типовая для ФП. А для императивных языков она бесполезная, ибо никто даже близко ничего похожего не пишет.
Re[6]: собеседования, Реверс списка
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.10.13 18:54
Оценка:
Здравствуйте, Nuzhny, Вы писали:

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


N>>>С++ лагерь говорит, что vector<T> не является списком и показанным выше способом с ним никто в здравом уме не орудует.


G>>Что значит не является списком? С точки зрения Д. Кнута таки является. а и его устройство аналогично .NETовскому List<T>.


N>Во-первых, std::vector<T>- это умная обёртка над буфером. Похожим на список его делают разве что итераторы, но итераторы можно прикрутить и к обычному куску памяти.

N>Во-вторых, от std::vector<T> никто не ждёт поведения типичного для работы со списками: быстрая вставка и удаление элементов, то же реверсирование и другие подобные задачи. Он не для этого сделан и, повторюсь, не используется для вышеперечисленных задач. Всем плевать, какое определение давал спискам Кнут и как устроен дотнетовский List<T> — std::vector<T> просто не предназначен, он плох для выполнения тех задач, под которые не заточен. Поэтому его и не назвали списком, а дали имя вектор. Подумай об этом.
N>Ну и в-третьих, если кто-нибудь захочет всё таки использовать std::vector<T> для несвойственных ему задач, то напишет (или найдёт в сети) подходящий для этого аллокатор, который будет вести себя оптимальным образом на конкретной задаче. И при этом будет работать лучше, чем любой универсальный GC.

N>Вот как поступает С++ лагерь.


Так все поступают. Точат алгоритмы и контейнеры под задачи.
Вот только чем более заточенные инструменты, тем больше боли при изменениях.
Re[2]: собеседования, Реверс списка
От: koodeer  
Дата: 10.10.13 19:29
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Сейчас вроде бы имеет смысл в подобных случаях применять Bcl.Immutable. Там хоть с выделением памяти нет такого беспредела,ну и перфоманс в целом поровнее и побыстрее в среднем.


А есть практический опыт применения Immutable Collections? А то я про них читал, немного тыкал, но в реальных нагруженных проектах пока не довелось использовать.

Кто их использовал, поделитесь ощущениями.
Re[16]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 10.10.13 19:36
Оценка:
Здравствуйте, Erop, Вы писали:

НС>>Да не особо большие. Списочек в десяток миллионов ссылок при активном использовании уже такое вполне способен обеспечить.

E>40 метров буфера уже хватает? Не особо хорошо работает тогда в дотнете менеджмнт памяти

Не в дотнете все еще хуже, имею, так сказать, опыт.

E>Если мы пока что про винду, то msvc'шная куча, например, большие аллокации делает сразу через VirtualAlloc, и потом их же и освобождает, так что отдают обратно системе, при освобождении...


Фрагментация, это не когда адресное пространство кончилось, это когда оно фрагментировано.
Re[4]: собеседования, Реверс списка
От: Vain Россия google.ru
Дата: 10.10.13 19:42
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Внутренний массив есть у вектора

да вы создали интригу, требую продолжения
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[25]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 20:51
Оценка:
Здравствуйте, Vzhyk, Вы писали:

V>Не надоело еще? NET — это уровень сильно выше, чтобы разбираться в том, как работают менеджеры памяти, это же не С и не С++, где без оного знания никуда. Ну вычитал он где-то немного странную сказку и теперь всем ее травит.


С одной стороны, я так понял, что у него часто бывают с этим проблемы. Может почитает чего, посмотрит, углубится в тему чуть дальше и всё такое...
С другой стороны, он тут не единственный читатель жеж...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[17]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 20:58
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Не в дотнете все еще хуже, имею, так сказать, опыт.

Ну, охотно верю. Там же с аллокаторами баловаться не получится? Так что вся надежда, что GC не слажает и не фрагментируется...

НС>Фрагментация, это не когда адресное пространство кончилось, это когда оно фрагментировано.



Я понимаю, но если ваш список гранулирует размеры своих буферов, то он не особо будет фрагментировать свой аллокатор. Все списки по очереди будут юзать одни и те же блоки, если, конечно, аллокатор умеет группировать аллокации по размеру блока.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[18]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 10.10.13 21:22
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну, охотно верю. Там же с аллокаторами баловаться не получится? Так что вся надежда, что GC не слажает и не фрагментируется...


Ну я ж говорю как борются в дотнете — заменяют стандартный список на реализацию с цепочкой массивов, хранение больших массивов на stream.

E>Я понимаю, но если ваш список гранулирует размеры своих буферов, то он не особо будет фрагментировать свой аллокатор.


Не факт. Гранулы в 40кб при списках в десятки мегабайт — что мертвому припарка.

E> Все списки по очереди будут юзать одни и те же блоки


Это если все блоки идентичного размера.
Re[19]: собеседования, Реверс списка
От: Erop Россия  
Дата: 10.10.13 21:36
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Не факт. Гранулы в 40кб при списках в десятки мегабайт — что мертвому припарка.


Обычно не так гранулируют, а на логарифмическую шкалу.


E>> Все списки по очереди будут юзать одни и те же блоки


НС>Это если все блоки идентичного размера.


Ну мы про списки ссылок говорим же?...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.13 04:28
Оценка:
Здравствуйте, gandjustas, Вы писали:

I>>Не в память, а в адресное пространтсво. И с этого момента все интересное только начинается.

G>Уже года 3 как только в x64 работаю, там в первую очередь в память упираешься. Обо когда оперативка забивается GC начинает работать активнее, что еще сильнее бьет по производительности.

Вроде было ясно сказано — х86. В 64 бита фрагментация АП никого не интересует, спасибо, Капитан Очевидность.

>>>>1 В реальном приложении память уже юзается кем то и АП всегда хоть немного но фрагментировано, включая LOH

G>>>Да, но все равно будет максимум 1 Gen0 и 1 Gen2.
I>>Профайлер с тобой категорически не согласен. Хотя для приложений на коленке возможно так и будет.
G>Даже если будет 2-3 GC по другим причинам — это небольшой impact. Если будет сильно больше сборок мусора, тогда надо причину в другом месте искать.

Ты снова про свои 64 бита. Это неинтересно.

G>>>Это все нерелевантно, так как обсуждение идет разворота списка.

I>>Ты не волнуйся, я хорошо помню, как реверс списка ты реализовал в виде реверса строки через стрингбилдер.
G>Я реверс списка еще тут писал: http://rsdn.ru/forum/job/4633021.1
Автор: gandjustas
Дата: 24.02.12

G>А разворот строки был совсем из дугой ветки.

Поздно уже отмазываться, это, считай, уже отягчающее обстоятельство.

I>>Она не проверяет знание, она проверяет умение решить нетиповую задачу, воспользовавшись базовыми вещами — циклами, ссылками и головой.

G>Я как-то всегда через fold и рекурсию выводил. Задача кстати вполне типовая для ФП. А для императивных языков она бесполезная, ибо никто даже близко ничего похожего не пишет.

Если ты напишешь рекурсивное решение то как минимум это не провальное решение и вполне объяснимо — чел пишет как ему удобнее-привычнее, для собеседования вполне годится. Да, стек съедается и может закончиться. Но есть вещи более интересные — как правило, люди которые смогли написать рекурсию, понимают, что это значит, и практически всегда за дополнительные две минуты могут наклепать обычный цикл.
Re[28]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.13 13:09
Оценка:
Здравствуйте, Erop, Вы писали:

E>Нет, помогает то, что в конце-концов все аллокации где-то внутри сводятся к распределению выделенной по VA порции памяти.


То есть, вся твоя мега идея "VirtualAlloc" заключается в том, что есть два хипа — для малых и больших объектов. Один управляется либой, второй — виндой.

Вопрос — при чем здесь VirtualAlloc ? Хип для больших объектов можно сделать самому и это всего лишь скажется на перформансе.

То есть, VirtualAlloc помогает с перформансом, а с фрагментацией помогает разделение хипов на два штуки минимум — для малых и больших объектов.


> Таку порцию потом трудно отдать. Вот и весят эти сегменты алолокаторов, повышают фрагментацию АП. Если же

большие аллокации делать сразу на VA, то когда ты эти блоки освободишь, АП дефрагментируется...

Я показал два сценария, ни в одном из них ты не показал где именно помогает VirtualAlloc.

E>Но это одна сторона медали, вторая -- правильные политики аллокации, которые обеспечивают переиспользование блоков и снижение фрагментации. Конкретно для плюсовго вектора/вашего листа — такой политикой является грануляция. Если выделять куски памяти не случайного размера, а всегда выбирать какой-то и жёстко заданой линейки размеров гранул, то такие блоки будут чаще переиспользоваться и реже резаться на ошмётки...


Правильно, и VirtualAlloc ничем, кроме перформанса, не помогает.

I>>Это потому, что ты не понимаешь разницу между адресным пространством и памятью.

E>Это ты себе придумал. Я даже понимаю разницу между физическим и логичемким АП, а не только между памятью и АП

Ты так и не смог показать, где и чем тебе помогает VirtualAlloc

I>>Ну, допустим. Другой сценарий — выделяем 900мб, потом 200, потом 900. Итого — занято 2гб. Удаляем большие блоки по 900, свободной — 1800.

I>>Выделяем 1гиг.

E>Ты опять хочешь занять от половины свободной памяти...


Я показал тебе самый минимальный случай фрагментации — всего два куска. Меньше просто не бывает. Если VirtualAlloc не может разрулить этот самый простой случай, значит, что он тебе ничем помочь в принципе не может.

Объясняю еще раз — фрагментации, меньше чем 2 куска, не бывает. Где помощь VirtualAlloc ? Её нет и быть не может.

E>В целом такие большие куски априори недоступны. Даже если вообще ничего не аллокировать, туда что-то может загрузиться, какая-нибудь dll-ка или хук, например, так что рассчитывать, что ты получишь половину АП одним куском наивно...


Ты помоему так и не понял, что такое адресное пространство.
Re[2]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.13 13:20
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Коллеги, объясните мне, что здесь происходит ? Какие реаллокации ? Линейный однонаправленный список в С/C++ на базе ссылочной реализации переворачивается без какого бы то ни было выделения памяти.

PD>Или я что-то не понял ?

Не,товарищи утверждают следующее
1. Версия с реаллокацей крута аки Чак Норрис, даже если фрагментирует все адресное пространтство
2. Реверс на месте невозможный рокет саенс, его можно только зазубрить, иначе нереально
Re[4]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 11.10.13 14:32
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Однако построенный на них компилятор шарпа работает в разы быстрее нативного.


Ты забыл упомянуть, что он не производит никакой оптимизации, в отличие от нативного.
With best regards
Pavel Dvorkin
Re[5]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.13 14:54
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

НС>>Однако построенный на них компилятор шарпа работает в разы быстрее нативного.


PD>Ты забыл упомянуть, что он не производит никакой оптимизации, в отличие от нативного.


Ты попутал Джыт и компилятор. Здесь речь про компилятор — cs.exe. Раньше он был на плюсах. Сейчас на шарпе. Выхлоп(il) у него не хуже плюсового, т.е. с оптимизациями все сильно, при этом работает намного быстрее.
Re[6]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 11.10.13 15:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты попутал Джыт и компилятор. Здесь речь про компилятор — cs.exe. Раньше он был на плюсах. Сейчас на шарпе. Выхлоп(il) у него не хуже плюсового, т.е. с оптимизациями все сильно, при этом работает намного быстрее.


Я не попутал, я просто считал, что cs делает перевод на IL без оптимизации, а оптимизирует JIT в применении к таргет платформе. Мне это тут несколько лет назад упорно доказывали, подчеркивая именно преимущество дотнета в плане последнего. Если сейчас иначе, спасибо за информацию. На C# я в последнее время практически не пишу.

То есть, если я тебя правильно понял, результирующий IL сильно отличается для Debug и Release ? И можно теперь просто так дебажить Release в студии без того, чтобы аттачиться к процессу, и видеть при этом реальный ассемблерный код "настоящего" Release ? Иными словами, JIT уже не оптимизирует, а просто транслирует IL в коды ?
With best regards
Pavel Dvorkin
Re[7]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.13 15:22
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Я не попутал, я просто считал, что cs делает перевод на IL без оптимизации, а оптимизирует JIT в применении к таргет платформе. Мне это тут несколько лет назад упорно доказывали, подчеркивая именно преимущество дотнета в плане последнего. Если сейчас иначе, спасибо за информацию. На C# я в последнее время практически не пишу.


Оптимизации кое какие делаются даже при компиляции в il. Насколкьо круто сделана эта часть,я не в курсе, выхлоп у обоих версий компилера по моему одинаковый.

PD>То есть, если я тебя правильно понял, результирующий IL сильно отличается для Debug и Release ? И можно теперь просто так дебажить Release в студии без того, чтобы аттачиться к процессу, и видеть при этом реальный ассемблерный код "настоящего" Release ? Иными словами, JIT уже не оптимизирует, а просто транслирует IL в коды ?


Отличается. Что бы дебажить релиз и видеть IL надо ставить мульку, которая декомпилит, здесь ничего не изменилось. Джыт по прежнему оптимизирует, в новой версии обещают даже оптимизацию хвостовой рекурсии.
Re[8]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 11.10.13 15:27
Оценка:
Здравствуйте, Ikemefula, Вы писали:

Тогда я не понял.

Вот это ты писал чуть выше

I>Здесь речь про компилятор — cs.exe. Раньше он был на плюсах. Сейчас на шарпе. Выхлоп(il) у него не хуже плюсового, т.е. с оптимизациями все сильно, при этом работает намного быстрее


А это сейчас.

I>Оптимизации кое какие делаются даже при компиляции в il. Насколкьо круто сделана эта часть,я не в курсе, выхлоп у обоих версий компилера по моему одинаковый.


Так кое-какие или же не хуже плюсового ? И что за 2 версии компилятора ? Или ты имел в виду Debug и Release ? Но тогда о какой оптимизации может идти речь, если выхлоп одинаковый ?
With best regards
Pavel Dvorkin
Re[9]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.13 15:31
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

I>>Оптимизации кое какие делаются даже при компиляции в il. Насколкьо круто сделана эта часть,я не в курсе, выхлоп у обоих версий компилера по моему одинаковый.


PD>Так кое-какие или же не хуже плюсового ? И что за 2 версии компилятора ? Или ты имел в виду Debug и Release ? Но тогда о какой оптимизации может идти речь, если выхлоп одинаковый ?


Две версии — старая, cs.exe, на С++, и новая, cs.exe, на C#. Новая выходит в следующем году.
Re[10]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 11.10.13 16:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Оптимизации кое какие делаются даже при компиляции в il. Насколкьо круто сделана эта часть,я не в курсе, выхлоп у обоих версий компилера по моему одинаковый.


PD>>Так кое-какие или же не хуже плюсового ? И что за 2 версии компилятора ? Или ты имел в виду Debug и Release ? Но тогда о какой оптимизации может идти речь, если выхлоп одинаковый ?


I>Две версии — старая, cs.exe, на С++, и новая, cs.exe, на C#. Новая выходит в следующем году.


Из 2013 студии Preview ? То есть она оптимизирует C# сама ?
With best regards
Pavel Dvorkin
Re[5]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 11.10.13 17:36
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ты забыл упомянуть, что он не производит никакой оптимизации, в отличие от нативного.


Он производит как минимум не меньше оптимизаций, чем нативная версия (на самом деле несколько больше, но подробности пока NDA).
Re[2]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 11.10.13 17:38
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Или я что-то не понял ?


Некоторые считают, что вменяемые в целом программисты могу ниасилить эту задачу.
Re[29]: собеседования, Реверс списка
От: Erop Россия  
Дата: 11.10.13 18:21
Оценка:
Здравствуйте, Ikemefula, Вы писали:


I>То есть, вся твоя мега идея "VirtualAlloc" заключается в том, что есть два хипа — для малых и больших объектов. Один управляется либой, второй — виндой.


Слушай, почитай, как виндовые кучи работают и как сишные Мои идеи тут вообще не при чём.
В целом, раз ты не в состоянии корректно общаться -- учись сам...

I>Ты так и не смог показать, где и чем тебе помогает VirtualAlloc

Ну я постепенно понял, что тебе я ничего показать не смогу. Засим закругляю безнадёжные попытки.

I>Я показал тебе самый минимальный случай фрагментации — всего два куска. Меньше просто не бывает. Если VirtualAlloc не может разрулить этот самый простой случай, значит, что он тебе ничем помочь в принципе не может.


Тем не менее, программы под виндой рабтают и проблем, вроде описанного тобой ужоса не имеют Чудо, как оно есть, только и всего.

I>Ты помоему так и не понял, что такое адресное пространство.

Зато ты не понял, почему работают нормальные программы под виндой и не падают по ООМ из-за фрагментации АП, в отличии от твоих поделей
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 12.10.13 06:02
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Даже в 2013 RTM компилятор старый, абсолютно идентичный тому, что в 2012. Если хочешь посмотреть новый — http://www.nuget.org/packages/Roslyn


Им планируется заменить старый ? Когда ? Или он просто будет как еще один ?

Вообще-то я, конечно, согласен — никаких причин нет, мешающих сделать оптимизирующий компилятор с C#, нет. Насчет качества оптимизации — посмотрим. C++ компилятор MS доводила два десятка лет. А есть еще ICC...
With best regards
Pavel Dvorkin
Re[13]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 12.10.13 22:21
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Им планируется заменить старый ?


Да.

PD> Когда ?


Скоро
Re[31]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 14:35
Оценка:
Здравствуйте, koodeer, Вы писали:

K>Ещё как падают. Многие программы на 32-битной Винде падают именно из-за фрагментации АП, хотя свободной памяти достаточно. Из известных таких программ могу назвать браузеры Chrome и Firefox.


Хром у меня и на Win7/x64 регулярно падает

Хотя, сейчас глянул, он у меня 32-х-битный в процессах висит. Странно, почему 64бита версия не поставилась. А она такая есть вообще?
Маньяк Робокряк колесит по городу
Re[32]: собеседования, Реверс списка
От: fddima  
Дата: 14.10.13 14:38
Оценка:
Здравствуйте, Marty, Вы писали:

M>Хром у меня и на Win7/x64 регулярно падает

M>Хотя, сейчас глянул, он у меня 32-х-битный в процессах висит. Странно, почему 64бита версия не поставилась. А она такая есть вообще?
64-х битной официальной пока что вроде нет. Но даже 32-х битная версия коли падает, то скорее всего из-за чего-то другого, а не памяти.
Re[10]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 14:55
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>http://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D0%BB%D0%BB%D0%B8%D0%BE%D0%BD


А ты что хотел сказать? Что у меня больше миллиона? Так я знаю, просто миллион отработал, я решил посмотреть, когда упадет, а файл переименовывать уже лень было.
Маньяк Робокряк колесит по городу
Re[33]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 14:57
Оценка:
Здравствуйте, fddima, Вы писали:

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


M>>Хром у меня и на Win7/x64 регулярно падает

M>>Хотя, сейчас глянул, он у меня 32-х-битный в процессах висит. Странно, почему 64бита версия не поставилась. А она такая есть вообще?
F> 64-х битной официальной пока что вроде нет. Но даже 32-х битная версия коли падает, то скорее всего из-за чего-то другого, а не памяти.

Сдается мне, что GDI ресурсы утекают у них, потому что когда хром падает, скайп пишет, что "Canvas does't allow drawing". Ну это так, дилетанский вывод вообщем
Маньяк Робокряк колесит по городу
Re[12]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 15:23
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Давай по порядку. Что ты хотел своим тестом показать? И что по твоему он показал?

Я не совсем понял, что Erop хотел сказать, но судя по тону фразы он сомневался, что в вектор можно последовательно добавить миллион char'ов. или это сарказм был
Тест же показал, что примерно 700 миллионов char'ов добавляются в конец без проблем.

EP>И сразу, чтобы два раза не писать — покажи свой результат для std::deque.

А самому слабо? Весь код есть

...
i = 1073740800
Char at random position: '3'


Даже не упало


#if !defined(_IOSTREAM_) && !defined(_STLP_IOSTREAM) && !defined(__STD_IOSTREAM__) && !defined(_CPP_IOSTREAM) && !defined(_GLIBCXX_IOSTREAM)
    #include <iostream>
#endif

#if !defined(_VECTOR_) && !defined(_STLP_VECTOR) && !defined(__STD_VECTOR__) && !defined(_CPP_VECTOR) && !defined(_GLIBCXX_VECTOR)
    #include <vector>
#endif

#if !defined(_DEQUE_) && !defined(_STLP_DEQUE) && !defined(__STD_DEQUE__) && !defined(_CPP_DEQUE) && !defined(_GLIBCXX_DEQUE)
    #include <deque>
#endif

#if !defined(_EXCEPTION_) && !defined(__EXCEPTION__) && !defined(_STLP_EXCEPTION) && !defined(__STD_EXCEPTION)
    #include <exception>
#endif

#if !defined(_STDEXCEPT_) && !defined(_STLP_STDEXCEPT) && !defined(__STD_STDEXCEPT) && !defined(_CPP_STDEXCEPT) && !defined(_GLIBCXX_STDEXCEPT)
    #include <stdexcept>
#endif

#ifndef WIN32_LEAN_AND_MEAN
    #define WIN32_LEAN_AND_MEAN
#endif

#ifndef STRICT
    #define STRICT
#endif

#if !defined(_WINDOWS_)
    #include <windows.h>
#endif



int main(int argc, char* argv[])
   {
    try{
        const int maxI = 1024*1024*1024;
        //std::vector<char> v;
        std::deque<char> v;
        for(int i=0; i!=maxI; ++i)
           {
            if (i && i%1024 == 0) std::cout<<"i = "<<i<<"\n";
            char ch = ' ' + (char)(i%64);
            //v.append(1, ch);
            v.push_back(ch);
           }
        std::cout<<"Char at random position: '"<<v[GetTickCount()%maxI]<<"'\n";

       }
    catch( const std::exception &e )
       {
        std::cout<<"Error: "<<e.what()<<"\n";
       }
    catch( ... )
       {
        std::cout<<"Error: unknown\n";
       }
    
    return 0;
   }
Маньяк Робокряк колесит по городу
Re[14]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 16:13
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Своим примером ты показал, что VirtualAlloc ничем не помогает, а помогает grow factor 1.5 и то, слабовато, т.е. все равно всё сдохло. То есть, все работает, как и должно.


Тут вообще-то другой случай, практически не относящийся к фрагментации
Вот тебе задачка: какого максимального размера удастся получить vector<char>, делая while(true) x.push_back('\0');, без всяких reserve, при grow factor 1.5 и при идеальной стратегии выделения памяти на x32 (учитывая 2GiB доступной памяти)?
Re[15]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 14.10.13 17:22
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Тут вообще-то другой случай, практически не относящийся к фрагментации

EP>Вот тебе задачка: какого максимального размера удастся получить vector<char>, делая while(true) x.push_back('\0');, без всяких reserve, при grow factor 1.5 и при идеальной стратегии выделения памяти на x32 (учитывая 2GiB доступной памяти)?

Это вроде как первый пример Marty , там нет никакого reserve и тд. Но вобще при grow factor 1.5 и идеальной стратегии должна выюзаться почти вся память.
Re[17]: собеседования, Реверс списка
От: vdimas Россия  
Дата: 14.10.13 17:34
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Тест в этом же треде с тобой не согласен — все дохнет как и должно быть Ты уже манагер, что ли ?


Не дохнет.
Re[15]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 14.10.13 17:46
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Своим примером ты показал, что VirtualAlloc ничем не помогает, а помогает grow factor 1.5 и то, слабовато, т.е. все равно всё сдохло. То есть, все работает, как и должно.


V>Ты утверждал, что все заткнется из-за дефрагментации, не?

V>И облажался, по результатам теста. Если в тесте после грубо 660 метров не удалось выделить память, то это значит, что всего было запрошено порядка 660*3=1980 метров. ЧТД.

А почему на три надо помножать, если добавляем по одному байту ?
Re[18]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 14.10.13 17:47
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Тест в этом же треде с тобой не согласен — все дохнет как и должно быть Ты уже манагер, что ли ?


V>Не дохнет.


Error: bad allocation


"не дохнет" это оно ?
Re[10]: собеседования, Реверс списка
От: vdimas Россия  
Дата: 14.10.13 17:47
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Эх, чОрт, не помог VirtualAlloc


Да вы, батенька, считать не умеете. ))
Re[11]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 14.10.13 17:52
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Да вы, батенька, считать не умеете. ))


Я честно говоря не в курсе, что там в vector происходит. Запрашивается всего 660мб, а внезапно это превращается в 1920
Re[9]: собеседования, Реверс списка
От: Erop Россия  
Дата: 14.10.13 18:47
Оценка:
Здравствуйте, Marty, Вы писали:

E>>ну, например, как ты думаешь, если вот тупо взять и написать на плюсах std::vector<char> и начать в него добавлять по одному, миллион символов добавить удостся?..


M>А ты этим что хотел доказать?


Я задал вопрос, я, например, думал и думаю, что метров до 100 можно не парится, потом могут начаться варианты...


M>Результат

M>
M>...
M>i = 689594368
M>i = 689595392
M>Error: bad allocation
M>



Дык о том и речь...
Жаль, что мы так и не услышали начальника транспортного цеха...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[19]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 19:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Если ты утверждаешь что это фрагментация, то попробуй сделать (или попроси Marty) тот же тест но добавив и v.reserve(1000*1000*680); в начало.

I>Конечно фрагментация, т.к. требуемый размер всей свободной памяти больше чем запрашиваемый.

У него не хватает памяти после примерно выделенного размера, когда уже произошло ~50 реаллокаций.
Так вот, раз ты говоришь что дальше ошибка из-за фрагментации — я предлагаю тебе заменить эти ~50 реаллокаций одним reserve'ом, и начать с этой точки, без фрагментации.
То есть у нас будет одна аллокация на 680MB, и мы будем делать push_back, который вызовет попытку реаллокации в не фрагментированной куче.
Re[16]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 19:21
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Тут вообще-то другой случай, практически не относящийся к фрагментации

EP>>Вот тебе задачка: какого максимального размера удастся получить vector<char>, делая while(true) x.push_back('\0');, без всяких reserve, при grow factor 1.5 и при идеальной стратегии выделения памяти на x32 (учитывая 2GiB доступной памяти)?

I>Это вроде как первый пример Marty , там нет никакого reserve и тд. Но вобще при grow factor 1.5 и идеальной стратегии должна выюзаться почти вся память.


grow factor=1.5, то есть после реаллокации capacity увеличивается в 1.5 раза.
Во время реаллокации в памяти находится и исходный storage, и новый, так как данные нужно перекинуть из одного места, в другое. Если данные посложнее char, то вызываются конструкторы копирования/перемещения, деструктятся старые объекты.
Это означает, что для реаллокации нам нужно всего 2.5x памяти от текущей capacity.
Для 2GB всего свободной памяти оценка сверху получается 2GB/2.5 = сколько посчитаешь сам, и сравнишь с тем что получилось у Marty.
Re[14]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 19:23
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Это был сарказм. Поэтому я и не понял к чему был твой тест в ответ на сообщение Erop'а.

Ну, если б это было серьезно сказано, то я Erop'а опроверг. А если сарказм, то я его мысль просто проиллюстрировал

EP>Что не удивительно, учитывая что у MSVC'шного вектора capacity растёт на 50%. То есть в момент реаллокации в памяти находится 2.5x от текущей capacity.


В этом случае падеж закономерен — адресного пространства 2Гб не хватает. Тут realloc мог бы помочь, Ikemefula про него был прав.

EP>Мне интересен был твой результат.

А чем интересен именно мой результат, а не любой другой результат, полученный тем же кодом?

Мой результат такой (код в конце):

Тупое выделение куска памяти и освобождение (тест возможности аллокации куска памяти максимального размера):
...
Try to reserve 1900000000 or more chars
Memory reserved
Char at random position: 'W'
Test passed
Try to reserve 2000000000 or more chars
Error: bad allocation


Тесты на фрагментацию

Заполнение вектора char по одному элементу (если увеличить лимиты, у меня выскакивает bad_alloc):
...
i = 649998336
i = 649999360
Char at random position: 'R'
V1 capacity: 689596368
V1 next allocation size prediction: 1034394552
V1 next allocation size prediction and currently allocated space: 1723990920


Заполнение вектора char по одному элементу, затем резервирование двойного размера (если увеличить лимиты, у меня выскакивает bad_alloc):
...
i = 439998464
i = 439999488
Char at random position: 'R'
V1 capacity: 459730912
Vector 2
Memory reserved
First copy added
Second copy added
Char at random position in vector 2: ')'
V2 capacity: 880010000
V1+V2 capacity: 1339740912


Вообщем, Ikemefula во многом прав, по крайней мере стандартный менеджер памяти от MSVS2005 не слишком хорош; также алгоритм резервирования памяти у вектора мог бы быть по-скромнее — начиная с какого-то лимита (например, 300мб на 32 битах) можно резервировать не 1.5, а 1.1, к примеру, а если достигаем 500мб — то можно хапать почти все оставшееся (ясно, что программа явно содержит один гигантский кусок данных, а остальное — мелочь в любом случае), не 1.1 — 1.5, а 2-3, а остатки на мелочь оставить.

Код (хидеры опустил)
void make_vector( int size )
{
    std::vector<char> v;
    std::cout<<"Try to reserve "<<size<<" or more chars\n";
    v.reserve(size);
    std::cout<<"Memory reserved\n";
    for(int i=0; i!=size; ++i)
       {
        //if (i && i%1024 == 0) std::cout<<"i = "<<i<<"\n";
        char ch = ' ' + (char)(i%64);
        v.push_back(ch);
       }
    std::cout<<"Char at random position: '"<<v[GetTickCount()%size]<<"'\n";
    std::cout<<"Test passed\n";
}


int main(int argc, char* argv[])
   {
    try{
        if (argc>2) 
           {
            make_vector(  450000000 );
            make_vector(  500000000 );
            make_vector(  600000000 );
            make_vector(  700000000 );
            make_vector(  800000000 );
            make_vector(  900000000 );
            make_vector( 1000000000 );
            make_vector( 1100000000 );
            make_vector( 1200000000 );
            make_vector( 1300000000 );
            make_vector( 1400000000 );
            make_vector( 1500000000 );
            make_vector( 1600000000 );
            make_vector( 1700000000 );
            make_vector( 1800000000 );
            make_vector( 1900000000 );
            make_vector( 2000000000 );
            make_vector( 2100000000 );
            make_vector( 2200000000 );
            make_vector( 2300000000 );
            make_vector( 2400000000 );
            make_vector( 2500000000 );
            make_vector( 2600000000 );
            make_vector( 2700000000 );
            make_vector( 2800000000 );
            make_vector( 2900000000 );
            make_vector( 3000000000 );
            return 0;
           }

        //const int maxI = 1024*1024*1024;
        const int maxI = argc>1 ? 440000000 : 650000000 ; 
        std::vector<char> v;
        //std::deque<char> v;
        for(int i=0; i!=maxI; ++i)
           {
            if (i && i%1024 == 0) std::cout<<"i = "<<i<<"\n";
            char ch = ' ' + (char)(i%64);
            v.push_back(ch);
           }
        std::cout<<"Char at random position: '"<<v[GetTickCount()%maxI]<<"'\n";
        std::cout<<"V1 capacity: "<<v.capacity()<<"\n";

        if (argc<2) 
           {
            std::cout<<"V1 next allocation size prediction: "<<(3*v.capacity()/2)<<"\n";
            std::cout<<"V1 next allocation size prediction and currently allocated space: "<<(3*v.capacity()/2 + v.capacity())<<"\n";
            return 0;
           }

        std::cout<<"Vector 2\n";
        std::vector<char> v2;
        v2.reserve(2*v.size()+10000);
        std::cout<<"Memory reserved\n";
        v2.insert(v2.end(), v.begin(), v.end());
        std::cout<<"First copy added\n";
        v2.insert(v2.end(), v.begin(), v.end());
        std::cout<<"Second copy added\n";
        std::cout<<"Char at random position in vector 2: '"<<v2[GetTickCount()%(2*maxI)]<<"'\n";
        std::cout<<"V2 capacity: "<<v2.capacity()<<"\n";
        std::cout<<"V1+V2 capacity: "<<(v.capacity()+v2.capacity())<<"\n";
       }
    catch( const std::exception &e )
       {
        std::cout<<"Error: "<<e.what()<<"\n";
       }
    catch( ... )
       {
        std::cout<<"Error: unknown\n";
       }
    
    return 0;
   }
Маньяк Робокряк колесит по городу
Re[16]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 19:27
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Своим примером ты показал, что VirtualAlloc ничем не помогает, а помогает grow factor 1.5 и то, слабовато, т.е. все равно всё сдохло. То есть, все работает, как и должно.

V>>Ты утверждал, что все заткнется из-за дефрагментации, не?
V>>И облажался, по результатам теста. Если в тесте после грубо 660 метров не удалось выделить память, то это значит, что всего было запрошено порядка 660*3=1980 метров. ЧТД.
I>А почему на три надо помножать, если добавляем по одному байту ?

Если добавляем по одному байту к capacity, то получаем квадратичную сложность Я даже видел такие реализации (но то был не vector)
Умножать на три нужно при grow factor = 2
Re[15]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 19:37
Оценка:
Здравствуйте, Marty, Вы писали:

Вышенаписанное вообщем-то подтверждает точку зрения Ikemefula, что некоторые менеджеры памяти для C++ не совсем совершенны. Но чтобы он не слишком радовался своей правоте, предлагаю ему привести аналогичные тесты его любимого языка с его любимым GC, чтобы было о чем дальше дискутировать.

PS Ну и да, менеджер от MSVS2005 (по крайней мере), не совершенен. Было бы круто, если бы была возможность у приложения при старте задавать ему хинты — типа мы будем использовать очень большой кусок памяти единовременно, а остатки используй на мелочевку. Ну или вообще — приложение же свое, для основной мега задачи резервируй сколько по максимуму, а крошки пусть ММ оставит на текущие расходы.
Маньяк Робокряк колесит по городу
Re[14]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 19:39
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Егор прочитал непойми где что "VirtualAlloc помогает". Объяснить, как именно помогает VirtualAlloc, он не смог, ограничился "Почитай Рихтера" и "читай как устроены хипы"


Я признаться, тоже не понял, как VirtualAlloc поможет. Тут скорее нужен свой аллокатор с использованием memory mapped files.

I>Своим примером ты показал, что VirtualAlloc ничем не помогает, а помогает grow factor 1.5 и то, слабовато, т.е. все равно всё сдохло. То есть, все работает, как и должно.

А ты покажи, как GC на раз решает проблемы
Маньяк Робокряк колесит по городу
Re[10]: собеседования, Реверс списка
От: Erop Россия  
Дата: 14.10.13 19:50
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Эх, чОрт, не помог VirtualAlloc


А чему он, по твоему, не помог?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 19:51
Оценка:
Здравствуйте, Marty, Вы писали:

EP>>Что не удивительно, учитывая что у MSVC'шного вектора capacity растёт на 50%. То есть в момент реаллокации в памяти находится 2.5x от текущей capacity.

M>В этом случае падеж закономерен — адресного пространства 2Гб не хватает. Тут realloc мог бы помочь, Ikemefula про него был прав.

Падение закономерно, потому что у тебя съедается практически вся доступная память, а не из-за фрагментации.

EP>>Мне интересен был твой результат.

M>А чем интересен именно мой результат, а не любой другой результат, полученный тем же кодом?

1. достаточно независимый
2. раз уже был один результат, не хотел вводить путаницу
3. показать лёгкость замены вектора на деку (которой afaik нет в стандартном .net'е)

M>Мой результат такой (код в конце):



M>Тесты на фрагментацию

M>Заполнение вектора char по одному элементу (если увеличить лимиты, у меня выскакивает bad_alloc):
M>
M>...
M>i = 649998336
M>i = 649999360
M>Char at random position: 'R'
M>V1 capacity: 689596368
M>V1 next allocation size prediction: 1034394552
M>V1 next allocation size prediction and currently allocated space: 1723990920
M>


Сделай тоже самое, но добавив в начало v.reserve(1000*1000*700) — и ты увидишь, что это не фрагментация.

M>Вообщем, Ikemefula во многом прав


В чём-то он прав. И в тех случаях где он действительно прав — я с ним согласен (пруф
Автор: Ikemefula
Дата: 11.10.13
).
Но в этом конкретном случае — он не прав, тут проблема не во фрагментации

M>по крайней мере стандартный менеджер памяти от MSVS2005 не слишком хорош; также алгоритм резервирования памяти у вектора мог бы быть по-скромнее — начиная с какого-то лимита (например, 300мб на 32 битах) можно резервировать не 1.5, а 1.1, к примеру, а если достигаем 500мб — то можно хапать почти все оставшееся (ясно, что программа явно содержит один гигантский кусок данных, а остальное — мелочь в любом случае), не 1.1 — 1.5, а 2-3, а остатки на мелочь оставить.


Допустим для x64 — ты какой бы порог взял? Для некоторых приложений 1.1 после 500MB было бы слишком тормозно.
А там где реально нужна экономия, всегда можно делать reserve вручную, с какой угодно стратегией.
Re[17]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 19:54
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Это вроде как первый пример Marty , там нет никакого reserve и тд. Но вобще при grow factor 1.5 и идеальной стратегии должна выюзаться почти вся память.

Неправильный ответ.

EP>Это означает, что для реаллокации нам нужно всего 2.5x памяти от текущей capacity.

EP>Для 2GB всего свободной памяти оценка сверху получается 2GB/2.5 = сколько посчитаешь сам, и сравнишь с тем что получилось у Marty.

Правильный ответ.
Если быть точным, у меня 650Мб получилось против теоретических 800, но это погрешности. Но тут еще зависит от изначального размера, от которого потом grow идет — т.е если сейчас 650мб текущего размера требует для переаллокации 975мб непрерывного куска и 1625мб памяти всего, то если бы было на последнем шаге 600 — 600*1.5+600 = 1500 — данных влезло бы на 900мб.

А вообще, было бы круто, если бы аллокаторы поддерживали изменение grow factor, и его можно было бы поменять через интерфейс контейнера. Что ни говори, а 32 бита еще не скоро сойдут с дистанции, а объемы данных растут постоянно. Закиньте что ли предложение в комитет
Маньяк Робокряк колесит по городу
Re[15]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 20:01
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Своим примером ты показал, что VirtualAlloc ничем не помогает, а помогает grow factor 1.5 и то, слабовато, т.е. все равно всё сдохло. То есть, все работает, как и должно.


V>Ты утверждал, что все заткнется из-за дефрагментации, не?

V>И облажался, по результатам теста. Если в тесте после грубо 660 метров не удалось выделить память, то это значит, что всего было запрошено порядка 660*3=1980 метров. ЧТД.

Ты тут не прав
660 метров занято. Если grow 1.5 — требуется еще один непрерывный кусок ~1Гб; вместе с уже аллоцированным — 1.6-1.7Гб, но это два куска, это максимум расхода памяти в процессе переалокации; после реаллока будет занято 1Гб. Ну и если при занятом куске в 660Мб нет места для цельного куска 1Гб — память таки да, фрагментирована, при том, что под данные у Win32 процесса обычно есть честные 2Гб.
Маньяк Робокряк колесит по городу
Re[17]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 20:11
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

M>> Вышенаписанное вообщем-то подтверждает точку зрения Ikemefula, что некоторые менеджеры памяти для C++ не совсем совершенны.


EP>В твоём примере как раз видно, что если и есть фрагментация, то мизерная. Теоретический потолок — 2GiB/2.5, причём это без dll'ек, без стэка и т.п.

EP>Посмотри, например, по каким адресам у тебя dll'ки загрузились, куда .exe, где стэк находится и т.п

Мизер не мизер, но память делит как минимум на две половины, из которых целое не склеить. Стек — да, он скорее всего однозначно в АП пользовательских данных процесса. По поводу dll-ек — утверждать ничего не буду, но они разве не в другие 2Гб АП грузятся? Или те 2Гб только на нужды ядра и user-space dll там не селятся? Тогда да, надо бы пройтись еще по dll-кам процесса, где они лежат и чье место на самом деле занимают.
Но мне это делать лень Я свою задачу выполнил — подкинул на вентилятордал повод для дальнейших исследований и поисков истины уж простите, но дискуссия интересная, да и давно я в проф. форуме не обозначался
Маньяк Робокряк колесит по городу
Re[15]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 14.10.13 20:19
Оценка:
Здравствуйте, Marty, Вы писали:

I>>Своим примером ты показал, что VirtualAlloc ничем не помогает, а помогает grow factor 1.5 и то, слабовато, т.е. все равно всё сдохло. То есть, все работает, как и должно.

M>А ты покажи, как GC на раз решает проблемы

Это не интересно, как GC перемещает объекты. Интереснее, как можно выделить 20мб и при этом GC не сможет выделить ни байта, хотя свободной памяти будет ажно 20гб
Re[16]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 20:41
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


EP>>>Что не удивительно, учитывая что у MSVC'шного вектора capacity растёт на 50%. То есть в момент реаллокации в памяти находится 2.5x от текущей capacity.

M>>В этом случае падеж закономерен — адресного пространства 2Гб не хватает. Тут realloc мог бы помочь, Ikemefula про него был прав.

EP>Падение закономерно, потому что у тебя съедается практически вся доступная память, а не из-за фрагментации.

Да, но realloc, который при 1.5 grow factor требует только того, чтобы сразу за 1 используемой памяти было доступно еще 0.5, не упал бы. Тут нужен оператор renew Напишите кто-нибудь в комитет


EP>>>Мне интересен был твой результат.

M>>А чем интересен именно мой результат, а не любой другой результат, полученный тем же кодом?

EP>1. достаточно независимый

EP>2. раз уже был один результат, не хотел вводить путаницу
Ок

EP>3. показать лёгкость замены вектора на деку (которой afaik нет в стандартном .net'е)

Дека не гарантирует непрерывности куска памяти, а вектор гарантирует. В данном случае деке пофигу, но если непрерывность критична (насчет .Net не знаю) — то ой.

M>>Мой результат такой (код в конце):



M>>Тесты на фрагментацию

M>>Заполнение вектора char по одному элементу (если увеличить лимиты, у меня выскакивает bad_alloc):
EP>Сделай тоже самое, но добавив в начало v.reserve(1000*1000*700) — и ты увидишь, что это не фрагментация.
А что это? первый тест не смог 2Гб выделить, но 1.9Гб одним куском — смог. Впрочем — да, наверно просто не хватает места на переаллокацию. Но reserve в начале просто вычеркнет этот тест из тестов на фрагментацию, и впишет его в тесты на макс объем доступной памяти из п.1.

M>>Вообщем, Ikemefula во многом прав


EP>В чём-то он прав. И в тех случаях где он действительно прав — я с ним согласен (пруф
Автор: Ikemefula
Дата: 11.10.13
).

Лень смотреть потом гляну.

EP>Но в этом конкретном случае — он не прав, тут проблема не во фрагментации

Да, скорее не во фрагментации, чем во фрагментации.

M>>по крайней мере стандартный менеджер памяти от MSVS2005 не слишком хорош; также алгоритм резервирования памяти у вектора мог бы быть по-скромнее — начиная с какого-то лимита (например, 300мб на 32 битах) можно резервировать не 1.5, а 1.1, к примеру, а если достигаем 500мб — то можно хапать почти все оставшееся (ясно, что программа явно содержит один гигантский кусок данных, а остальное — мелочь в любом случае), не 1.1 — 1.5, а 2-3, а остатки на мелочь оставить.


EP>Допустим для x64 — ты какой бы порог взял? Для некоторых приложений 1.1 после 500MB было бы слишком тормозно.

Ну, для 64 бит пока вроде не проблемы фрагментации АП как класса задач А для 32 — да, тормозно, но ковыляло бы

EP>А там где реально нужна экономия, всегда можно делать reserve вручную, с какой угодно стратегией.

Сейчас запустил тест с reserve и проверкой capcity — пока не закончился, но предполагаю, что capcity будет больше reserve. Результат отпишу чуть позже
Маньяк Робокряк колесит по городу
Re[17]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 20:56
Оценка:
Здравствуйте, Marty, Вы писали:

EP>>>>Что не удивительно, учитывая что у MSVC'шного вектора capacity растёт на 50%. То есть в момент реаллокации в памяти находится 2.5x от текущей capacity.

M>>>В этом случае падеж закономерен — адресного пространства 2Гб не хватает. Тут realloc мог бы помочь, Ikemefula про него был прав.
EP>>Падение закономерно, потому что у тебя съедается практически вся доступная память, а не из-за фрагментации.
M>Да, но realloc, который при 1.5 grow factor требует только того, чтобы сразу за 1 используемой памяти было доступно еще 0.5, не упал бы. Тут нужен оператор renew Напишите кто-нибудь в комитет

Почему бы и нет

EP>>3. показать лёгкость замены вектора на деку (которой afaik нет в стандартном .net'е)

M>Дека не гарантирует непрерывности куска памяти, а вектор гарантирует. В данном случае деке пофигу, но если непрерывность критична (насчет .Net не знаю) — то ой.

Непрерывность вектора действительно иногда бывает полезна сама по себе. Но чаще она полезна просто как самый быстрый кусок данных.
Ikemefula вроде говорил что у него где-то на .net с vector-like были проблемы, да причём такие, что он теперь векторов как огня боится. Вот я и удивляюсь — почему в .net нет стандартной деки (или всё-таки есть?).

M>>>Мой результат такой (код в конце):


M>>>Тесты на фрагментацию

M>>>Заполнение вектора char по одному элементу (если увеличить лимиты, у меня выскакивает bad_alloc):
EP>>Сделай тоже самое, но добавив в начало v.reserve(1000*1000*700) — и ты увидишь, что это не фрагментация.
M>А что это? первый тест не смог 2Гб выделить, но 1.9Гб одним куском — смог. Впрочем — да, наверно просто не хватает места на переаллокацию.

Это возможность убрать ~49 первых реаллокаций и убедится что дело не в них. (с обсуждения этих реаллокаций как раз и начинался этот топик)

M>>>по крайней мере стандартный менеджер памяти от MSVS2005 не слишком хорош; также алгоритм резервирования памяти у вектора мог бы быть по-скромнее — начиная с какого-то лимита (например, 300мб на 32 битах) можно резервировать не 1.5, а 1.1, к примеру, а если достигаем 500мб — то можно хапать почти все оставшееся (ясно, что программа явно содержит один гигантский кусок данных, а остальное — мелочь в любом случае), не 1.1 — 1.5, а 2-3, а остатки на мелочь оставить.

EP>>Допустим для x64 — ты какой бы порог взял? Для некоторых приложений 1.1 после 500MB было бы слишком тормозно.
M>Ну, для 64 бит пока вроде не проблемы фрагментации АП как класса задач А для 32 — да, тормозно, но ковыляло бы

Я думал мы тут уже не об фрагментации говорим, а об свободной памяти — она ведь не бесконечна. И точно такая же проблема возможна и на x64, кстати, как раз потому, что дело не во фрагментации.
Re[19]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 20:57
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

M>>>> Вышенаписанное вообщем-то подтверждает точку зрения Ikemefula, что некоторые менеджеры памяти для C++ не совсем совершенны.

EP>>>В твоём примере как раз видно, что если и есть фрагментация, то мизерная. Теоретический потолок — 2GiB/2.5, причём это без dll'ек, без стэка и т.п.
EP>>>Посмотри, например, по каким адресам у тебя dll'ки загрузились, куда .exe, где стэк находится и т.п
M>>Мизер не мизер, но память делит как минимум на две половины, из которых целое не склеить.

EP>Это не фрагментация.

EP>Фрагметация — это пример который приводил Ikemefula раньше — там где посредине АП есть что-то небольшое, что мешает выделить большой кусок.
Я вроде под фрагментацией тоже самое и подразумеваю. Или не?

EP>Тут же просто нехватка памяти. Если бы те ~50 аллокаций что были у тебя действительно фрагментировали бы кучу — то аллокация сфейлилась бы гораздо раньше.

Вопрос насколько они кучу сфрагментировали, может совсем чуть-чуть, только в серединке

M>>Стек — да, он скорее всего однозначно в АП пользовательских данных процесса. По поводу dll-ек — утверждать ничего не буду, но они разве не в другие 2Гб АП грузятся? Или те 2Гб только на нужды ядра и user-space dll


EP>На MSVC2010SP1x32 (не знаю что там у тебя) самый низкий адрес у msvcp100.dll — 0x664C0000. Верх .exe'шника — 0x00A27000. ESP = 0x0140FBC0.

EP>Разница между msvcp100.dll и ESP ~ 1695MB (мегабайт, не мебибайт). Делим на 2.5: 678 MB — что-то знакомое
Я писал, у меня MSVC2005, но думаю, особых изменений с тех пор не было.

Ок, похоже на правду Как бы прошу заметить, что я тут независимое расследование провожу, так что попрошу без подxyzколок
Маньяк Робокряк колесит по городу
Re[2]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 14.10.13 21:08
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>
PD>...
PD>


какой ужасный код.
In Zen We Trust
Re[18]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 21:12
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Почему бы и нет

capcityТак и я о том же Тту вроде есть ребята, которые с комитетом общаются, думаю, они и эту флудильню проглядывают. Я-то как-то с комитетом не накоротке ;(

M>>Дека не гарантирует непрерывности куска памяти, а вектор гарантирует. В данном случае деке пофигу, но если непрерывность критична (насчет .Net не знаю) — то ой.


EP>Непрерывность вектора действительно иногда бывает полезна сама по себе. Но чаще она полезна просто как самый быстрый кусок данных.

EP>Ikemefula вроде говорил что у него где-то на .net с vector-like были проблемы, да причём такие, что он теперь векторов как огня боится. Вот я и удивляюсь — почему в .net нет стандартной деки (или всё-таки есть?).
Ну, я начало уже не помню, я встрял, когда спор достиг определенного накала

M>>>>Мой результат такой (код в конце):


EP>Это возможность убрать ~49 первых реаллокаций и убедится что дело не в них. (с обсуждения этих реаллокаций как раз и начинался этот топик)

См. выше
Я влез на разборках по фрагментации.
Мой тест #1 сказал, что можно выделить одномоменто в свежей программе 1900Мб. Ты этот момент пролистал не глядя?
Не совсем понял, как одномоментная аллокация памяти поможет опровергнуть гипотезу, что фрагментация мешает?

EP>>>Допустим для x64 — ты какой бы порог взял? Для некоторых приложений 1.1 после 500MB было бы слишком тормозно.

M>>Ну, для 64 бит пока вроде не проблемы фрагментации АП как класса задач А для 32 — да, тормозно, но ковыляло бы

EP>Я думал мы тут уже не об фрагментации говорим, а об свободной памяти — она ведь не бесконечна. И точно такая же проблема возможна и на x64, кстати, как раз потому, что дело не во фрагментации.

Ну, кто о чем, я о фрагментации вроде
На 64х битах можно в 99.9(9)% задач говорить о бесконечной памяти (вернее, о бесконечном АП), и проблема фрагментации тут не стоит.
Маньяк Робокряк колесит по городу
Re[20]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 21:34
Оценка:
Здравствуйте, Marty, Вы писали:

M>>>>> Вышенаписанное вообщем-то подтверждает точку зрения Ikemefula, что некоторые менеджеры памяти для C++ не совсем совершенны.

EP>>>>В твоём примере как раз видно, что если и есть фрагментация, то мизерная. Теоретический потолок — 2GiB/2.5, причём это без dll'ек, без стэка и т.п.
EP>>>>Посмотри, например, по каким адресам у тебя dll'ки загрузились, куда .exe, где стэк находится и т.п
M>>>Мизер не мизер, но память делит как минимум на две половины, из которых целое не склеить.
EP>>Это не фрагментация.
EP>>Фрагметация — это пример который приводил Ikemefula раньше — там где посредине АП есть что-то небольшое, что мешает выделить большой кусок.
M>Я вроде под фрагментацией тоже самое и подразумеваю. Или не?

Ты про что именно?

EP>>Тут же просто нехватка памяти. Если бы те ~50 аллокаций что были у тебя действительно фрагментировали бы кучу — то аллокация сфейлилась бы гораздо раньше.

M>Вопрос насколько они кучу сфрагментировали, может совсем чуть-чуть, только в серединке

Они-то могли и сильно сфрагментировать, но твой первый пример, за который уцепился Ikemefula, этого не показывал.
Re[19]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 14.10.13 21:46
Оценка:
Здравствуйте, Marty, Вы писали:

EP>>Это возможность убрать ~49 первых реаллокаций и убедится что дело не в них. (с обсуждения этих реаллокаций как раз и начинался этот топик)

M>См. выше
M>Я влез на разборках по фрагментации.
M>Мой тест #1 сказал, что можно выделить одномоменто в свежей программе 1900Мб. Ты этот момент пролистал не глядя?
M>Не совсем понял, как одномоментная аллокация памяти поможет опровергнуть гипотезу, что фрагментация мешает?

Речь про самый первый пример. Если в него добавить reserve — это не будет единственной аллокацией, так как там дальше идёт цикл push_back'ов.
И если с предварительным reserve'ом в ~690MB, он не сможет сделать аллокацию при следующем capacity grow — то это будет означать что пример не годится для демонстрации фрагментации.
+ желательно вывести адрес первого reserve'а, чтобы убедится что этот кусок не по середине (у меня он начинается где-то в районе первых 20MB)

EP>>>>Допустим для x64 — ты какой бы порог взял? Для некоторых приложений 1.1 после 500MB было бы слишком тормозно.

M>>>Ну, для 64 бит пока вроде не проблемы фрагментации АП как класса задач А для 32 — да, тормозно, но ковыляло бы
EP>>Я думал мы тут уже не об фрагментации говорим, а об свободной памяти — она ведь не бесконечна. И точно такая же проблема возможна и на x64, кстати, как раз потому, что дело не во фрагментации.
M>Ну, кто о чем, я о фрагментации вроде
M>На 64х битах можно в 99.9(9)% задач говорить о бесконечной памяти (вернее, о бесконечном АП), и проблема фрагментации тут не стоит.

Допустим есть 10GiB свободной памяти, до куда примерно дорастёт вектор на push_back'ах, при 1.5x capacity grow rate?
Re[16]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 22:55
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>А почему на три надо помножать, если добавляем по одному байту ?


vdimas ошибся, помножать надо на меньшее, но это просто в stl такая стратегия к выделению памяти — при невозможности добавить элемент выделяется память N*k, где N — размер исходного множества, k — некий коэффициент, выбранный эмпирически, вроде это 1.5 обычно. Но памяти нужно при этом 2.5, так как 1 занят исходными данными.
Маньяк Робокряк колесит по городу
Re[21]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 22:57
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


M>>Я вроде под фрагментацией тоже самое и подразумеваю. Или не?


EP>Ты про что именно?


Ну, вроде пока про фрагментацию памяти, но уже не совсем уверен

EP>>>Тут же просто нехватка памяти. Если бы те ~50 аллокаций что были у тебя действительно фрагментировали бы кучу — то аллокация сфейлилась бы гораздо раньше.

M>>Вопрос насколько они кучу сфрагментировали, может совсем чуть-чуть, только в серединке

EP>Они-то могли и сильно сфрагментировать, но твой первый пример, за который уцепился Ikemefula, этого не показывал.

Ну, а я то тут при чем?
Маньяк Робокряк колесит по городу
Re[16]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.10.13 23:39
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Своим примером ты показал, что VirtualAlloc ничем не помогает, а помогает grow factor 1.5 и то, слабовато, т.е. все равно всё сдохло. То есть, все работает, как и должно.

M>>А ты покажи, как GC на раз решает проблемы

I>Это не интересно, как GC перемещает объекты. Интереснее, как можно выделить 20мб и при этом GC не сможет выделить ни байта, хотя свободной памяти будет ажно 20гб


Ну это level 2, так то. Твой GC level 1 проходит?
Даешь примеры, когда GC уделывает стандартный MSVS2005 runtime heap manager!
Маньяк Робокряк колесит по городу
Re[16]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 15.10.13 00:34
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Не факт. Периодически или же при невозможности найти подходящий непрерывный кусок памяти менеджер хипа занимается поиском и склейкой прилегающих пустых областей.


Это где такое? В CLR для LOH этого пока нет, а в С++ это просто невозможно без замены ссылок на спецконструкции, которые можно отслеживать. Или речь про склейку прилегающих блоков? Если последнее, то это не спасает.

V>В общем, если будешь добавлять по 1-му символу в сишный вектор, то ничего военного не произойдет. Никакой дефрагментации. Освобождаемые предыдущие блоки памяти будут представлять собой непрерывный кусок незанятого места.


Это только если такая работа — единственная активность в процессе.
Re[16]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 15.10.13 00:44
Оценка:
Здравствуйте, Marty, Вы писали:

M> Вышенаписанное вообщем-то подтверждает точку зрения Ikemefula, что некоторые менеджеры памяти для C++ не совсем совершенны. Но чтобы он не слишком радовался своей правоте, предлагаю ему привести аналогичные тесты его любимого языка с его любимым GC, чтобы было о чем дальше дискутировать.


Я так понимаю, примерно 100% вновь присоединившихся чуть выше по нитке даже не читают. Тогда напомню тебе, что речь изначально шла про проблемы именно в дотнете, а про С++ разговор зашел, потому что Ероп начал рассказывать, что в С++ таких проблем нет.
Re[17]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.10.13 00:52
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

M>> Вышенаписанное вообщем-то подтверждает точку зрения Ikemefula, что некоторые менеджеры памяти для C++ не совсем совершенны. Но чтобы он не слишком радовался своей правоте, предлагаю ему привести аналогичные тесты его любимого языка с его любимым GC, чтобы было о чем дальше дискутировать.


НС>Я так понимаю, примерно 100% вновь присоединившихся чуть выше по нитке даже не читают. Тогда напомню тебе, что речь изначально шла про проблемы именно в дотнете, а про С++ разговор зашел, потому что Ероп начал рассказывать, что в С++ таких проблем нет.


Ну да, плюс-минус, но 100% не читают

Т.е. в дотнете проблемы есть, в плюсах нет?
о чем речь шла изначально, факт на лице, как говорят.
Маньяк Робокряк колесит по городу
Re[18]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 15.10.13 00:54
Оценка:
Здравствуйте, Marty, Вы писали:

M>Т.е. в дотнете проблемы есть, в плюсах нет?


Проблемы есть и там и там. В дотнете их чуть меньше, потому что фрагментирует память только LOH, остальные кучи дефрагментируются.

M> о чем речь шла изначально, факт на лице, как говорят.


Изначально речь шла о том, что при развороте большого односвязного списка загонять его в List — можно получить проблемы с фрагментацией.
Re[17]: собеседования, Реверс списка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.10.13 02:20
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>3. показать лёгкость замены вектора на деку (которой afaik нет в стандартном .net'е)


НС>Есть. LinkedList называется.


Может LinkedList есть, а легкости замены нет? ж)
Маньяк Робокряк колесит по городу
Re[17]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 02:24
Оценка:
Здравствуйте, Marty, Вы писали:

M>Ну ты бывало мне уже доказывал, что я не прав, когда я был 100% уверен что я прав

M>Но тут ты точно не прав

Ну всё бывает...

M>VA, если я не ошибаюсь, возвращает адрес (в АП процесса) для запрошенного куска памяти. Она может не коммитить, а только резервировать физическую память (или не?). Но как VA может помочь с проблемой фрагментации АП, я как говорится, не догоняю.


Всё так, а помогает он потому, что это такой ОТДЕЛЬНЫЙ аллокатор для больших блоков АП, используемый для этой цели ВСЕМИ аллокаторами в программе.
Виндовые кучи используют такую политику, и с-рантаймовская, тоже, так что авторам всех остальных аллакаторов под винду, тоже стоит ей следовать. Для мне удивительно будет, если окажется, что дотнетовский аллокатор так не делает.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 15.10.13 05:30
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Лол, сейчас неосилятор ссылок расскажет нам всем, как нужно писать код.


каких ссылок?
In Zen We Trust
Re[17]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 06:07
Оценка:
Здравствуйте, Marty, Вы писали:

M>Ну это level 2, так то. Твой GC level 1 проходит?


Не понял вопроса.

M>Даешь примеры, когда GC уделывает стандартный MSVS2005 runtime heap manager!


Посмотри в статьях прямо на этом сайте.
Re[17]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 15.10.13 07:12
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>3. показать лёгкость замены вектора на деку (которой afaik нет в стандартном .net'е)

НС>Есть. LinkedList называется.

И random access у него O(1), как и у деки?
LinkedList это аналог std::list, но никак не std::deque
У деки random access, push_back и push_front константные, причём она достаточно cache-friendly в отличии от std::list, так как де-факто реализуется как набор больших chunk'ов.
Re[18]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 07:52
Оценка:
Здравствуйте, Marty, Вы писали:

M>А вообще, было бы круто, если бы аллокаторы поддерживали изменение grow factor, и его можно было бы поменять через интерфейс контейнера. Что ни говори, а 32 бита еще не скоро сойдут с дистанции, а объемы данных растут постоянно. Закиньте что ли предложение в комитет


Дык в С++ таки есть возможность вообще свой аллокатор заюзать. Но там есть архитектурный дефект, который никто не думает чинить. Дефект такой, что часто бывает так, что аллокатору вовсе и не все размеры блоков одинаково удобны, и если бы стандартные контейнеры умели бы спрашивать у аллокатора, скока там памяти мона взять легко, то было бы на-а-амного прикольнее.

Но в любом случае, надеяться, что тебе отдадут в рамках контейнера и аллокатора общего назначения 25% АП, или даже больше -- IMHO, черезмерный оптимизм. Тут надо что-то иное делать, в рамках С++ дешевле всего уйти на дек или на какой-то самописный контейнер.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[16]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 07:54
Оценка:
Здравствуйте, Marty, Вы писали:


M>при том, что под данные у Win32 процесса обычно есть честные 2Гб.


Под данные, стеки нитей, код, ресурсы и прочие нужды...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[20]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 07:59
Оценка:
Здравствуйте, Marty, Вы писали:

M>Ок, похоже на правду Как бы прошу заметить, что я тут независимое расследование провожу, так что попрошу без подxyzколок



Лично я без подколок, просто делюсь результатами аналогичных исследований и последующего чтения...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[17]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 08:05
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Это где такое? В CLR для LOH этого пока нет, а в С++ это просто невозможно без замены ссылок на спецконструкции, которые можно отслеживать. Или речь про склейку прилегающих блоков? Если последнее, то это не спасает.


В С++ под виндой двигать блоки, что бы бороться с фрагментацией -- тупиковый путь, так как пересылки память-память очень дороги, а пересылки своп-своп дороги бесконечно
Так что практической ценности такое поведение не имело бы. Кстати, 16-битная винда что-то такое умела с глобальной памятью делать, но оно всё умерло, так как тормоза нереальные.

Но если на скорость плевать и главное, что бы хоть как-то, но работало, то почему бы нет? Только я не уверен, что даже для С# это главное
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[19]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 08:14
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Изначально речь шла о том, что при развороте большого односвязного списка загонять его в List — можно получить проблемы с фрагментацией.


Ну, как бы, если мы про список в сотню миллионов членов, то там тока на указателях оверхеда будет 400 метров...
А если про миллион членов, то я не верю, что сфейлится,..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[19]: собеседования, Реверс списка
От: vdimas Россия  
Дата: 15.10.13 09:20
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>

I>Error: bad allocation


I>"не дохнет" это оно ?


Дык, область в 2 гига кончилась. Как и должно быть. 680*3=x. )))
Re[17]: собеседования, Реверс списка
От: vdimas Россия  
Дата: 15.10.13 09:32
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Это только если такая работа — единственная активность в процессе.


Коль речь о больших объемах памяти, то в любом случае это так и для дотнета и для нейтива.

Можно, конечно, выделить "до упора" много относительно небольших блоков, а затем вернуть обратно только каждый второй из них. Тогда, ес-но, никакая склейка не поможет. Именно поэтому большие массивы объектов в плюсах располагают или по-значению, или в своих страничных аллокаторах, где размер страницы на порядки больше размера одного объекта.

Как пример boost::pool. Хотя и до него подобный вид аллокаторов — самый что ни на есть популярный в плюсах. Самое главное — он на заметно эффективнее даже управляемого GC. Вряд ли ты найдешь сейчас хоть одну плюсовую контору, где бы не использовали страничные аллокаторы и пулы объектов на них.
Re[21]: собеседования, Реверс списка
От: Sinix  
Дата: 15.10.13 10:07
Оценка:
Здравствуйте, Erop, Вы писали:

E>И снова никакой конкретики. До скольки метров буфера типичного листа в программе ещё можно не парится о фрагментации АП?

Я ж говорю — it depends. Если поставить цель, то исчерпание LOH под x86 наступит после аллокации <1 гб мусора, достаточно чтобы не было свободных фрагментов

Fail: VM: 1845Mb, chunks:848, allocated 848Mb

  code
        private static void Main(string[] args)
        {
            const int AllocSize = 1024 * 1024;
            const int AllocCount = 1500;
            var currentProcess = Process.GetCurrentProcess();
            List<byte[]> allocated = new List<byte[]>(AllocCount);
            bool ok = false;
            try
            {
                for (int i = 0; i < AllocCount; i++)
                {
                    byte[] temp = new byte[AllocSize + i];

                    byte[] data = new byte[AllocSize + i];
                    allocated.Add(data);

                    GC.KeepAlive(temp);
                }
                ok = true;
            }
            catch (OutOfMemoryException)
            {
                Console.WriteLine(
                    "Fail: VM: {0}Mb, chunks:{1}, allocated {2}Mb",
                    currentProcess.VirtualMemorySize64 / 1024 / 1024,
                    allocated.Count,
                    AllocatedTotal(allocated) / 1024 / 1024);
            }
            if (ok)
            {
                Console.WriteLine(
                    "Allocated: VM: {0}Mb, chunks:{1}, allocated {2}Mb",
                    currentProcess.VirtualMemorySize64 / 1024 / 1024,
                    allocated.Count,
                    AllocatedTotal(allocated) / 1024 / 1024);
            }
            GC.KeepAlive(allocated);

            Console.ReadKey();
        }
        static long AllocatedTotal(List<byte[]> allocated)
        {
            return allocated.Sum(a => (long)a.Length);
        }


Если не извращаться и не грузить аллокатор (заменяем "new byte[AllocSize + i]" на "new byte[AllocSize]") —
Allocated: VM: 1965Mb, chunks:1500, allocated 1500Mb


Поскольку при нужде в гигабайтах клиенты (как правило) уже на x64 — беспокоиться стоит не столько о самой фрагментации, сколько о производительности и нагрузке на GC.

P.S. Насчёт минуса за "исчерпание max_size()" — а что, stxxl::vector уже отменили?
Re[16]: собеседования, Реверс списка
От: vdimas Россия  
Дата: 15.10.13 10:40
Оценка:
Здравствуйте, Marty, Вы писали:

V>>Ты утверждал, что все заткнется из-за дефрагментации, не?

V>>И облажался, по результатам теста. Если в тесте после грубо 660 метров не удалось выделить память, то это значит, что всего было запрошено порядка 660*3=1980 метров. ЧТД.

M>Ты тут не прав

M>660 метров занято. Если grow 1.5

Можно явно переопределить один метод и получить любой grow factor.

Даже если не прав, то не сильно: 3 vs 2.5. Учитывая, что к процессу могут быть приаттачены DLL каждая со своим хипом памяти...
Re[22]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 11:03
Оценка:
Здравствуйте, Sinix, Вы писали:

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


E>>И снова никакой конкретики. До скольки метров буфера типичного листа в программе ещё можно не парится о фрагментации АП?

S>Я ж говорю — it depends. Если поставить цель, то исчерпание LOH под x86 наступит после аллокации <1 гб мусора, достаточно чтобы не было свободных фрагментов

Если поставить цель, то LOH исчерпается на 20мб
Re[12]: собеседования, Реверс списка
От: vdimas Россия  
Дата: 15.10.13 11:19
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

M>>А по существу — с мыслью, обозначенной чуть выше без сарказма, я вполне согласен. Мои тесты на скорую руку вроде показывают, что не парится можно примерно до 500мб

НС>Это покуда у тебя тесты. А как реальное приложение с кучей разных активностей, да если оно еще и многопоточное, то печаль начинается от объемов на порядок ниже.

Возможно... Но мне даже трудно представить задачу, когда нам нужно десятки/сотни миллионов элементов в линейном массиве.
Re[21]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 15.10.13 11:20
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>

I>>>Error: bad allocation

I>>>"не дохнет" это оно ?
V>>Дык, область в 2 гига кончилась. Как и должно быть. 680*3=x. )))
I>Протри глаза — 3 никак не может быть. Куда делось АП ?

В GCC grow factor как раз 2, так что на реаллокации получается 3x
Re[13]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 11:53
Оценка:
Здравствуйте, vdimas, Вы писали:

M>>>А по существу — с мыслью, обозначенной чуть выше без сарказма, я вполне согласен. Мои тесты на скорую руку вроде показывают, что не парится можно примерно до 500мб

НС>>Это покуда у тебя тесты. А как реальное приложение с кучей разных активностей, да если оно еще и многопоточное, то печаль начинается от объемов на порядок ниже.

V>Возможно... Но мне даже трудно представить задачу, когда нам нужно десятки/сотни миллионов элементов в линейном массиве.


Не нужно ни десятков, ни сотен, часто хватает и 100 тыс и даже менее. LOH очень часто сильно ограничен в размере по естетсвенным причинам. Имеющиеся дыры в нем как правило небольшого размера. Вроде есть десяток хипов LOH, суммарно это 160 мб, что очень много вообще говоря, но в каждом из хипов непрерывного участка будет не более 10мб а то и меньше.
Для хештейблов например это вообще ни о чем.
Re[22]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 11:54
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Протри глаза — 3 никак не может быть. Куда делось АП ?


EP>В GCC grow factor как раз 2, так что на реаллокации получается 3x


Шота я не пойму, grow factor меняется в зависимости от требуемого аргумента — то 1.5, то 2
Re[23]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 15.10.13 13:27
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Протри глаза — 3 никак не может быть. Куда делось АП ?

EP>>В GCC grow factor как раз 2, так что на реаллокации получается 3x
I>Шота я не пойму, grow factor меняется в зависимости от требуемого аргумента — то 1.5, то 2

grow factor может быть разным в разных реализациях. В исходном примере торчат следы как MSVC(много), так и GCC(мало).
И нет ничего трагичного в том, что vdimas назвал цифру соответствующую GCC, а не MSVC — это не так сильно влияет на пример
Re[17]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 13:28
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>То есть, VirtualAlloc никак не помогает. Ровно тот же результат можно получить если выделять память сразу одним куском в 2гб и потом нарезать его на хипы для больших и малых объектов.


То есть VA -- это ШТАТНЫЙ в WinApi аллокатор АДРЕСНОГО ПРОСТРАНСТВА,.. Оно умеет не тока закомиченную память выдавать, но и зарезервированную, то есть АП как оно есть.
Поэтому чем меньше у тебя будет прослоек между твоим аллокатором памяти, в случае аллокации больших кусков, и аллокатором АП, тем меньше шансов нарваться на фрагментацию АП НЕ ПО ДЕЛУ...

I>Все что дает VirtualAlloc это быстродействие.

Мальчик, иди, отсюда. Не, прапвда, ты вот правда думаешь, что если кусануть по VA сразу полгига памяти, а потом её там распределять как-то, то это будет медленнее, чем вызывать VA?

Собственно тебе ужо всё показали, рассказали и книжки нужные читать послали до полного просветления.
Так что тему помогает там VA фрагментации или мешает закрыть, каждый останется при свом мнении, у кого подкреплённом тестами и знаниями, а у кого всякими там соображениями, не суть, и вернуться к тобой же созданному топику.

Итак, до какого размера списка байтов можно в него пихать байты, что бы не парится о фрагментации?
До мегабайта можно? А до 10? А до 100?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 13:32
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Не нужно ни десятков, ни сотен, часто хватает и 100 тыс и даже менее.


Во-о-о-от, началась конкретка. Я верноп онимаю, что 100 тысяч элементов -- это полмегабайта памяти?
Или речь о элементах по килобайту каждый?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 15.10.13 13:35
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Лол, сейчас неосилятор ссылок расскажет нам всем, как нужно писать код.


Да нет, тут сложнее. Напишет он или нет, и если напишет , то что именно — этого я не знаю. Но для него код действительно ужасный. Вот если бы я употребил бы template, перегрузил бы какие-то операторы, сделал бы какой-нибудь итератор, прицепил xyz_ptr и zyx_cast и т.д. — тогда его бы устроило. А когда пишется просто и коротко — это ужасно.

Что тут поделаешь... Я все же останусь с таким стилем кода, он меня еще никогда не подводил. А они пусть пишут все свои примочки, без них им никуда.
With best regards
Pavel Dvorkin
Re[16]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 13:37
Оценка:
Здравствуйте, Ikemefula, Вы писали:

E>>Я верно понимаю, что 100 тысяч элементов -- это полмегабайта памяти?

I>Читай внимательно.

То есть в С# проблема уже полметра ОЗУ подряд выделить? IMHO это просто тупо неработоспособно. Я не верю, что всё так плохо. Это же ни "Унесённые ветром", ни "Войну и мир" даже в масив букв не положить же

Люди, сведующие в вопросе, Ikemefula точно не преувеличивает гнилось платформы?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[17]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 14:01
Оценка:
Здравствуйте, Erop, Вы писали:

E>>>Я верно понимаю, что 100 тысяч элементов -- это полмегабайта памяти?

I>>Читай внимательно.

E>То есть в С# проблема уже полметра ОЗУ подряд выделить? IMHO это просто тупо неработоспособно. Я не верю, что всё так плохо. Это же ни "Унесённые ветром", ни "Войну и мир" даже в масив букв не положить же


Если бы ты читал внимательно, то нашел бы, что речь идет не о всех приложениях, а примерно пятой части, которая наиболее ресурсоемкая.

С этими приложениями точно так же как и в С++ — выюзаешь или фрагментируешь всю память, а потом, внезапно, "войну и мир" на массив букв не разложить.
Re[19]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 14:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Аллокатор адрессного пространства это шедевр

Ну в целом да, это они в WinApi прикольно прдумали...
Или ты это подкалываешь просто?
Тогда что, по твоему, делает VA, когда ты его зовёшь для reserve?..
Разве не аллокирует для твоих нужд часть АП?..

I>Аллокатор подразумевает ,что когда тебе нужен ресурс новый или старый закончился, аллокатор навыделяет тебе еще этого самого русурса.

Ну так VA же так и делает, пока АП не закончится...

I>Как это можно сделать — не совсем ясно. Наверное это будет так — есть окно от 1гб до 1.1гб, надо выделить 200мб, аллокатор адрессного пространства довыделит 100мб и опаньки — в окно 100мб размещаем 200мб данных, только байты будут нумероваться не целыми числами, а дробными


Прости, что за бред ты тут написал? VA в WinApi умеет выделять закоммиченную память, то есть память процесса, а может резервировать АП, то есть выделять диапазоны АП, куда потом омжно память коммитить, если она ещё будет доступна, конечно. То есть имеем двухуровневую схему аллокации. Я уверен, что ты всё это знаешь, поэтому твои подколки мне не ясны.

I>То есть, VirtualAlloc ни при чем, т.к. это же можно повторить и без него, а именно с помощью конкретного сценария управления хипом.


В смысле? Если весь код в твоей прогамме, включая системыне вызовы, а так же загрузчик DLL'ек, выделялка стеков для нитей, отображалка файлов на память и т. д. будут выделять для своих нужд диапазоны АП через твой хип, то да...
при этом ещё сам твой хип не должен будет вносить излишней фрагментации в АП, то есть кусать диапазоны АП не пачками, а сразу всё АП брать под своё управление.
На мой взгляд устроить это невозможно, впрочем ты можешь показать пример такого кода

I>И это очевидно вобщем то. VirtualAlloc позволяет выбирать, когда именно коммитать физическую памяти. Без этого будут приседания с виртуальной памятью в обязательном порядке.


Не понял. Когда хип выделяет память, он выделяет срузу закоммиченную же?
У нас есть два альтернативных сценария.
1) Выделить полтора гига по VA и там дальше кусать на блоки нужного размера.
2) Выделять большие блоки по отдельному VA каждый.

Ты правда думаешь, что второе быстрее?

I>Ты так и не показал, как VirtualAlloc поможет в приведеных мною сценариях

Тебе не поможет ничего, аминь. Написать не падающую по ООМ при достаточно долгой работе 32-битную программу с вектором/листом внутри в принципе невозможно, все контрпримеры -- миф.
IMHO, тут больше нечего обсуждать, ты прав и жизнь -- гавно.

I>Все ответы уже дадены — зависит от свободных окон в адресном пространстве.

О! То есть ответ такой, что ни на что нельзя надеяться... понимаю.

Давай я попробую перевести. Положим у нас есть какая-то типичная программа из нескольких компонент сляпанная, часть нативные, часть -- дотнет, или все дотнет, можно и тот и тот случай рассмотреть. Ей одномоментно не надо больше 0.5 Гига памяти никогда, например, листами какого размера ещё можно оперировать не заморачиваясь?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[18]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 14:08
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Если бы ты читал внимательно, то нашел бы, что речь идет не о всех приложениях, а примерно пятой части, которая наиболее ресурсоемкая.


Это уже просто всякие истории про программирование на грани фола. Это довольно специальный случай же?
И всё равно как-то странно, что полуметра подряд не сыскать в памяти такого приложения. А как там заводятся нитки со совими стеками, например?.. Или для них таки находится место, волшебным образом?

I>С этими приложениями точно так же как и в С++ — выюзаешь или фрагментируешь всю память, а потом, внезапно, "войну и мир" на массив букв не разложить.


Ну если руки кривые, то и сам знаешь что сломать можно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[19]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 14:29
Оценка:
Здравствуйте, Erop, Вы писали:

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


I>>Если бы ты читал внимательно, то нашел бы, что речь идет не о всех приложениях, а примерно пятой части, которая наиболее ресурсоемкая.


E>Это уже просто всякие истории про программирование на грани фола. Это довольно специальный случай же?


Случай специфический, но встречается относительно часто. Я даже указал: где, когда и почему.

E>И всё равно как-то странно, что полуметра подряд не сыскать в памяти такого приложения. А как там заводятся нитки со совими стеками, например?.. Или для них таки находится место, волшебным образом?


Пол-мега может быть, а может и не быть. Именно пол-мега — это редкий случай, практически вырожденый, но я встречал и такие, при чем, что интересно, в коде 3rd party с которыми приходилось иметь дело.

I>>С этими приложениями точно так же как и в С++ — выюзаешь или фрагментируешь всю память, а потом, внезапно, "войну и мир" на массив букв не разложить.


E>Ну если руки кривые, то и сам знаешь что сломать можно


В больших приложениях, как тебе уже сообщили, АП всегда фрагментировано.
Re[20]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 14:35
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Случай специфический, но встречается относительно часто. Я даже указал: где, когда и почему.


Это понятно и где и когда и почему же. Это когда что-то тяжёлое и для этого не предназначенное тянут за каким-то хреном инпроц в свой АП...

I>Пол-мега может быть, а может и не быть. Именно пол-мега — это редкий случай, практически вырожденый, но я встречал и такие, при чем, что интересно, в коде 3rd party с которыми приходилось иметь дело.


А зачем ты лез в АП столь плотно заоптимизированного кода?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[20]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 14:46
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Аллокатор адрессного пространства это шедевр

E>Ну в целом да, это они в WinApi прикольно прдумали...
E>Или ты это подкалываешь просто?
E>Тогда что, по твоему, делает VA, когда ты его зовёшь для reserve?..
E>Разве не аллокирует для твоих нужд часть АП?..

Очевидно — нет. Резерв нужен для экономии физической памяти, она всегда сильно ограничена, а следовательно и для перформанса, иначе своп будет работать постоянно.
Есть такое соображение — большие блоки очень часто незаполнены до конца. Резерв экономит вагоны физической памяти, а само выделение ускоряется до безобразия.

I>>Аллокатор подразумевает ,что когда тебе нужен ресурс новый или старый закончился, аллокатор навыделяет тебе еще этого самого русурса.

E>Ну так VA же так и делает, пока АП не закончится...

Ты путаешь адресное пространство и память. Когда процесс создан, не надо в нем выделять АП, его винда для тебя выделила — 2гб. Делай с ним что хочешь.

E>Прости, что за бред ты тут написал? VA в WinApi умеет выделять закоммиченную память, то есть память процесса, а может резервировать АП, то есть выделять диапазоны АП, куда потом омжно память коммитить, если она ещё будет доступна, конечно. То есть имеем двухуровневую схему аллокации. Я уверен, что ты всё это знаешь, поэтому твои подколки мне не ясны.


Резервировать АП != выделять АП.

E>В смысле? Если весь код в твоей прогамме, включая системыне вызовы, а так же загрузчик DLL'ек, выделялка стеков для нитей, отображалка файлов на память и т. д. будут выделять для своих нужд диапазоны АП через твой хип, то да...

E>при этом ещё сам твой хип не должен будет вносить излишней фрагментации в АП, то есть кусать диапазоны АП не пачками, а сразу всё АП брать под своё управление.

Системные пусть живут сами по себе. А вот приложение может выделять как угодно.

E>Не понял. Когда хип выделяет память, он выделяет срузу закоммиченную же?

E>У нас есть два альтернативных сценария.
E>1) Выделить полтора гига по VA и там дальше кусать на блоки нужного размера.
E>2) Выделять большие блоки по отдельному VA каждый.

E>Ты правда думаешь, что второе быстрее?


Ты лучше читать попробуй. Опохмеляться давно начал ?

I>>Ты так и не показал, как VirtualAlloc поможет в приведеных мною сценариях

E>Тебе не поможет ничего, аминь. Написать не падающую по ООМ при достаточно долгой работе 32-битную программу с вектором/листом внутри в принципе невозможно, все контрпримеры -- миф.

И долго ты до этого доходил ?

I>>Все ответы уже дадены — зависит от свободных окон в адресном пространстве.

E>О! То есть ответ такой, что ни на что нельзя надеяться... понимаю.

Разумеется.

E>Давай я попробую перевести. Положим у нас есть какая-то типичная программа из нескольких компонент сляпанная, часть нативные, часть -- дотнет, или все дотнет, можно и тот и тот случай рассмотреть. Ей одномоментно не надо больше 0.5 Гига памяти никогда, например, листами какого размера ещё можно оперировать не заморачиваясь?..


Не знаю. 0.5 гига это смотря как выделялось. Иногда сверх этого можно выделить всего 300мб, а иногда и до 400-600, а иногда и больше гига. Иногда — 0. Вот такой вот парадокс. Если вообще все хорошо — то как в С++, исключая 200мб — издержки на все менеджед расходы.

Ты пойми простую вещь — нативные модули едят АП, нативные функции едят АП, сборки едят АП, джыт ест АП, GC сам ест АП, нативные потоки едят АП, CRL и тот ест АП, интероп снова ест АП.
Поэтому для большого х32 приложения, где все намешано, больше чем на 1гб памяти под твои объекты можно не надеяться, хотя все АП 2гб. Дальше надо вычитать все издержки на фрагментацию и имеющиеся расходы. Что в итоге — не ясно.
Re[20]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 15:07
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Про что и речь — сейчас почти любой проект на С++ это в т.ч. написание всевозможных аллокаторов.

V>Кстате, страничный аллокатор или пул объектов — неплохая тестовая задачка для студента или вчерашнего студента. Как раз ему на час-другой работы.
V>Попробуй сам да замерь время. При том, что ты давно не брал плюсов в руки, вряд ли у тебя на это уйдет более часа. Т.е. рассуждать даже не о чем.

Решение проблемы с фрагментацией не сводится к написанию аллокатора, это всего лишь необходимая часть. Вопрос — какое условие будет необходимым и достаточным ?
Re[21]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 15:11
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Очевидно — нет. Резерв нужен для экономии физической памяти, она всегда сильно ограничена, а следовательно и для перформанса, иначе своп будет работать постоянно.

I>Есть такое соображение — большие блоки очень часто незаполнены до конца. Резерв экономит вагоны физической памяти, а само выделение ускоряется до безобразия.

Во-первых, виндовая куча никаких резервов не делает, она даёт тебе память, а не АП, в которое ты можешь коммитить память...
Так что в сценарии с GC, кучей, std::vector'ом и листом это всё мимо.

Во-вторых, возьми и попрофилируй, что ли. Когда ты память комитишь, она всего лишь получает логическую связь и всё, какие-то реальные действия, вроде зануления новых страниц происходят только при ОБРАЩЕНИИ, так что что так, что сяк всё довольно быстро, пока ты писать/читать саму память не начал...

I>Ты путаешь адресное пространство и память. Когда процесс создан, не надо в нем выделять АП, его винда для тебя выделила — 2гб. Делай с ним что хочешь.


Ну так VA выделяет диапазоны АП на разные нужды внутри процесса.
И кстати, попробуй понять, что я не путаю память и АП. Память -- это то, что ты получаешь из общесистемного пула, когда делаешь комит, а АП -- это то, что ты получаешь, из ассоциированного с процессом пула, когда делаешь резёрв...

I>Резервировать АП != выделять АП.

Почему? Это, похоже, какой-то терминалогический спор...

I>Системные пусть живут сами по себе. А вот приложение может выделять как угодно.

Так они распределяют ОДНО И ТО ЖЕ АП же?..
ну и потом, в приложении бывает несколько независимых компонент...

I>И долго ты до этого доходил ?

Что тебе лично ничегоне поможет? Ну в целом я до последнего надеялся, что ты не безнадёжен, но факты вещь упрямая...

I>Не знаю. 0.5 гига это смотря как выделялось. Иногда сверх этого можно выделить всего 300мб, а иногда и до 400-600, а иногда и больше гига. Иногда — 0. Вот такой вот парадокс. Если вообще все хорошо — то как в С++, исключая 200мб — издержки на все менеджед расходы.


А что значит "всё хорошо"?

I>Ты пойми простую вещь — нативные модули едят АП, нативные функции едят АП, сборки едят АП, джыт ест АП, GC сам ест АП, нативные потоки едят АП, CRL и тот ест АП, интероп снова ест АП.

Я-то, как раз, это понимаю. И они все распредеяют поедаемое АП через механихм его аллокации, доступный пользовательскому коду через VA. Я так и не понял, GC большие куски только в своих банках выделяет или умеет сразу по VA кусать?

I>Поэтому для большого х32 приложения, где все намешано, больше чем на 1гб памяти под твои объекты можно не надеяться, хотя все АП 2гб. Дальше надо вычитать все издержки на фрагментацию и имеющиеся расходы. Что в итоге — не ясно.


То есть типичной картины вообще нет? Для меня это странно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[21]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 15:14
Оценка:
Здравствуйте, Erop, Вы писали:

E>Это понятно и где и когда и почему же. Это когда что-то тяжёлое и для этого не предназначенное тянут за каким-то хреном инпроц в свой АП...


Нужно искать баланс между стоимостью, сложностью и надежностью. Разносить по разным процессм простые операции — получается целая куча неустранимых проблем. Можешь на хром посмотреть.

I>>Пол-мега может быть, а может и не быть. Именно пол-мега — это редкий случай, практически вырожденый, но я встречал и такие, при чем, что интересно, в коде 3rd party с которыми приходилось иметь дело.


E>А зачем ты лез в АП столь плотно заоптимизированного кода?


Для того, что бы устранить ООМ на конкретных рабочих сценариях приложения.
Re[22]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 15:37
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Очевидно — нет. Резерв нужен для экономии физической памяти, она всегда сильно ограничена, а следовательно и для перформанса, иначе своп будет работать постоянно.

I>>Есть такое соображение — большие блоки очень часто незаполнены до конца. Резерв экономит вагоны физической памяти, а само выделение ускоряется до безобразия.

E>Во-первых, виндовая куча никаких резервов не делает, она даёт тебе память, а не АП, в которое ты можешь коммитить память...


Ты же сам сказал про резерв. Я указал тебе для чего он нужен.

E>Ну так VA выделяет диапазоны АП на разные нужды внутри процесса.


Она ничего не выделяет, все уже выделено. Она тупо _резервирует_.

E>И кстати, попробуй понять, что я не путаю память и АП. Память -- это то, что ты получаешь из общесистемного пула, когда делаешь комит, а АП -- это то, что ты получаешь, из ассоциированного с процессом пула, когда делаешь резёрв...


АП не надо получать, оно уже есть. На него можно отобразить память или резерв. А можно и просто так и использовать , если тебя устраивает AV

I>>Не знаю. 0.5 гига это смотря как выделялось. Иногда сверх этого можно выделить всего 300мб, а иногда и до 400-600, а иногда и больше гига. Иногда — 0. Вот такой вот парадокс. Если вообще все хорошо — то как в С++, исключая 200мб — издержки на все менеджед расходы.


E>А что значит "всё хорошо"?


"близко к идеальному", значит все предыдущие аллокации находятся одной пачкой или близко к этому, чего как правило никогда не бывает.

I>>Ты пойми простую вещь — нативные модули едят АП, нативные функции едят АП, сборки едят АП, джыт ест АП, GC сам ест АП, нативные потоки едят АП, CRL и тот ест АП, интероп снова ест АП.

E>Я-то, как раз, это понимаю. И они все распредеяют поедаемое АП через механихм его аллокации, доступный пользовательскому коду через VA. Я так и не понял, GC большие куски только в своих банках выделяет или умеет сразу по VA кусать?

Это совершенно не важно, когда он мапит страницы. И для С++ тоже неактуально.

I>>Поэтому для большого х32 приложения, где все намешано, больше чем на 1гб памяти под твои объекты можно не надеяться, хотя все АП 2гб. Дальше надо вычитать все издержки на фрагментацию и имеющиеся расходы. Что в итоге — не ясно.


E>То есть типичной картины вообще нет? Для меня это странно


Ты наверное читать разучился. Большое х32 приложение само по себе нетипичный случай. Типичный под-случай для нетипичного случая — это нонсенс !
Re[23]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 15:53
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Она ничего не выделяет, все уже выделено. Она тупо _резервирует_.

В смысле? Вот у процесса есть пул доступных пользовательскому коду адресов. Обычно это немного меньше 2 Гб, VA по запросу на резёрв выделяет из этого пула диапазоны адресов для запросивших их сервисов. Что тебе тут кажется странным?

I>АП не надо получать, оно уже есть. На него можно отобразить память или резерв. А можно и просто так и использовать , если тебя устраивает AV


Ну и память не надо получать, она тоже уже есть, в компьютере/ОС. Аллокаторы просто распределяют ресурс из некоторого пула, который где-то уже есть, иногда, правда, ещё умеют запросить расширения пула за счёт аллокатора ещё чего-нибудь. Куча может запросить ещё одну банку памяти через VA у ОС, ОС может запросить расширение файла подкачки и т. п.

I>Это совершенно не важно, когда он мапит страницы. И для С++ тоже неактуально.

Чего? При чём тут страницы-то? Ты вообще про какое АП? Про логическое или про физическое?
Дотнетовский GC что ли на уровне мапинга страниц работает?

I>Ты наверное читать разучился. Большое х32 приложение само по себе нетипичный случай. Типичный под-случай для нетипичного случая — это нонсенс !


Если речь про иникальные расклады, то я не понимаю наезда на лист, с которого ты начал этот топик...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[24]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 16:04
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Она ничего не выделяет, все уже выделено. Она тупо _резервирует_.

E>В смысле? Вот у процесса есть пул доступных пользовательскому коду адресов. Обычно это немного меньше 2 Гб, VA по запросу на резёрв выделяет из этого пула диапазоны адресов для запросивших их сервисов. Что тебе тут кажется странным?

Ничего.

I>>АП не надо получать, оно уже есть. На него можно отобразить память или резерв. А можно и просто так и использовать , если тебя устраивает AV


E>Ну и память не надо получать, она тоже уже есть, в компьютере/ОС. Аллокаторы просто распределяют ресурс из некоторого пула, который где-то уже есть, иногда, правда, ещё умеют запросить расширения пула за счёт аллокатора ещё чего-нибудь. Куча может запросить ещё одну банку памяти через VA у ОС, ОС может запросить расширение файла подкачки и т. п.


АП уже выделено, расслабься.

I>>Это совершенно не важно, когда он мапит страницы. И для С++ тоже неактуально.

E>Чего? При чём тут страницы-то? Ты вообще про какое АП? Про логическое или про физическое?
E>Дотнетовский GC что ли на уровне мапинга страниц работает?

Удивляюсь, как ты умеешь прочесть вот так вот

I>>Ты наверное читать разучился. Большое х32 приложение само по себе нетипичный случай. Типичный под-случай для нетипичного случая — это нонсенс !


E>Если речь про иникальные расклады, то я не понимаю наезда на лист, с которого ты начал этот топик...


В нетипичных х32 приложениях которых где то пятая часть от всех, добавление в лист без задания капасити случается довольно часто.
Re[25]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 16:06
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>АП уже выделено, расслабься.


В каком смысле "выделено"? Это же просто отрезок натурального ряда?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[26]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.10.13 16:10
Оценка:
Здравствуйте, Erop, Вы писали:

I>>АП уже выделено, расслабься.


E>В каком смысле "выделено"? Это же просто отрезок натурального ряда?


Правильно. Потому и не надо ничего выделять. Можно отпамить часть АП и этог мапинг оформить нужным образом.
Re[6]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 15.10.13 16:14
Оценка:
Здравствуйте, Abyx, Вы писали:


A>нет, совсем не так.


A>я хочу чтобы из Reverse были вытащены функции типа head, tail, add, и чтобы Reverse была написала в терминах этих операций, а не состояла их непонятных присваиваний


Ну да, я примерно это и имею в виду. Только ошибся в наборе элементов. Для реализации двух простых действий ты требуешь написать обязательно head, tail , выделить add и т.д. Потом понадобится выделить итератор все же, или же придется внутри класса сделать next, а это, разумеется, вызовет твою критику (на этот раз справедливую), что итерация в списке не реализована итератором, а находится в самом списке и т.д.
Кстати, насчет add. Вообще-то add есть — AddToBegin. Только вот использовать ее явно при реверсе нельзя, так как она элемент в список добавляет, то есть new ListElement делает, а при Reverse никаких новых ListElement делать не надо. И вообще этот Reverse плохо укладывается в основные примитивы работы со списком, так как по сути "крадет" из одного списка ListElement вместе с его содержимым и переносит этот ListElement в другой список. Обычно класс списка экспонирует интерфейс, в котором фигурируют элементы данных, а не "кирпичики списка" , и это верно, так как нечего показывать внутренние детали наружу. Но я и не показываю.

A>т.е. я хочу чтобы код был читаемым текстом, типа такого:


<skipped>

Такое написать, конечно, можно, только вот код по манипуляциям с next и прочую игру с указателями все равно никуда не денешь, потому что это делать все равно придется. Может, код от этого станет более читаемым (для тебя), ну а ИМХО он и так вполне понятен, если просто посмотреть, что именно там делается.

А впрочем... Давай, допиши свой код до рабочего. Условия знаешь

1) при реверсе никаких new и вообще выделений памяти O(N) где бы то ни было и как бы то ни было.
2) однопроходной по исходному списку алгоритм.

Мой код рабочий. Можешь взять мою тестовую программу. Допиши, посмотрим, насколько это будет понятнее

От рекурсии уволь, так как это O(N) по стеку
With best regards
Pavel Dvorkin
Re[27]: собеседования, Реверс списка
От: Erop Россия  
Дата: 15.10.13 16:19
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Правильно. Потому и не надо ничего выделять. Можно отпамить часть АП и этог мапинг оформить нужным образом.


а можно просто зарезервировать, а потом закомитить...
В любом случае разные сервисы запрашивают диапазоны АП через VA или более низкоуровневый аналогичный интерфейс, к тому же самому аллокатору диапазонов АП, и получают или не получают их для использования под свои цели.

Почему идея аллокатора АП кажется тебе странной? В принципе любой аллокатор просто распределяет ресурс из пула же, хоть память, хоть место в файле, хоть ноды списка, хоть диапазоны АП -- разница невелика.
В случае с АП есть особенность, что пул не может расти, ну так он ещё и во многих иных сценариях не может расти же.
Я вообще перестал понимать суть твоей аргументации.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 15.10.13 16:26
Оценка:
Здравствуйте, Abyx, Вы писали:

A>я хочу чтобы из Reverse были вытащены функции типа head, tail, add, и чтобы Reverse была написала в терминах этих операций, а не состояла их непонятных присваиваний


В четырёх присваиваниях для простого связного списка нет ничего "непонятного". Может версия со slice/prepend и красивее, но это всё субъективно.

Нужно в первую очередь смотреть на объективные моменты, а не цепляться в грубой форме к субъективным недостаткам.
Например у тебя же получается лишняя операция
Автор: Abyx
Дата: 11.10.13
, так? slice лишний раз зануляет next.
Возможно компилятор сможет его убрать после inline'а, или даже если не за-inline'ит то это будет скорей всего не критично, но всё же это реальный объективный недостаток.

Другой реальный объективный момент, который относится ко всем трём примерам (или сколько там было) — в том что операция "reverse целого списка" элементарно превращается в "prepend перевёрнутого куска списка к другому списку".
Это тоже — реально объективный критерий.

Вот, например, один из вариантов Александра Степанова.
template <typename I> // I models Linked Iterator
I reverse_append(I first, I limit, I result)
{
    while (first != limit) {
        I old_successor = successor(first);
        set_successor(first, result);
        result = first;
        first = old_successor;
    }
    return result;
}
Это тоже по-твоему "ужасный говнокод с мешаниной old_successor, result, first и кучей присваиваний"?
Re[7]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 15.10.13 17:20
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

A>>я хочу чтобы из Reverse были вытащены функции типа head, tail, add, и чтобы Reverse была написала в терминах этих операций, а не состояла их непонятных присваиваний

EP>В четырёх присваиваниях для простого связного списка нет ничего "непонятного". Может версия со slice/prepend и красивее, но это всё субъективно.

        ListElement * newBegin = NULL;
        ListElement * cur = begin;
        while(cur)
        {
            ListElement * next = cur->next;
            cur->next = newBegin;
            newBegin = cur;
            cur = next;
        }
        begin = newBegin;


здесь 7 присваиваний, а не 4.
когда я смотрю на этот код, я вижу только что какие-то поля и переменные (или может члены класса) присваиваются друг другу, и с первого взгляда мне непонятно что тут делается
если начать читать — то смысла не добавляется: "newBegin = NULL; cur = begin; while cur != NULL: next = cur->next; cur->next = newBegin; newBegin = cur; ..." тут я начинаю думать "может это swap()?"
если нарисовать (в уме или на бумаге) по этому коду картинки, то всё становится понятно, а по тексту — ничего не понятно.

Есть еще один важный момент, который я забыл упомянуть.
Если у списка всетаки есть функции (методы) типа slice, prepend, то если функция reverse их не использует — это нарушение DRY, что для меня является признаком плохого кода.
Плохого уже не в плане читаемости, а в плане сопровождаемости.

EP>Нужно в первую очередь смотреть на объективные моменты, а не цепляться в грубой форме к субъективным недостаткам.

EP>Например у тебя же получается лишняя операция
Автор: Abyx
Дата: 11.10.13
, так? slice лишний раз зануляет next.

EP>Возможно компилятор сможет его убрать после inline'а, или даже если не за-inline'ит то это будет скорей всего не критично, но всё же это реальный объективный недостаток.

Да, я видел что slice зануляет next, и написал так потому что считаю что современные компиляторы уберут это лишнее присваивание.
Если же производительность списка будет узким местом, и компилятор не сделает такую оптимизацию, можно будет ввести функцию details::slice_fast()

EP>Другой реальный объективный момент, который относится ко всем трём примерам (или сколько там было) — в том что операция "reverse целого списка" элементарно превращается в "prepend перевёрнутого куска списка к другому списку".

EP>Это тоже — реально объективный критерий.

да, но про другие структуры данных речь не шла, значит писать более универсальную функцию было бы нарушением YAGNI.

EP>Вот, например, один из вариантов Александра Степанова.

EP>
EP>template <typename I> // I models Linked Iterator
EP>I reverse_append(I first, I limit, I result)
EP>{
EP>    while (first != limit) {
EP>        I old_successor = successor(first);
EP>        set_successor(first, result);
EP>        result = first;
EP>        first = old_successor;
EP>    }
EP>    return result;
EP>}
EP>
Это тоже по-твоему "ужасный говнокод с мешаниной old_successor, result, first и кучей присваиваний"?



нет, это не говнокод.
во-первых этот код читается уже значительно лучше, т.к. тут используются функции successor и set_successor.
во-вторых отсюда сложно выделить другие функции, т.е. хотя тут и есть мешанина из присваиваний, с ней ничего не сделать.

основная сложность тут в set_successor, который магическим образом превращает "first" в "result"
можно было бы выделить

template <typename I> // I models Linked Iterator
I set_successor_and_ret_seq(I first, I newSuccessor)
{
    set_successor(first, newSuccessor);
    return first;
}


и тогда result всегда будет result, а first — начало исходной последовательности (визуально)

template <typename I> // I models Linked Iterator
I reverse_append(I first, I limit, I result)
{
    while (first != limit) {
        I old_successor = successor(first);
        result = set_successor_and_ret_seq(first, result);
        first = old_successor;
    }
    return result;
}


но эта функция set_successor_and_ret_seq опасна своим побочным эффектом, и я наверное не решился бы ее использовать.

возможно рекурсивный вариант кому-то покажется лучше, но ФП vs ИП — это действительно дело субъективное

template <typename I> // I models Linked Iterator
I reverse_append(I first, I limit, I result)
{
    if (first == limit)
        return result;

    I next = successor(first);
    result = set_successor_and_ret_seq(first, result);
    return reverse_append(next, limit, result);
}
In Zen We Trust
Re[7]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 15.10.13 18:42
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

A>>я хочу чтобы из Reverse были вытащены функции типа head, tail, add, и чтобы Reverse была написала в терминах этих операций, а не состояла их непонятных присваиваний


PD>Ну да, я примерно это и имею в виду. Только ошибся в наборе элементов. Для реализации двух простых действий ты требуешь написать обязательно head, tail , выделить add и т.д. Потом понадобится выделить итератор все же, или же придется внутри класса сделать next, а это, разумеется, вызовет твою критику (на этот раз справедливую), что итерация в списке не реализована итератором, а находится в самом списке и т.д.


нет, у меня немного другое понимание задачи — "у нас есть список, и мы пишем к нему новую функцию reverse".
т.е. список уже готов, и у него наверняка уже какие-то базовые операции.
поскольку конкретный класс списка не задан, мы придумываем их сами.

PD>Такое написать, конечно, можно, только вот код по манипуляциям с next и прочую игру с указателями все равно никуда не денешь, потому что это делать все равно придется.

манипуляции с next можно спрятать внутрь функций с читаемыми названиями, пусть даже это set_next

PD>ИМХО он и так вполне понятен, если просто посмотреть, что именно там делается.

не согласен.
да, если долго на него смотреть, то можно разобраться что там делается.
но это и есть критерий понятности/непонятности. с "понятным" кодом разбираешься быстро, с "непонятным" долго.

PD>А впрочем... Давай, допиши свой код до рабочего. Условия знаешь

уже писал тут — http://www.rsdn.ru/forum/flame.comp/5327527.1
Автор: Abyx
Дата: 11.10.13
(http://coliru.stacked-crooked.com/a/5c03760ffe9063ae)

вот более полная версия, с правильным API списка, С++1y, шаблонами, итераторами, удалением элементов
http://coliru.stacked-crooked.com/a/cafe1dd5e6bff3c8

PD>От рекурсии уволь, так как это O(N) по стеку

к сожалению да. хотя все современные компиляторы умеют разворачивать хвостовую рекурсию, в Debug конфигурации они этого делать не будут.
In Zen We Trust
Re[7]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 15.10.13 19:45
Оценка:
EP>Вот, например, один из вариантов Александра Степанова.
EP>[ccode]
EP>template <typename I> // I models Linked Iterator
EP>I reverse_append(I first, I limit, I result)
EP>{
EP> while (first != limit) {
EP> I old_successor = successor(first);
EP> set_successor(first, result);
EP> result = first;
EP> first = old_successor;
EP> }
EP> return result;
EP>}

Кстати, соответствующая видео-лекция.
(сам список, точнее пул списков — list_pool начинает разрабатываться в Lecture 8 Part 1)
Re[6]: собеседования, Реверс списка
От: -n1l-  
Дата: 16.10.13 02:37
Оценка:
Здравствуйте, Abyx, Вы писали:

A>я хочу чтобы из Reverse были вытащены функции типа head, tail, add, и чтобы Reverse была написала в терминах этих операций, а не состояла их непонятных присваиваний

Здрас-те приехали, вообще-то это нормальная практика, когда для оперирования ссылочными типами создается несколько переменных.
Это не непонятные присваивания, а операции с ссылками, если они для вас так сложны, срочно качать скилл программирования.
Но я подозреваю, что вам не столько непонятен код, сколько вы просто не хотите видеть такой стиль.
Я только взглянул на решение Павла Дворкина и оно мне сразу стало понятно.
Я бы конечно еще поработал над названиями переменных и вообще над названиями и форматированием, но по большей части это придало бы только видимую красоту.

A>или может функциональный вариант (хотя читаемость хвостовой рекурсии — штука спорная)

Сам ты функциональный! Все там императивно.
Но должен сказать, вариант рекурсии мне понравился.
Ну так как я вообще люблю рекурсию, то мне легко угодить.
И вот кстати, по этому варианту сразу видно, что человек понимает, что такое ссылки(указатели) и как с ними нужно работать.
Re[21]: собеседования, Реверс списка
От: vdimas Россия  
Дата: 16.10.13 08:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Решение проблемы с фрагментацией не сводится к написанию аллокатора, это всего лишь необходимая часть.


В плюсах сводится, что оч удобно. Однократно написанный сверхдешевый в разработке и в рантайм аллокатор юзается в сотнях продуктов.

I>Вопрос — какое условие будет необходимым и достаточным ?


Вопрос я уже задавал рядом — нахрена нужен линейный массив в памяти с сотнями миллионов элементов?
Re[8]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 16.10.13 08:42
Оценка:
Здравствуйте, Abyx, Вы писали:


PD>>Ну да, я примерно это и имею в виду. Только ошибся в наборе элементов. Для реализации двух простых действий ты требуешь написать обязательно head, tail , выделить add и т.д. Потом понадобится выделить итератор все же, или же придется внутри класса сделать next, а это, разумеется, вызовет твою критику (на этот раз справедливую), что итерация в списке не реализована итератором, а находится в самом списке и т.д.


A>нет, у меня немного другое понимание задачи — "у нас есть список, и мы пишем к нему новую функцию reverse".

A>т.е. список уже готов, и у него наверняка уже какие-то базовые операции.
A>поскольку конкретный класс списка не задан, мы придумываем их сами.

Ну пусть так. В конце концов мне никто не мешает в моем списке, так сказать, задним числом, добавить традиционные примитивы. А reverse оставлю как есть.


PD>>Такое написать, конечно, можно, только вот код по манипуляциям с next и прочую игру с указателями все равно никуда не денешь, потому что это делать все равно придется.

A>манипуляции с next можно спрятать внутрь функций с читаемыми названиями, пусть даже это set_next

Вот объясни мне , пожалуйста, почему наличие в теле функции вызова set_next(a) делает код более понятным, чем присваивание next ? Я решительно не могу этого понять


p->next = cur;



Кажется, все просто и ясно. Из этого оператора следует все, что в нем заложено. А ты предлагаешь что-то вроде

set_next(p,cur)


Ну и чем это лучше. Ладно, о том, что это может быть менее эффективно (если не заинлайнится) — промолчу. Но и просто по стилю — чем это лучше ? Чем это понятнее ? Мне надо отвлечься от чтения reverse, посмотреть код set_next, понять, что она делает, запомнить, что она делает (ее вызов может еще раз повториться, опять ее смотреть ?), потом вернуться к reverse и продолжить изучение. Хоть убей, не понимаю, чем это лучше простого присваивания полю.

PD>>ИМХО он и так вполне понятен, если просто посмотреть, что именно там делается.

A>не согласен.
A>да, если долго на него смотреть, то можно разобраться что там делается.

Да не надо тут долго смотреть. Берешь листочек, рисуешь список из трех элементов со стрелками, начинаешь выполнять на этом листочке, зачеркивая одни стрелки и рисуя другие. На втором элементе все будет ясно. Займет это минуту от силы.


A>но это и есть критерий понятности/непонятности. с "понятным" кодом разбираешься быстро, с "непонятным" долго.


См. выше, насчет set_next

PD>>А впрочем... Давай, допиши свой код до рабочего. Условия знаешь

A>уже писал тут — http://www.rsdn.ru/forum/flame.comp/5327527.1
Автор: Abyx
Дата: 11.10.13
(http://coliru.stacked-crooked.com/a/5c03760ffe9063ae)


A>вот более полная версия, с правильным API списка, С++1y, шаблонами, итераторами, удалением элементов

A>http://coliru.stacked-crooked.com/a/cafe1dd5e6bff3c8

Более полную смотреть не буду, так как в ней ничего нового в плане нашей дискуссии, как я понимаю, нет.

Что касается исходной, то тебе уже отметили, что ты лишнее присваивание делаешь во имя идеи .
Далее, вот это нельзя назвать очень уж понятным с первого взгляда

Item* slice(Item*& head)

Функция что-то возвращает и при этом меняет свой входной указатель. Как минимум подумать надо. А скорее и потестировать, убедиться, что правильно работает на граничных значениях.

Да, reverse выглядит понятнее, не спорю. Но чтобы убедиться в том, что все тут правильно, мне надо понять логику slice и prepend. Для меня все это отнюдь не более понятно, чем простенькие манипуляции с next в теле моего цикла.
With best regards
Pavel Dvorkin
Re[9]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 16.10.13 10:36
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ну пусть так. В конце концов мне никто не мешает в моем списке, так сказать, задним числом, добавить традиционные примитивы. А reverse оставлю как есть.

это будет нарушением DRY, такой код сложно поддерживать.
когда надо будет что-то поменять, придется править больше строчек

PD>>>Такое написать, конечно, можно, только вот код по манипуляциям с next и прочую игру с указателями все равно никуда не денешь, потому что это делать все равно придется.

A>>манипуляции с next можно спрятать внутрь функций с читаемыми названиями, пусть даже это set_next

PD>Вот объясни мне , пожалуйста, почему наличие в теле функции вызова set_next(a) делает код более понятным, чем присваивание next ? Я решительно не могу этого понять


PD>
PD> p->next = cur;
PD>


PD>Кажется, все просто и ясно. Из этого оператора следует все, что в нем заложено. А ты предлагаешь что-то вроде


PD>
PD> set_next(p,cur)
PD>


PD>Ну и чем это лучше. Ладно, о том, что это может быть менее эффективно (если не заинлайнится) — промолчу. Но и просто по стилю — чем это лучше ? Чем это понятнее ? Мне надо отвлечься от чтения reverse, посмотреть код set_next, понять, что она делает, запомнить, что она делает (ее вызов может еще раз повториться, опять ее смотреть ?), потом вернуться к reverse и продолжить изучение. Хоть убей, не понимаю, чем это лучше простого присваивания полю.


в "p->next = cur;" используются четыре сущности — p, ->next, operator=, cur.
читается это как "в p, члену класса next, присвоить cur"

а в "set_next(p, cur);" используются три сущности — set_next, p, cur.
читается это примерно как "p set_next cur".
(c "p.set_next(cur)" было бы чуть проще, хотя использование явного или неявного this вобщем-то не важно)

смотреть реализацию set_next ни в коем случае не надо, она должна делать то что написано в ее названии — set next ListElement,

преимущество в том, что вместо примитивных сущностей ->next и operator= мы используем более высокоуровневую операцию set_next (при этом мы не знаем ее реализацию).

и если постоянно использовать высокоуровневые операции, в т.ч. вместо "элемент newBegin присвоить NULL" — "новый список reversedList",
то код будет текстом описывающим операции над сущностями List и ListElement, а не мешаниной из присваиваний потрохов ListElement и каких-то переменных

PD>Да не надо тут долго смотреть. Берешь листочек, рисуешь список из трех элементов со стрелками, начинаешь выполнять на этом листочке, зачеркивая одни стрелки и рисуя другие. На втором элементе все будет ясно. Займет это минуту от силы.


я не хочу брать листочек и тратить минуту. я хочу разбираться с кодом с той скоростью с которой я его читаю
In Zen We Trust
Re[22]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.10.13 10:53
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Решение проблемы с фрагментацией не сводится к написанию аллокатора, это всего лишь необходимая часть.

V>В плюсах сводится, что оч удобно. Однократно написанный сверхдешевый в разработке и в рантайм аллокатор юзается в сотнях продуктов.

Нет, не сводится. Я выделил, читай внимательнее.

I>>Вопрос — какое условие будет необходимым и достаточным ?


V>Вопрос я уже задавал рядом — нахрена нужен линейный массив в памяти с сотнями миллионов элементов?


Во первых, элементов может быть и меньше миллиона что бы вывалился OOM
Во вторых, промежуточные вычисления никто не отменял
Re[10]: собеседования, Реверс списка
От: Erop Россия  
Дата: 16.10.13 11:54
Оценка:
Здравствуйте, Abyx, Вы писали:

A>я не хочу брать листочек и тратить минуту. я хочу разбираться с кодом с той скоростью с которой я его читаю


1) Тренеруйся
2) Код в защищаемом тоюой стиле лишь создаёт иллюзию понятности, то есть ты из него понимаешь, что хотел сказать автор, но то, что он действительно сказал наоборот тут сильнее спрятано...

Хинт: комментарии таки рулят
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 16.10.13 15:09
Оценка:
Здравствуйте, Erop, Вы писали:

E>Хинт: комментарии таки рулят


нет. комментарии врут.
In Zen We Trust
Re[11]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.10.13 15:47
Оценка:
Здравствуйте, Erop, Вы писали:

E>Знаешь, что? IMHO, если тебе доставляет сложности анализ и понимаени кода из этих семи присваиваний, то это, списки тебе лучше бы не разворачивать...


Эта разница двух вариантов в присваиваниях на большом количестве кода будет только увеличиваться. Неважно, как хорошо ты умеешь читать код, на больших проектах низкоуровневый код ты прочитаешь и поймешь затратив на порядок больше времени.

E>IMHO, это всё настолько просто и понятно, что пофигу. При этом ты напложил каких-то фантастических сущностей, про которые ещё не понятно что конкретно они делают и переусложнил всё раза в два, и втриаешь при этом про читабельность. А реально читабельные индентификаторы -- это есть хорошо. И кад в стиле "семь присваиваний" лучше бы ими снабдить, а пложение кучи функций с непонятными контрактами -- это плохо и переусложение...


Если код такой простой то зачем тебе каменты ?
Re[18]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 16.10.13 16:54
Оценка:
Здравствуйте, vdimas, Вы писали:

НС>>Это только если такая работа — единственная активность в процессе.

V>Коль речь о больших объемах памяти, то в любом случае это так

Практически всегда это не так.
Re[13]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 16.10.13 16:54
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Возможно... Но мне даже трудно представить задачу, когда нам нужно десятки/сотни миллионов элементов в линейном массиве.


Сочувствую, чо.
Re[12]: собеседования, Реверс списка
От: Erop Россия  
Дата: 16.10.13 18:15
Оценка:
Здравствуйте, Abyx, Вы писали:

A>нет. комментарии врут.

Комментарии надо уметь читать...
Комментарии -- это лог намерений разработчика, а код -- то, что получилось из этих намерений.

А у тебя имена функций вместо комментариев используются, с той же степенью обязательности отсутствия вранья
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 17.10.13 00:02
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

A>>это будет нарушением DRY, такой код сложно поддерживать.

A>>когда надо будет что-то поменять, придется править больше строчек
PD>А что тут вообще потребуется менять ?

переименовать next в m_next например.

PD>И кстати, тебе не кажется , что заботясь о последующих модификациях (которые то ли будут, то ли нет), ты пока что делаешь менее эффективное (например) решение для данного кода, который реально будет работать ?

да, такая опасность есть. однако "эффективность кода" тоже нужна не всегда.

PD>Вот ответь на такой вопрос. В твоем коде есть лишнее действие, как отметили до меня. Предположим, выяснится по результатам профилировки, что оно отнимает существенное время, и это существенно для программы. (Разумееется, я не говорю о твоем занулении next, я вообще). И вот выясняется, что со всеми хорошими принципами вроде DRY, модульности, выделения сущностей ты переписать этот код без этого лишнего действия не можешь Вопрос же такой — останешься при принципах и проиграешь в производительности , или же махнешь рукой на принципы и напишешь без них ?


если нужна производительность, я напишу тот код, у которого будет большая производительность.

PD>Слушай, ты это серьезно ? Если впрямь серьезно, то у меня даже слов нет. Какая-то бессмысленная схоластика в совершенно примитивной ситуации.

серьезно.
это мелочь, но какая же важная мелочь, как например однообразное форматирование кода.

A>>я не хочу брать листочек и тратить минуту. я хочу разбираться с кодом с той скоростью с которой я его читаю

PD>Что именно хочешь понять ? Что метод делает ? Для этого заголовка достаточно. Как работает ? Для этого придется в prepend и slice заглянуть — иначе откуда я могу быть уверен, что они именно то, что нужно делают ? По названию ?
понять *как* работает метод, на уровне операций над списком.
для этого внутрь prepend и slice смотреть не надо.

вообще я согласен, из сигнатуры "Item* slice(Item*& head)" сложно понять что она делает. я впихнул в эту slice слишком много ответственностей, и она получилась непонятной.

насчет необходимости смотреть реализацию всех функций, тут есть один важный момент.
если работать с кодом использующим полиморфизм, то реализации посмотреть просто невозможно,
будь это статический полиморфизм template<class List> void reverse(List& lst) { ... prepend(elem, lst) ...
или динамический полиморфизм с IList.
In Zen We Trust
Re[13]: собеседования, Реверс списка
От: cosimo http://sapozhnikov.pro
Дата: 17.10.13 05:13
Оценка:
Здравствуйте, Erop, Вы писали:

E>Суть проста. "правильное" форматирование кода нужно тока придуркам.


Хм-хм. У меня был коллега, который писал C++ код без отступов, совсем, в столбик. После мержа приходилось прогонять исходник через code beautifier. И многие из вас не дрогнув ни единым мускулом на лице смогут работать с таким?
Re[12]: собеседования, Реверс списка
От: Pavel Dvorkin Россия  
Дата: 17.10.13 07:11
Оценка:
Здравствуйте, Abyx, Вы писали:

PD>>А что тут вообще потребуется менять ?


A>переименовать next в m_next например.


А как насчет переименования set_next в fill_next ?

PD>>И кстати, тебе не кажется , что заботясь о последующих модификациях (которые то ли будут, то ли нет), ты пока что делаешь менее эффективное (например) решение для данного кода, который реально будет работать ?

A>да, такая опасность есть. однако "эффективность кода" тоже нужна не всегда.

PD>>Вот ответь на такой вопрос. В твоем коде есть лишнее действие, как отметили до меня. Предположим, выяснится по результатам профилировки, что оно отнимает существенное время, и это существенно для программы. (Разумееется, я не говорю о твоем занулении next, я вообще). И вот выясняется, что со всеми хорошими принципами вроде DRY, модульности, выделения сущностей ты переписать этот код без этого лишнего действия не можешь Вопрос же такой — останешься при принципах и проиграешь в производительности , или же махнешь рукой на принципы и напишешь без них ?


A>если нужна производительность, я напишу тот код, у которого будет большая производительность.


Почему же ты тогда отстаиваешь свое решение с лишним действием ? Да, для списка — мелочь, но вопрос же в принципе. И речь идет ведь о коде неопределенного назначения, это тебе на обработка нажатия кнопки мыши , за которой следует чтение 10Мб файла, а поэтому можно сказать, что плевать мне на эффективность самого обработчика WM_LBUTTONDOWN. А вдруг где-то именно это лишнее присваивание вызовет потерю производительности ? И что тогда ? Копаться в этом slice, понять, что там лишнее действие, переделать все (его же просто так не уберешь там) ? Сколько времени уйдет на то, чтобы это место обнаружить ? Сколько времени уйдет, чтобы это исправить (то есть переписать в том виде, который я сделал) ? За это время я тебе все next в m_next в этом классе вручную переименую

PD>>Слушай, ты это серьезно ? Если впрямь серьезно, то у меня даже слов нет. Какая-то бессмысленная схоластика в совершенно примитивной ситуации.

A>серьезно.
A>это мелочь, но какая же важная мелочь, как например однообразное форматирование кода.

У меня такое впечатление складывается, что этот внешний антураж для тебя заслоняет то, ради чего код пишется. Форматирование можно потом каким-то форматтером сделать, и будет это третьестепенным действием. А вот некачественный код никаким форматированием не поправишь.
Для меня все же конфетка важнее фантика. Фантик можно потом и переделать/заменить, а вот если в конфету горчицу положили, то никакие фантики не помогут.

Кстати, с твоим примером насчет числа сущностей в p->next = cur (4) и set_next(p.cur) (3). А не готов ли ты в таком случае возразить против такого оператора

b = -b;

Тут ведь тоже 3 сущности (b, =, -), а можно бы обойтись двумя

neg(b);

И что, будем так и писать ?

A>вообще я согласен, из сигнатуры "Item* slice(Item*& head)" сложно понять что она делает. я впихнул в эту slice слишком много ответственностей, и она получилась непонятной.


A>насчет необходимости смотреть реализацию всех функций, тут есть один важный момент.

A>если работать с кодом использующим полиморфизм, то реализации посмотреть просто невозможно,
A>будь это статический полиморфизм template<class List> void reverse(List& lst) { ... prepend(elem, lst) ...
A>или динамический полиморфизм с IList.

Давай все же определись, о чем идет речь

1. Ты изучаешь класс, коду которого доверяешь. В этом случае тебе вообще незачем смотреть на реализацию. Сигнатуры Reverse достаточно (плюс док, если надо)
2. Ты изучаешь класс, код которого хочешь понять (неважно для чего). В этом случае тебе придется смотреть весь код.
Если встретится полиморфизм, то будет гибрид. Придется в отношении полиморфных функций использовать (1), поскольку и впрямь исследовать нельзя. Так сказать, констатируем факт — здесь у нас неизвестно что, но с указанной сигнатурой и описанием действий, остается надеяться, что оно работает правильно. Принудительно заставляем доверять, так сказать. В отношении остального — либо (1) либо (2) в зависимости от того, что имеет место.
With best regards
Pavel Dvorkin
Re[14]: собеседования, Реверс списка
От: Erop Россия  
Дата: 17.10.13 07:39
Оценка:
Здравствуйте, cosimo, Вы писали:

C>Хм-хм. У меня был коллега, который писал C++ код без отступов, совсем, в столбик. После мержа приходилось прогонять исходник через code beautifier. И многие из вас не дрогнув ни единым мускулом на лице смогут работать с таким?


Ну я бы просто кнопочку в IDE бы нажал, да и всё...
Тут есть такая проблема, что если форматирование какого-то исходника всё время меняется, это плохо сказывается на истории правок.
НО если вё сводится к расстановке пробелов/табов, то вообще всё пофиг же?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: собеседования, Реверс списка
От: Erop Россия  
Дата: 17.10.13 08:43
Оценка:
Здравствуйте, Abyx, Вы писали:

E>>Суть проста. "правильное" форматирование кода нужно тока придуркам.

A>я сказал "однообразное", а не "правильное".


А на воре-то и шапочка того-с...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 17.10.13 09:20
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

A>>переименовать next в m_next например.

PD>А как насчет переименования set_next в fill_next ?

нет, переименование API происходит гораздо реже чем переименование реализации.

PD>>>И кстати, тебе не кажется , что заботясь о последующих модификациях (которые то ли будут, то ли нет), ты пока что делаешь менее эффективное (например) решение для данного кода, который реально будет работать ?

A>>да, такая опасность есть. однако "эффективность кода" тоже нужна не всегда.

PD>>>Вот ответь на такой вопрос. В твоем коде есть лишнее действие, как отметили до меня. Предположим, выяснится по результатам профилировки, что оно отнимает существенное время, и это существенно для программы. (Разумееется, я не говорю о твоем занулении next, я вообще). И вот выясняется, что со всеми хорошими принципами вроде DRY, модульности, выделения сущностей ты переписать этот код без этого лишнего действия не можешь Вопрос же такой — останешься при принципах и проиграешь в производительности , или же махнешь рукой на принципы и напишешь без них ?


A>>если нужна производительность, я напишу тот код, у которого будет большая производительность.


PD>Почему же ты тогда отстаиваешь свое решение с лишним действием ? Да, для списка — мелочь, но вопрос же в принципе. И речь идет ведь о коде неопределенного назначения, это тебе на обработка нажатия кнопки мыши , за которой следует чтение 10Мб файла, а поэтому можно сказать, что плевать мне на эффективность самого обработчика WM_LBUTTONDOWN. А вдруг где-то именно это лишнее присваивание вызовет потерю производительности ? И что тогда ? Копаться в этом slice, понять, что там лишнее действие, переделать все (его же просто так не уберешь там) ? Сколько времени уйдет на то, чтобы это место обнаружить ? Сколько времени уйдет, чтобы это исправить (то есть переписать в том виде, который я сделал) ? За это время я тебе все next в m_next в этом классе вручную переименую


компилятор уберет это лишнее присваивание.

PD>Кстати, с твоим примером насчет числа сущностей в p->next = cur (4) и set_next(p.cur) (3). А не готов ли ты в таком случае возразить против такого оператора

PD>b = -b;
PD>Тут ведь тоже 3 сущности (b, =, -), а можно бы обойтись двумя
PD>neg(b);
PD>И что, будем так и писать ?

да, я бы написал
struct Foo {
    void bar() { m_b = -m_b; }
private:
    int m_b;
};

если у Foo есть такая операция bar.

A>>вообще я согласен, из сигнатуры "Item* slice(Item*& head)" сложно понять что она делает. я впихнул в эту slice слишком много ответственностей, и она получилась непонятной.


A>>насчет необходимости смотреть реализацию всех функций, тут есть один важный момент.

A>>если работать с кодом использующим полиморфизм, то реализации посмотреть просто невозможно,
A>>будь это статический полиморфизм template<class List> void reverse(List& lst) { ... prepend(elem, lst) ...
A>>или динамический полиморфизм с IList.

PD>Давай все же определись, о чем идет речь


PD>1. Ты изучаешь класс, коду которого доверяешь. В этом случае тебе вообще незачем смотреть на реализацию. Сигнатуры Reverse достаточно (плюс док, если надо)

PD>2. Ты изучаешь класс, код которого хочешь понять (неважно для чего). В этом случае тебе придется смотреть весь код.
PD>Если встретится полиморфизм, то будет гибрид. Придется в отношении полиморфных функций использовать (1), поскольку и впрямь исследовать нельзя. Так сказать, констатируем факт — здесь у нас неизвестно что, но с указанной сигнатурой и описанием действий, остается надеяться, что оно работает правильно. Принудительно заставляем доверять, так сказать. В отношении остального — либо (1) либо (2) в зависимости от того, что имеет место.
третье. я доверяю коду класса, и я хочу понять как работает код некоторого метода.
например есть std::forward_list. я ему доверяю, он работает. но мне интересно как у него сделана reverse(), и я заглядываю внутрь ее реализации в VC++
и вижу что там используются empty, begin, before_begin, _Before_end — что они делают понятно из названия, реализацию смотреть не надо
еще там есть _Splice_same_after, смотрим ее сигнатуру — void _Splice_same_after(const_iterator _Where, _Myt& _Right, const_iterator _First, const_iterator _Last)
ок, значит она вставляет [first, last) после where, реализацию смотреть не надо
с этим знанием возвращаемся к reverse() и теперь понятно как она работает — берет элементы из начала списка и перемещает в конец.

...но тут возникает вопрос, а откуда _Before_end берет конец? смотрим ее реализацию, а там цикл. ...!@№? получается в VC++ reverse сделана со сложностью O(2N)
In Zen We Trust
Re[20]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 09:21
Оценка:
Здравствуйте, Sinix, Вы писали:

EP>>Теперь же пытаются думать задним числом, постепенно улучшая аллокатор, и добавляя костыли типа ручного вызова компактификации.

EP>>Но у C#-истов осадочек-то остался, и боятся они теперь больших объектов как огня
S>
S>Вы хоть чуть-чуть разберитесь, перед тем как писать. А то я вам тоже докажу, что c++ как огня боится перекрёстных ссылок, а haskell — мутабельных переменных

Аргументы? Хоть какие-нибудь?
Я сказал C#-исты, а не C#, и как минимум один такой(а то и несколько) тут есть — топик-то вообще начинался с векторо-фобии
Или например вот эти пользователи тоже не разобрались, наговаривают наверное?
Re[15]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 17.10.13 09:26
Оценка:
Здравствуйте, Erop, Вы писали:

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


E>>>Суть проста. "правильное" форматирование кода нужно тока придуркам.

A>>я сказал "однообразное", а не "правильное".

E>А на воре-то и шапочка того-с...


я обычно форматирую код так:

int f()
{
    return (1 + 2) * 3;
}


но при этом я спокойно могу работать с кодом типа

int
f ( ) {
    return ( 1+2 )*3;
    }


а вот если бы разные стили были перемешаны, это уже вызывает раздражение.
In Zen We Trust
Re[21]: собеседования, Реверс списка
От: Sinix  
Дата: 17.10.13 10:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Аргументы? Хоть какие-нибудь?

Выше уже разбиралось, тынц
Автор: Sinix
Дата: 15.10.13
и далее по ветке. Сдуру всё сломать можно, при начальном знании матчасти (обычно Рихтера хватает за глаза) — проблем не возникает.

EP>Я сказал C#-исты, а не C#, и как минимум один такой(а то и несколько) тут есть — топик-то вообще начинался с векторо-фобии

Второго ещё поискать придётся

EP>Или например вот эти пользователи тоже не разобрались, наговаривают наверное?

Почему наговаривают? Частично исправлено в 4.0, полностью — в 4.5. Другое дело, что грабли разбирались неоднократно. Если человек игнорирует документацию и пускает в продакшн код, который загаживает 2 поколение тонной мусора, а затем падает с OOM — кто ему виноват?
Re[16]: собеседования, Реверс списка
От: Erop Россия  
Дата: 17.10.13 10:21
Оценка:
Здравствуйте, Abyx, Вы писали:

A>а вот если бы разные стили были перемешаны, это уже вызывает раздражение.


Это просто вопрос привычки. А раздражение из-за всякой фигни -- это к доктору надо просто обратиться, а ещё лучше к психологу...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[22]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 10:36
Оценка:
Здравствуйте, Sinix, Вы писали:

EP>>Аргументы? Хоть какие-нибудь?

S>Выше уже разбиралось, тынц
Автор: Sinix
Дата: 15.10.13
и далее по ветке.


И что? Как это показывает что я в чём-то не разобрался?

S>>>Вы хоть чуть-чуть разберитесь, перед тем как писать

Конкретные аргументы будут? "Вот в этом ты не прав, потому что ... и ..."

EP>>Я сказал C#-исты, а не C#, и как минимум один такой(а то и несколько) тут есть — топик-то вообще начинался с векторо-фобии

S>Второго ещё поискать придётся

Вот, почему бы было сразу не сказать, что векторо-фобия это что-то личное Ikemefula, и все остальные с ним не согласны? Типа "мы сишарписты ребята плечисты, мы не боимся списков мясистых"

EP>>Или например вот эти пользователи тоже не разобрались, наговаривают наверное?

S>Почему наговаривают? Частично исправлено в 4.0, полностью — в 4.5. Другое дело, что грабли разбирались неоднократно.

Ну то есть они правы в том что боятся LOH?

S>Если человек игнорирует документацию и пускает в продакшн код, который загаживает 2 поколение тонной мусора, а затем падает с OOM — кто ему виноват?


Речь идёт про загаживание LOH большими объектами, с которым дела обстояли плохо вплоть до VS2008. Значит ты советуешь его не загаживать, и читать документацию, ну ок.
Но тогда объясни свой наезд:

EP>>Но у C#-истов осадочек-то остался, и боятся они теперь больших объектов как огня
S>
S>Вы хоть чуть-чуть разберитесь, перед тем как писать.

Re[15]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 17.10.13 11:06
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

A>>нет, переименование API происходит гораздо реже чем переименование реализации.

PD>set_next не API, а private method, еще не хватало его в public показывать.
нет, это API ListElement.

A>>компилятор уберет это лишнее присваивание.

PD>А это еще большой вопрос. Одни уберет, другой нет. И потом — мы же об общем принципе говорим, а не об отдельном присваивании.
общий принцип такой что компилятор всегда инлайнит небольшие функции и выкидывает мертвый код.


PD>А если Foo никакого нет ? А есть просто

PD>int x = 10;
PD>//...
PD>x = — x;

PD>И здесь заведешь

PD>void neg(int&x)
PD>{
PD> x = -x;
PD>}

PD>Замечательный стиль получится


такое тоже возможно. только это будет выглядеть примерно так

typedef int velocity;
void reverse(velocity& v) { v = -v; }

velocity v;
...
if (somethingHappen) reverse(v);


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

PD>>>1. Ты изучаешь класс, коду которого доверяешь. В этом случае тебе вообще незачем смотреть на реализацию. Сигнатуры Reverse достаточно (плюс док, если надо)

PD>>>2. Ты изучаешь класс, код которого хочешь понять (неважно для чего). В этом случае тебе придется смотреть весь код.
PD>>>Если встретится полиморфизм, то будет гибрид. Придется в отношении полиморфных функций использовать (1), поскольку и впрямь исследовать нельзя. Так сказать, констатируем факт — здесь у нас неизвестно что, но с указанной сигнатурой и описанием действий, остается надеяться, что оно работает правильно. Принудительно заставляем доверять, так сказать. В отношении остального — либо (1) либо (2) в зависимости от того, что имеет место.
A>>третье. я доверяю коду класса, и я хочу понять как работает код некоторого метода.
A>>например есть std::forward_list. я ему доверяю, он работает. но мне интересно как у него сделана reverse(), и я заглядываю внутрь ее реализации в VC++
A>>и вижу что там используются empty, begin, before_begin, _Before_end — что они делают понятно из названия, реализацию смотреть не надо
A>>еще там есть _Splice_same_after, смотрим ее сигнатуру — void _Splice_same_after(const_iterator _Where, _Myt& _Right, const_iterator _First, const_iterator _Last)
A>>ок, значит она вставляет [first, last) после where, реализацию смотреть не надо

A>>с этим знанием возвращаемся к reverse() и теперь понятно как она работает — берет элементы из начала списка и перемещает в конец.


A>>...но тут возникает вопрос, а откуда _Before_end берет конец? смотрим ее реализацию, а там цикл. ...!@№? получается в VC++ reverse сделана со сложностью O(2N)


PD>Хм... Ты же сам себе противоречишь, не замечаешь ? В _Before_end ты почему-то заглянул, а вот _Splice_same_after — реализацию, говоришь, смотреть не надо.

в _Before_end я заглянул потом, после того как разобрался с тем как работает reverse. если бы меня не заинтересовала сложность, я бы не стал в нее заглядывать.

PD>Вот тебе другой пример

PD>
PD>void process(AnyClass& p)
PD>{
PD>for(int i = 0; i < p.length; i++)
PD>  doSomething(p[i]);
PD>}
PD>


PD>Смотрим doSomething — O(1). Какова зависимость process в целом от p.length ? Можно ответить, не глядя в AnyClass::operator[] ?


нельзя. чтобы оценить сложность функции надо смотреть сложности всех ее зависимостей.
однако мы вроде говорим о понимании того как функция работает, а не об оценке ее сложности.
к слову, length может быть property, и у нее тоже может быть реализация с O(N)
In Zen We Trust
Re[23]: собеседования, Реверс списка
От: Sinix  
Дата: 17.10.13 11:29
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>И что? Как это показывает что я в чём-то не разобрался?

EP>Конкретные аргументы будут? "Вот в этом ты не прав, потому что ... и ..."

Спекуляция на тему как всё это развивалось:
В .NET есть два типа кучи — для маленьких(Small Object Heap) и больших объектов(Large Object Heap).
Во время сборки мусора SOH компактифицируется, поэтому политика аллокации может быть простейшей, например просто добавление в конец, пока не упрёмся, а потом вызываем GC.
Большие объекты, передвигать накладно, поэтому эти ребята решили добавить LOH, в которой нет компактификации. Но, политику аллокации координатно не пересмотрели.


LOH существовала с самого начала, рекомендации не бить себе молотком по пальцу тоже озвучивались неоднократно. Перечитайте статью, там в картинках расписано почему и как мы получаем фрагментацию кучи. На пальцах (x = мелкие массивы, o — большие, . — свободно):
1. ooo................ // аллоцируем большой массив 1
2. ooox............... // аллоцируем мелкий массив
3. ...xoooo........... // аллоцируем большой массив 2, массив 1 сожран GC, но места под массив 2 только в конце списка ранее аллоцированных - закидываем туда
4. ...xoooox.......... // Проблема вот тут: слишком "умный" аллокатор решает не трогать большие свободные куски и аллоцирует мелкий массив в конец 
5. ...x....xoooooo.... // повторяем
6. ...x....xoooooox... // и так до посинения


в конце у нас получится нечто вроде
...x....x.....x......x.......x........x..........x.. OuchMyMemoryException

Как, очень актуальный сценарий?

Решается, замечу, элементарно — использованием x64, аллокацией долгоживущих массивов заранее, или уменьшением количества лишних аллокаций. В большинстве реальных случаев оно работает само — аллокатор будет переиспользовать свободное пространство. По крайней мере, я за всё время работы с таким направленным отстрелом ноги не сталкивался.

Но да, поскольку политика дотнета во многом описывается как "документация? кто её читает?" — добавили костыли даже на этот случай. Как до них руки дошли.



EP>Вот, почему бы было сразу не сказать, что векторо-фобия это что-то личное Ikemefula, и все остальные с ним не согласны? Типа "мы сишарписты ребята плечисты, мы не боимся списков мясистых"

А нафига? Есть сомнения — вэлкам в профильный раздел. Отслеживать тонны трэша и личных наездов только чтобы доказать что в интернете снова кто-то неправ — дело малоприятное. Вы ещё политику и жизнь по соответствующим веткам попробуйте изучать
Re[15]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 17.10.13 11:30
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>x = — x;


PD>И здесь заведешь


PD>void neg(int&x)

PD>{
PD> x = -x;
PD>}

идея такая, если у операции есть какое-то имя, есть смысл вынести ее в отдельную функцию с этим именем.

т.е. если мы можем написать
x = -x; // do something to x
то лучше сделать комментарий кодом
do_something(x);

не обязательно чтобы эта "do_something" была реюзабельной функцией, в С++11 можно сделать локальную функцию:

auto&& rotateBy180 = [](int point) { point = -point; };
...
rotateBy180(x);


также, вместо "ListElement * newBegin = NULL; // new list" лучше сделать "List newList;"
и вместо "begin = newBegin; // replace list elements" лучше сделать "*this = newList;"
In Zen We Trust
Re[24]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 11:54
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Перечитайте статью, там в картинках расписано почему и как мы получаем фрагментацию кучи. На пальцах (x = мелкие массивы, o — большие, . — свободно):

S>[...]
S>Как, очень актуальный сценарий?

Я читал статью, и понял что происходит — вроде же очевидно по моему сообщению
Я даже несколько тестов привёл, которые показывают что такой сценарий спокойно разгуливается нормальным аллокатором — например в C++ VS2005, и в C# VS2012 — эти примеры ты пропустил?

S>Решается, замечу, элементарно — использованием x64,


Да всем известно про x64. Во всём топике идёт обсуждение x32

S>аллокацией долгоживущих массивов заранее, или уменьшением количества лишних аллокаций. В большинстве реальных случаев оно работает само — аллокатор будет переиспользовать свободное пространство. По крайней мере, я за всё время работы с таким направленным отстрелом ноги не сталкивался.


Естественно есть варианты обхода такого косяка аллокатора, я даже в конце сообщения один из вариантов показал:

EP>Кстати, по поводу боязни растущих векторов — если заменить List<byte[]>, на List<byte>, и соответственно добавлять в него всё что раньше было в блоках — байт за байтом — то даже на VS2005 получается достичь "фантастических" 511MiB, потому что будут не тысячи LO, а всего два

Но ты также его проигнорировал.

EP>>Вот, почему бы было сразу не сказать, что векторо-фобия это что-то личное Ikemefula, и все остальные с ним не согласны? Типа "мы сишарписты ребята плечисты, мы не боимся списков мясистых"

S>А нафига? Есть сомнения — вэлкам в профильный раздел. Отслеживать тонны трэша и личных наездов только чтобы доказать что в интернете снова кто-то неправ — дело малоприятное. Вы ещё политику и жизнь по соответствующим веткам попробуйте изучать

Да зачем отслеживать-то. Erop спрашивал в чём же дело, откуда у векторо-фобии ноги растут, причём в форме намного более корректной чем у оппонентов. Тут уже много C#-истов выступало и не один не сказал что векторо-фобии ни у кого кроме Ikemefula нет.

P.S. Я правильно понимаю, что вот это:

Вы хоть чуть-чуть разберитесь, перед тем как писать.

ты написал сгоряча, и никаких аргументов в поддержку своих слов привести не можешь?
Re[25]: собеседования, Реверс списка
От: Sinix  
Дата: 17.10.13 12:44
Оценка:
Здравствуйте, fddima, Вы писали:

F> Т.е. в <4.5 даже если свободные блоки были — аллокатор их более не рассматривал, если он уже был однажды отвергнут. Конечно это сильно упрощенно. И по моему где-то был более подробный пост.

Ну так на пальцах же Там тонна нюансов всплывёт если разбираться.
Re[25]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 12:52
Оценка:
Здравствуйте, fddima, Вы писали:

S>>в конце у нас получится нечто вроде

S>>
S>>...x....x.....x......x.......x........x..........x.. OuchMyMemoryException
S>>

S>>Как, очень актуальный сценарий?
F> FYI: Я уверен, ты и так в курсе, но был ещё один момент аллокатора: http://blogs.msdn.com/b/dotnet/archive/2011/10/04/large-object-heap-improvements-in-net-4-5.aspx
F>

In .NET 4.5, we made two improvements to the large object heap. First, we significantly improved the way the runtime manages the free list, thereby making more effective use of fragments. Now the memory allocator will revisit the memory fragments that earlier allocation couldn’t use. Second, when in server GC mode, the runtime balances LOH allocations between each heap. Prior to .NET 4.5, we only balanced the SOH. We’ve observed substantial improvements in some of our LOH allocation benchmarks as a result of both changes.

F> Т.е. в <4.5 даже если свободные блоки были — аллокатор их более не рассматривал, если он уже был однажды отвергнут. Конечно это сильно упрощенно. И по моему где-то был более подробный пост.

Собственно мой тест выше
Автор: Evgeny.Panasyuk
Дата: 17.10.13
как раз и показывает как улучшался .NET'ский аллокатор, на этом конкретном сценарии:

Проводим независимый тест:
VS2005: 21MiB
VS2008: 21MiB
VS2010: 622MiB
VS2012: 1738MiB
Делаем аналогичный тест на C++ VS2005: 1915MiB

Re[25]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 12:57
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Да зачем отслеживать-то. Erop спрашивал в чём же дело, откуда у векторо-фобии ноги растут, причём в форме намного более корректной чем у оппонентов. Тут уже много C#-истов выступало и не один не сказал что векторо-фобии ни у кого кроме Ikemefula нет.


А где ты фобию углядел ? Я привел конкретный сценарий и объяснил, что он повалит приложение в С++ еще быстрее, чем в дотнете. Где фобия ?
Re[14]: собеседования, Реверс списка
От: Erop Россия  
Дата: 17.10.13 12:59
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Имена функций нужна для человека, в них и надо вкладывать смысл. Если ты пишешь c = (a + b)/2 и рядом камент "//вместо медианы берем среднее арифметическое", то тебя надо выпилить из конторы как можно раньше.


А мне бы вот, например, могло бы быть интересно, что рассматривались именно эти два варианта...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[23]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 13:01
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Вот, почему бы было сразу не сказать, что векторо-фобия это что-то личное Ikemefula, и все остальные с ним не согласны? Типа "мы сишарписты ребята плечисты, мы не боимся списков мясистых"


EP>>>Или например вот эти пользователи тоже не разобрались, наговаривают наверное?

S>>Почему наговаривают? Частично исправлено в 4.0, полностью — в 4.5. Другое дело, что грабли разбирались неоднократно.

EP>Ну то есть они правы в том что боятся LOH?


С таким подходом смело можно сказать, что в С++ боятся

1 исключений
2 указателей
3 смартпоинтеров
4 деструкторов
5 конструкторов
6 лямбда-выражений
7 аллокаторов
8 виртуальных методов
9 операторов
10 шаблонов
11 STL
12 boost
... нужное вписать

Эдак выходит что С++ просто рассадник фобий, ибо на каждый пример из списка можно найти вагоны воплей "... не работает ! Всё пропало !!! просрали полимеры !!!!111расрас"

И вот что характерно — на кривые руки жалуются только сиплюсники. К чему бы это ?
Re[26]: собеседования, Реверс списка
От: fddima  
Дата: 17.10.13 13:05
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Собственно мой тест выше
Автор: Evgeny.Panasyuk
Дата: 17.10.13
как раз и показывает как улучшался .NET'ский аллокатор, на этом конкретном сценарии:

Спасибо. За потоком сообщений провтыкал.
Re[19]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 13:15
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Вкратце:

EP>есть byte[] bigBlock; и есть List<byte[]> smallBlocks;
EP>На каждой итерации вечного цикла bigBlock пересоздается с размером большим на единицу, начиная с 16 MiB,
EP>а в smallBlocks добавляется new byte[90000].
EP>После приёма OOM выводится количество занимаемых мебибайт блоками в smallBlocks.
EP>Вроде бы не слишком сложная задача для нормального аллокатора, но у автора получилось всего-навсего 20MiB.

Я про эту проблему раз пять сказал.

EP>Теперь же пытаются думать задним числом, постепенно улучшая аллокатор, и добавляя костыли типа ручного вызова компактификации.

EP>Но у C#-истов осадочек-то остался, и боятся они теперь больших объектов как огня

Большие объекты везде создают проблемы, вообще везде. На плюсовых программах я пофиксил OOM раз в десять больше, чем в дотнете, при том что дотнетом занимался несравнимо больше.
Re[24]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 13:18
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Вот, почему бы было сразу не сказать, что векторо-фобия это что-то личное Ikemefula, и все остальные с ним не согласны? Типа "мы сишарписты ребята плечисты, мы не боимся списков мясистых"

EP>>>>Или например вот эти пользователи тоже не разобрались, наговаривают наверное?
S>>>Почему наговаривают? Частично исправлено в 4.0, полностью — в 4.5. Другое дело, что грабли разбирались неоднократно.
EP>>Ну то есть они правы в том что боятся LOH?
I>С таким подходом смело можно сказать, что в С++ боятся

Ну по стартовому сообщению, вот это:

Более того, очень осторожно нужно быть со скрытыми массивами, например в инвокейшнлистах и тд и тд. Казалось бы — сделали N подсписчиков, что тут такого ?

кроме как фобией не назовёшь
Неужели в твоих "инвокейшнлистах" десятки миллионов подписчиков? Или хотя бы десятки тысяч?

Да, и кстати, если не нравиться grow-factor 2, то почему бы не попросить насяльника изменить на что-нибудь меньше золотого сечения? Или хотя бы добавить ручку для контроля?

I>Эдак выходит что С++ просто рассадник фобий, ибо на каждый пример из списка можно найти вагоны воплей "... не работает ! Всё пропало !!! просрали полимеры !!!!111расрас"


То есть ты проводишь параллель между своим отношением к List'у вот с такими воплями?
Re[25]: собеседования, Реверс списка
От: Sinix  
Дата: 17.10.13 13:21
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Я читал статью, и понял что происходит — вроде же очевидно по моему сообщению

По ёрническому тону и чрезмерным обобщениям типа "боятся они теперь больших объектов как огня" — не совсем очевидно.

EP>Я даже несколько тестов привёл, которые показывают что такой сценарий спокойно разгуливается нормальным аллокатором — например в C++ VS2005, и в C# VS2012 — эти примеры ты пропустил?

Оно и в дотнете три года как разруливается, но разборки-то продолжаются Ещё раз, чтобы отхватить описанные грабли, нужно:

1. Не читать Рихтера и ко. Статьи про опасность засорения gen 2 aka mid-life crisis выходят регулярно начиная с 2003го (это я раньше не искал).
2. Аллоцировать с достаточно большой частотой короткоживущие массивы всё возрастающих размеров вперемешку с мелкими массивами.
3. Запустить на x86.

Если человек натолкнулся на такое поведение — он скорее всего изучит наконец матчасть. Всяко полезнее, чем холиварить на 15 страниц по мелочам

EP>Естественно есть варианты обхода такого косяка аллокатора, я даже в конце сообщения один из вариантов показал:

Кстати, по поводу боязни растущих векторов — если заменить List<byte[]>, на List<byte>, и соответственно добавлять в него всё что раньше было в блоках — байт за байтом — то даже на VS2005 получается достичь "фантастических" 511MiB, потому что будут не тысячи LO, а всего два

EP>Но ты также его проигнорировал.
Тут нечего игнорировать Проблема — не в количестве LO, а в некорректной стратегии переиспользования свободных фрагментов кучи. Если религия не запрещает — можно самому увеличивать list.Capacity и занять заметно больше "фантастики" в 511 мб. Наконец, нормальные люди, если уж припёрло, просто находят (или пишут) свой ChunkedList и не парятся вообще.

EP>P.S. Я правильно понимаю, что вот это:

Вы хоть чуть-чуть разберитесь, перед тем как писать.

EP>ты написал сгоряча, и никаких аргументов в поддержку своих слов привести не можешь?
Ну блин... тема жёвана-пережёвана кучу лет уже, и по серьёзности сопоставима с "табы vs пробелы", "как использовать c# без дотнета", "а-а-а-а, ФП не позволяет мутабельные переменные" или "перекрёстные ссылки в c++ — это печаль и плохо". У любого, кто вплотную сталкивался с сборкой мусора при ограниченном АП, куда больше вопросов насчёт засорения старшего поколения, вот это иногда действительно проблематично разруливать.
Re[25]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 13:24
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Ну по стартовому сообщению, вот это:

EP>

EP>Более того, очень осторожно нужно быть со скрытыми массивами, например в инвокейшнлистах и тд и тд. Казалось бы — сделали N подсписчиков, что тут такого ?

EP>кроме как фобией не назовёшь

Это необходимое зание инструмента с которым работаешь. А то можно и дальше пойти — "аккуратная работа с указателями" == "фобия", "правильное использование смартпоинтеров == фобия".

EP>Неужели в твоих "инвокейшнлистах" десятки миллионов подписчиков? Или хотя бы десятки тысяч?


Я уже раз пять давал ответ.

EP>Да, и кстати, если не нравиться grow-factor 2, то почему бы не попросить насяльника изменить на что-нибудь меньше золотого сечения? Или хотя бы добавить ручку для контроля?


Я этот же вопрос задавал, если ты читать конечно умеешь.

I>>Эдак выходит что С++ просто рассадник фобий, ибо на каждый пример из списка можно найти вагоны воплей "... не работает ! Всё пропало !!! просрали полимеры !!!!111расрас"


EP>То есть ты проводишь параллель между своим отношением к List'у вот с такими воплями?


Не я, а ты.
Re[20]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 13:24
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Вкратце:

EP>>есть byte[] bigBlock; и есть List<byte[]> smallBlocks;
EP>>На каждой итерации вечного цикла bigBlock пересоздается с размером большим на единицу, начиная с 16 MiB,
EP>>а в smallBlocks добавляется new byte[90000].
EP>>После приёма OOM выводится количество занимаемых мебибайт блоками в smallBlocks.
EP>>Вроде бы не слишком сложная задача для нормального аллокатора, но у автора получилось всего-навсего 20MiB.
I>Я про эту проблему раз пять сказал.

Я видел. Но ты вроде ничего сказал про то, что в VS2010 и VS2012 с этим намного лучше. Или я пропустил?
Мои примеры показывают то, что в первую очередь проблема в плохом аллокаторе. Который уже пофиксили (по крайней мере для этого сценария).
И многие могли приобрести фобии больших объектов после того как обожглись ими на старых версиях.

EP>Теперь же пытаются думать задним числом, постепенно улучшая аллокатор, и добавляя костыли типа ручного вызова компактификации.
EP>Но у C#-истов осадочек-то остался, и боятся они теперь больших объектов как огня

Re[21]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 13:32
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Я видел. Но ты вроде ничего сказал про то, что в VS2010 и VS2012 с этим намного лучше. Или я пропустил?


Конкретно в одном сценарии лучше, но есть и другие.

EP>Мои примеры показывают то, что в первую очередь проблема в плохом аллокаторе. Который уже пофиксили (по крайней мере для этого сценария).


Это прям Капитан Очевидность сообщает. Когда выходил дотнет, было слишком мало сведений о том, куда и как надо GC допиливать.
Скажем, для тех времен типичное поведение какой нибудь плюсовой качалки или плейера было довольно простым — за ночь выюзывает всю память и дохнет.
На этом фоне GC практически прорыв в разработке под винду.

EP>И многие могли приобрести фобии больших объектов после того как обожглись ими на старых версиях.

EP>

EP>>Теперь же пытаются думать задним числом, постепенно улучшая аллокатор, и добавляя костыли типа ручного вызова компактификации.
EP>>Но у C#-истов осадочек-то остался, и боятся они теперь больших объектов как огня


А в с++ многие до сих пор считают, что динамическая аллокация в С++ это чтото очень медленное и проблемное, ибо обжглись с этим неоднократно.
Re[26]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 13:49
Оценка:
Здравствуйте, Sinix, Вы писали:

EP>>Я читал статью, и понял что происходит — вроде же очевидно по моему сообщению

S>По ёрническому тону и чрезмерным обобщениям типа "боятся они теперь больших объектов как огня" — не совсем очевидно.

Весь топик про то, "какие опасные List'ы". Я в своём сообщении попытался разобраться в чём же дело.
Вполне вероятно, что дело было в плохом аллокаторе.

S>Оно и в дотнете три года как разруливается, но разборки-то продолжаются


Так разборки начали .NET'чики с боязни больших объектов и List'ов. Видимо они не в курсе что разруливается — пришлось самому пример делать

S>Ещё раз, чтобы отхватить описанные грабли, нужно:

S>Если человек натолкнулся на такое поведение — он скорее всего изучит наконец матчасть. Всяко полезнее, чем холиварить на 15 страниц по мелочам

Я же не говорю что так нужно писать код, или что проблему нельзя обойти. Это пример является demo того, что был плохой аллокатор, и многие на нём могли обжечся

S>Тут нечего игнорировать Проблема — не в количестве LO, а в некорректной стратегии переиспользования свободных фрагментов кучи. Если религия не запрещает — можно самому увеличивать list.Capacity и занять заметно больше "фантастики" в 511 мб.


Это не лучший способ решения проблемы, я просто показываю, что List, которого тут так боятся, как раз наоборот, в некоторых случаях может улучшить ситуацию с фрагментацией.

S>Наконец, нормальные люди, если уж припёрло, просто находят (или пишут) свой ChunkedList и не парятся вообще.


О, кстати. Я спрашивал про аналог C++1998 std::deque — мне пытались впарить LinkedList
Автор: Evgeny.Panasyuk
Дата: 15.10.13
под видом деки. Может ты покажешь какую деку обычно используют в .NET — ведь должно же быть что-то стандартное, или распространённое, раз с List'ом такой ужас-ужас.

EP>>P.S. Я правильно понимаю, что вот это:

S>

S>Вы хоть чуть-чуть разберитесь, перед тем как писать.

EP>>ты написал сгоряча, и никаких аргументов в поддержку своих слов привести не можешь?
S>Ну блин... тема жёвана-пережёвана кучу лет уже, и по серьёзности сопоставима с "табы vs пробелы", "как использовать c# без дотнета", "а-а-а-а, ФП не позволяет мутабельные переменные" или "перекрёстные ссылки в c++ — это печаль и плохо". У любого, кто вплотную сталкивался с сборкой мусора при ограниченном АП, куда больше вопросов насчёт засорения старшего поколения, вот это иногда действительно проблематично разруливать.

Ещё раз, я не говорил что у проблемы нет решения. На протяжении всего топика Erop пытался выяснить, как там дела обстоят с фрагментацией, почему так боятся List'ов — вроде никто не упомянул что раньше аллокатор был ужасный, но начиная с VS2010 с фрагментацией намного меньше проблем — что собственно и показывает мой пример.
Видимо ты увидел в моём сообщении "наезд на твой любимый C#", и кинулся его защищать не разобравшись, мол проблема решается, читайте доки, да и вообще "Вы хоть чуть-чуть разберитесь, перед тем как писать."
Re[27]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 13:58
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Весь топик про то, "какие опасные List'ы". Я в своём сообщении попытался разобраться в чём же дело.


Весь топик про конкретный список, более того, сказано что это нетипичный случай и сказано, когда выплывает проблема. Ты как то ухитряешься по особенному читать, наверное в тебя Егор вселился.

S>>Наконец, нормальные люди, если уж припёрло, просто находят (или пишут) свой ChunkedList и не парятся вообще.


EP>О, кстати. Я спрашивал про аналог C++1998 std::deque — мне пытались впарить LinkedList
Автор: Evgeny.Panasyuk
Дата: 15.10.13
под видом деки. Может ты покажешь какую деку обычно используют в .NET — ведь должно же быть что-то стандартное, или распространённое, раз с List'ом такой ужас-ужас.


Стандартной нет. Я вот сам писал.
Re[15]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 14:16
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Имена функций нужна для человека, в них и надо вкладывать смысл. Если ты пишешь c = (a + b)/2 и рядом камент "//вместо медианы берем среднее арифметическое", то тебя надо выпилить из конторы как можно раньше.


E>А мне бы вот, например, могло бы быть интересно, что рассматривались именно эти два варианта...


То есть, ты сам для себя в коде напоминалки пишешь ? А кому они нужны кроме тебя ?
Re[16]: собеседования, Реверс списка
От: Erop Россия  
Дата: 17.10.13 14:55
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>То есть, ты сам для себя в коде напоминалки пишешь ? А кому они нужны кроме тебя ?

Ага, а ещё доказательства его работоспособности и т. п.
Нужно это тем коллегам, которые потом этот код поддерживают, например...
И интереснее всего мне было бы узнать, что медиану рассматривали, но отвергли именно В ЧУЖОМ коде...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[17]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 14:59
Оценка:
Здравствуйте, Erop, Вы писали:

I>>То есть, ты сам для себя в коде напоминалки пишешь ? А кому они нужны кроме тебя ?

E>Ага, а ещё доказательства его работоспособности и т. п.
E>Нужно это тем коллегам, которые потом этот код поддерживают, например...
E>И интереснее всего мне было бы узнать, что медиану рассматривали, но отвергли именно В ЧУЖОМ коде...

То есть, информации заведомо больше, чем можно поместить в коментарии ?
Re[18]: собеседования, Реверс списка
От: Erop Россия  
Дата: 17.10.13 15:13
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>То есть, информации заведомо больше, чем можно поместить в коментарии ?

Что за проблемы с помещением инфы в комментарии?

Вот, в частности, твой пример с медианой. Я так понимаю, что из кода тот факт, что медиану отвергли вообще не восстанавливается, а вот в твоём комментарии не хватает причины.
То есть правильный коммент был бы примерно такой:
//Используем среднее арифметическое, вместо медианы, потому, что медиану долго искать. 
//Оценку вносимой ошибки смотри в документе таком-то.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[28]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 15:25
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Весь топик про то, "какие опасные List'ы". Я в своём сообщении попытался разобраться в чём же дело.

I>Весь топик про конкретный список, более того, сказано что это нетипичный случай и сказано, когда выплывает проблема. Ты как то ухитряешься по особенному читать, наверное в тебя Егор вселился.

Сколько вас там? Это
Автор: Ikemefula
Дата: 09.10.13
ты писал:

I>2 паттерн ниже встречается слишком часто, при чем список часто состоит в т.ч. из структур и размеры >миллиона
I>

I>var list = new List<Item>();
I>while (condition())
I>{
I>  list.Add(current());
I>}
I>

?
Re[26]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 15:33
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Ну по стартовому сообщению, вот это:

EP>>

EP>>Более того, очень осторожно нужно быть со скрытыми массивами, например в инвокейшнлистах и тд и тд. Казалось бы — сделали N подсписчиков, что тут такого ?

EP>>кроме как фобией не назовёшь
I>Это необходимое зание инструмента с которым работаешь. А то можно и дальше пойти — "аккуратная работа с указателями" == "фобия", "правильное использование смартпоинтеров == фобия".
EP>>Неужели в твоих "инвокейшнлистах" десятки миллионов подписчиков? Или хотя бы десятки тысяч?
I>Я уже раз пять давал ответ.

Где?
Так сколько в твоих "инвокейшнлистах" подписчиков, что это вызывает проблему?
Re[29]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 15:42
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Сколько вас там? Это
Автор: Ikemefula
Дата: 09.10.13
ты писал:

EP>

I>>2 паттерн ниже встречается слишком часто, при чем список часто состоит в т.ч. из структур и размеры >миллиона

?


Ты выкусываешь только удобные лично для тебя аргументы, я не раз и не два писал следующее

"Проблема актуальная для больших приложений в архитектуре навроде x86, где АП ограничено — всего 2гб, но в силу естественной фрагментации размер непрерывного отрезка АП может быть намного меньше, в 10 и более раз"
Re[30]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 15:53
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>"Проблема актуальная для больших приложений в архитектуре навроде x86, где АП ограничено — всего 2гб, но в силу естественной фрагментации размер непрерывного отрезка АП может быть намного меньше, в 10 и более раз"


Как показывает простейший тест естественная фрагментация стала действительно "естественной", а не следствием дубового аллокатора, только начиная с VS2012
Re[31]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 16:09
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>"Проблема актуальная для больших приложений в архитектуре навроде x86, где АП ограничено — всего 2гб, но в силу естественной фрагментации размер непрерывного отрезка АП может быть намного меньше, в 10 и более раз"


EP>Как показывает простейший тест естественная фрагментация стала действительно "естественной", а не следствием дубового аллокатора, только начиная с VS2012


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

Пойми простую вещь, если летом погода хорошая, то это вовсе не значит, что зимой она плохая. И там и там условия естественные, но зимой холодно, а летом — жарко.
Re[32]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 16:21
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>"Проблема актуальная для больших приложений в архитектуре навроде x86, где АП ограничено — всего 2гб, но в силу естественной фрагментации размер непрерывного отрезка АП может быть намного меньше, в 10 и более раз"

EP>>Как показывает простейший тест естественная фрагментация стала действительно "естественной", а не следствием дубового аллокатора, только начиная с VS2012
I>Естественная фрагментация это следствтие работы системы в естественных условиях в конкретном случае: рантайм, винда, данные пользователя и тд и тд.

Опять терминологический спор. Ну ок: как показывает простейший тест естественна фрагментация стала намного благоприятней в следствии замены дубового аллокатора начиная с VS2012
Теперь списков на x86 меньше боишься?
Re[34]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 18:13
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Задав капасити, можно обработать список равный размеру свободной памяти. Без этого будет втрое меньше и это фрагментация в чистом виде.


Это не фрагментация, это в первую очередь отсутствие памяти. Даже при полном отсутствии всякой фрагментации, у тебя capacity не сможет вырасти в два раза, когда ты уже съел треть памяти, хоть ты тресни. Тебе уже это на протяжении нескольких страниц объясняли

I>То есть, эта проблема общая для любых приложений на любых языках, которые расходуют память в объемах сравнимых с размером адресного пространства.


Ты рассказывал про конкретные приложения, которые падали в неожиданных местах, и приходилось долго чесать репу, так?
Где это было, в какой среде? Случаем не в C# <=VS2008?

I>Для случаев без GC все получается гораздо хуже, именно с этой конкретной проблемой, дефрагментации у тебя нет и быть не может. То есть, все еще хуже чем с GC.


Как будто в .NET <4.5.1 есть дефрагментация LOH

I>Отсюда следствие — как бы ты ни приседал с аллокацией , эта же проблема возникнет в любом языке, для любого контейнера на массиве, в котором grow factor == 2 без реаллокации, и в который добавление идет по одному элементу без задания начальной капасити. В идеальном случае можно выделить AП/3. Реально будет максимально доступное окно поделить на три.


Наконец-то ты смог осилить вот эту задачку
Автор: Evgeny.Panasyuk
Дата: 14.10.13
. А раньше ведь спрашивал, "откуда 3x"
Автор: Ikemefula
Дата: 14.10.13
Молодец, возьми с полки пирожок.
Какое озарение будет следующим?

I>Все проги без GC уже сваливаются. GC продолжит сопротивляться, будет гонять объекты по адресному пространству, что влечет за собой жосцкий своп.


Что там у тебя будет GC по LOH'у гонять?
Re[34]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 18:40
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Если N объектов в списке коррелирует с Е количеством объектов в системе, то на ровном месте получается плохая зависимость, т.к. время работы GC это O(E+V), где E количетсво объхектов, V количество ссылок между ними.

I>Итого, N коррелирует с E и это значит, что нагрузка на GC будет практически N^2.

1. "Сегодня утром пролетело 4 птицы, значит завтра будет дождь" — Я не уследил за твоими напёрстками откуда у тебя получилось "практически N^2"
2. Миллионный List из Point3D — это тоже ужас-ужас в квадрате?
Re[23]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 17.10.13 18:41
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Речь идёт про загаживание LOH большими объектами, с которым дела обстояли плохо вплоть до VS2008.


Стоит начать хотя бы с понимания того факта, что рантайм (и поведение GC) от версии студии практически никак не зависит. Свежевышедшая vs2013 по прежнему позволяет писать под рантайм образца 2005 года.
Re[24]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 18:47
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>Речь идёт про загаживание LOH большими объектами, с которым дела обстояли плохо вплоть до VS2008.

НС>Стоит начать хотя бы с понимания того факта, что рантайм (и поведение GC) от версии студии практически никак не зависит.

Это очень важный факт, который меняет в корне всю дискуссию. Когда делал примеры — выбирал максимально доступный Runtime.
Расскажи лучше как в VS2008 выбрать .NET 4.0
Re[11]: собеседования, Реверс списка
От: koodeer  
Дата: 17.10.13 19:09
Оценка:
Здравствуйте, Marty, Вы писали:

M>Когда и как часто надо дергать за Dispose-костыли, апологеты GC нам тут конечно ничего не скажут, это не в их интересах


Dispose-костыли в управляемой среде предназначены в основном для решения проблем с нативным кодом.
Re[36]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 19:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Представь — есть 1гб список и АП 2гб, условно — больше никто не юзает память и АП. Выделяешь список с капасити 1гб, делаешь реверс и отдыхаешь. Вот больше 1гб не получится и вот это уже НЕ фрагментация, а тупо нехватка памяти. Все что сваливается меньше 1гб это фрагментация.


[ | | | | | | | | | | | | | |*|*|*|*|*|*|*|*]
* — занятное List'ом, пробел — свободное.
Попробуй увеличь capacity вдвое — и покажи где тут фрагментация

EP>>Где это было, в какой среде? Случаем не в C# <=VS2008?

I>Начиная с TP5.5-BP7.0, потом TC2.0-BC3.1, Watcom C, потом VS 97 и заканчивая VS 2012, примерно так Вот на ассемблере этого не было, динамику как то не сильно использовал, извини.

Ты же про C# говорил
Автор: Ikemefula
Дата: 10.10.13
и его списки? Зачем про Паскаль загоняешь?

I>>>Для случаев без GC все получается гораздо хуже, именно с этой конкретной проблемой, дефрагментации у тебя нет и быть не может. То есть, все еще хуже чем с GC.

EP>>Как будто в .NET <4.5.1 есть дефрагментация LOH
I>Там про GC вообще, а не конкретный.

А зачем не про конкретный, если топик начался с конкретных List'ов и конкретного C#'а?

I>>>Отсюда следствие — как бы ты ни приседал с аллокацией , эта же проблема возникнет в любом языке, для любого контейнера на массиве, в котором grow factor == 2 без реаллокации, и в который добавление идет по одному элементу без задания начальной капасити. В идеальном случае можно выделить AП/3. Реально будет максимально доступное окно поделить на три.


EP>>Наконец-то ты смог осилить вот эту задачку
Автор: Evgeny.Panasyuk
Дата: 14.10.13
. А раньше ведь спрашивал, "откуда 3x"
Автор: Ikemefula
Дата: 14.10.13
Молодец, возьми с полки пирожок.

EP>>Какое озарение будет следующим?
I>Удивляюсь, как ты читать умеешь. У вектора grow factor 1.5, откуда 3 взялось ? Хотя, может ты 1.5 до 2х округляешь, извини, не в курсе новых тенденций в арифметике

Не, не прокатит отмазка. У вектора grow factor не оговорен стандартом
А твой ответ показывал полное не понимание:

V>>Если в тесте после грубо 660 метров не удалось выделить память, то это значит, что всего было запрошено порядка 660*3=1980 метров. ЧТД.
i>А почему на три надо помножать, если добавляем по одному байту ?

Тут нет ничего про 1.5x, тут есть "добавляем по одному байту"
Re[22]: собеседования, Реверс списка
От: Erop Россия  
Дата: 17.10.13 19:26
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Не надо ничего размножать — доки находятся в единственном экземпляре на сервере в вики, конфлюэнце или шарепоинте. Надо модифировать фичу — берешь за основу старую версию, копируешь в фолдер новой версии и пишешь туда все что тебе надо.


Это и есть размножать... Если потом понадобится ещё и мержить правки в коде, то надо будет не забыть смёржить и доки, да ещё и сделать это корректно, кстати...

I>Для наукоемкой особенно актуальна интеграция VCS, трекера и документации, иначе вспотеешь контролировать все вырожденые случаи. для тупо технического проекта вообще никакой документации может не быть, потому что как правило все и так в теме или все есть в гугле.


Ну кто потеет, а кто без проблем контролирует...

I>Мелкие вещи тоже надо тестировать. Объясни, каким раком тестировщики смогут покрыть твою мульку ручными/автоматическими тестами ?


Это никак не связано с тем, что ты где-то должен объяснить поддерживающим код коллегам ПРИЧИНЫ принятых в коде решений...

Про тестировать -- тема отдельная.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[26]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 19:35
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>Это очень важный факт, который меняет в корне всю дискуссию. Когда делал примеры — выбирал максимально доступный Runtime.

НС>Нет, это демонстрация того, что ыт полностью не в теме.

Ещё один
Давай, рассказывай, где именно не в теме. Может "полностью не в теме" про LinkedList
Автор: Evgeny.Panasyuk
Дата: 15.10.13
? А главное расскажи как бы это помогло всем этим людям в своё время.

EP>>Расскажи лучше как в VS2008 выбрать .NET 4.0

НС>http://msdn.microsoft.com/en-us/library/w4atty68.aspx

http://stackoverflow.com/questions/1986287/visual-studio-2008-support-for-new-net-4/1986317#1986317
http://stackoverflow.com/questions/1202289/is-it-possible-to-use-c-sharp-4-0-with-visual-studio-2008/1202298#1202298
Re[35]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 20:05
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Если N объектов в списке коррелирует с Е количеством объектов в системе, то на ровном месте получается плохая зависимость, т.к. время работы GC это O(E+V), где E количетсво объхектов, V количество ссылок между ними.

I>>Итого, N коррелирует с E и это значит, что нагрузка на GC будет практически N^2.

EP>1. "Сегодня утром пролетело 4 птицы, значит завтра будет дождь" — Я не уследил за твоими напёрстками откуда у тебя получилось "практически N^2"


Элементарно — на добавление N элементов надо будет переместить N элментов в АП

EP>2. Миллионный List из Point3D — это тоже ужас-ужас в квадрате?


Не в курсе что это такое
Re[36]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 20:13
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Если N объектов в списке коррелирует с Е количеством объектов в системе, то на ровном месте получается плохая зависимость, т.к. время работы GC это O(E+V), где E количетсво объхектов, V количество ссылок между ними.

I>>>Итого, N коррелирует с E и это значит, что нагрузка на GC будет практически N^2.
EP>>1. "Сегодня утром пролетело 4 птицы, значит завтра будет дождь" — Я не уследил за твоими напёрстками откуда у тебя получилось "практически N^2"
I>Элементарно — на добавление N элементов надо будет переместить N элментов в АП

Подробнее.

EP>>2. Миллионный List из Point3D — это тоже ужас-ужас в квадрате?

I>Не в курсе что это такое

Структура с тремя double.
Re[12]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 20:21
Оценка:
Здравствуйте, koodeer, Вы писали:

M>>Когда и как часто надо дергать за Dispose-костыли, апологеты GC нам тут конечно ничего не скажут, это не в их интересах

K>Dispose-костыли в управляемой среде предназначены в основном для решения проблем с нативным кодом.

Например таких?
using (var connection = new SqlConnection(connectionString))
{
    // ...
    foo_may_throw();
    // ...
}
Re[13]: собеседования, Реверс списка
От: koodeer  
Дата: 17.10.13 21:34
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Например таких?

EP>
EP>using (var connection = new SqlConnection(connectionString))
EP>{
EP>    // ...
EP>    foo_may_throw();
EP>    // ...
EP>}
EP>


В данном случае используется неуправляемый ресурс — коннекшн к БД. Вот для его корректного освобождения и нужен диспоуз.
Re[14]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 21:40
Оценка:
Здравствуйте, koodeer, Вы писали:

K>>>Dispose-костыли в управляемой среде предназначены в основном для решения проблем с нативным кодом.

EP>>Например таких?
EP>>
EP>>using (var connection = new SqlConnection(connectionString))
EP>>{
EP>>    // ...
EP>>    foo_may_throw();
EP>>    // ...
EP>>}
EP>>

K>В данном случае используется неуправляемый ресурс — коннекшн к БД. Вот для его корректного освобождения и нужен диспоуз.

А сколько по-твоему "управляемых" ресурсов? И все ли неуправляемые ресурсы как-то связанны с нативным кодом, или всё-таки большинство существуют сами по себе?
Re[19]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 17.10.13 21:42
Оценка:
Здравствуйте, Erop, Вы писали:

A>>эм... вообще-то доказательством работоспособности может быть только (юнит)тест


E>Про проблему останова слыхал? Так вот, одно из следствий состоит в том, что никакой тест не может гарантировать работоспособности. Но в некоторых случаях некоторые специально написанные алгоритмы можно доказать ФОРМАЛЬНО, это если требуется такой уровень надёжности.


проблема останова это конечно сильный аргумент, но на практике почти весь код можно протестировать.
собственно мы все работаем не над сферическими алгоритмами в вакууме, а над конкретными программами, с конкретным набором фич.
эти фичи практически всегда можно протестировать вручную, а можно протестировать автоматически.
In Zen We Trust
Re[23]: собеседования, Реверс списка
От: Abyx Россия  
Дата: 17.10.13 21:44
Оценка:
Здравствуйте, Erop, Вы писали:

E>Я, кстати, часто распечатки вообще читаю, ну, например, выхожу из дома в лес, сажусь на пинёк и читаю, что там у нас такого интересного напрограммировалось, что всё так неожиданно плохо...


купи планшет, дешевле будет чем бумагу и картриджи переводить.
In Zen We Trust
Re[23]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 21:50
Оценка:
Здравствуйте, Erop, Вы писали:

E>Я, кстати, часто распечатки вообще читаю, ну, например, выхожу из дома в лес, сажусь на пинёк и читаю, что там у нас такого интересного напрограммировалось, что всё так неожиданно плохо...


Я ж говорю — колхоз. Есть вещи более эффективные нежели твои бумажки.
Re[37]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 22:10
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Представь — есть 1гб список и АП 2гб, условно — больше никто не юзает память и АП. Выделяешь список с капасити 1гб, делаешь реверс и отдыхаешь. Вот больше 1гб не получится и вот это уже НЕ фрагментация, а тупо нехватка памяти. Все что сваливается меньше 1гб это фрагментация.


EP>[ | | | | | | | | | | | | | |*|*|*|*|*|*|*|*]

EP>* — занятное List'ом, пробел — свободное.
EP>Попробуй увеличь capacity вдвое — и покажи где тут фрагментация

Объясняю еще раз — если задаешь правильный капасити не надо ничего увеличивать. Надо 1гб — поставь точно такой же капасити, реаллокаций не будет, а следовательно GC не надо будеть гонять объекты по АП.


EP>>>Где это было, в какой среде? Случаем не в C# <=VS2008?

I>>Начиная с TP5.5-BP7.0, потом TC2.0-BC3.1, Watcom C, потом VS 97 и заканчивая VS 2012, примерно так Вот на ассемблере этого не было, динамику как то не сильно использовал, извини.

EP>Ты же про C# говорил
Автор: Ikemefula
Дата: 10.10.13
и его списки? Зачем про Паскаль загоняешь?


Потому что фрагментация вылазит всегда и везде, когда потребление памяти близко к размеру АП. Когда софт дорастет до границ х64, то там тоже вылезет проблема с фрагментацией. Радикально решить можно будет толко увеличением АП, то есть, переходом на 128 бит, а потом на 256 и так далее. Правда, есть шанс, что солнце погаснет раньше, чем мейнстрим дорастет до такой разрядности.

I>>Там про GC вообще, а не конкретный.


EP>А зачем не про конкретный, если топик начался с конкретных List'ов и конкретного C#'а?


Это что бы ты понял, про что речь и не лез ко мне с дурацкими аргументами про 3 и вектор.

EP>Не, не прокатит отмазка. У вектора grow factor не оговорен стандартом


Я не в курсе стандартов, вы его тут указали как 1.5, вот от него и считаю. А у тебя снова получается, что grow factor какой то очень удобный — 1.5, 2, "не оговорен стандартом", очень удобный аргумент.

EP>А твой ответ показывал полное не понимание:

EP>

V>>>Если в тесте после грубо 660 метров не удалось выделить память, то это значит, что всего было запрошено порядка 660*3=1980 метров. ЧТД.
i>>А почему на три надо помножать, если добавляем по одному байту ?

EP>Тут нет ничего про 1.5x, тут есть "добавляем по одному байту"

Это специально для vdimas. Я ожидал от него чтото навроде "Ага ! Попался, двоечник !!! байты ни при чем !!!!111расрас" и на тот момент у меня был заготовлен более интересный троллинг
Re[38]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 22:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Подробнее.


I>Все предельно просто — случай когда количество всех объектов сильно зависит от этого N, например, добавляем тупо новые объекты, длина списка так же зависит от N.

I>Соответсвенно при наличии фрагментации нужно будет бегать по всему графу объектов, так как GC заранее не знает, что ему делать. Это уже само по себе N * log(N) если считать только сами объекты без ссылок на них, т.к. количество аллокаций только для списка это log(N). Перемещать нужно будет так же количество элментов, которое зависит от N, хоть и слабее и это будет или N или log(N). + если в дело вступит своп, то это бедствие. Выглядит на UI примерно так — приложение морозит полчаса и потом работает какое то время нормально, а иногда и дохнет от ООМ.

Я чучка погорячился про квадратичность, но сути это не меняет. N*log(N) с подключением свопа мало чем отличается для обсуждаемого размера АП.
Re[15]: собеседования, Реверс списка
От: koodeer  
Дата: 17.10.13 22:14
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>А сколько по-твоему "управляемых" ресурсов? И все ли неуправляемые ресурсы как-то связанны с нативным кодом, или всё-таки большинство существуют сами по себе?


Точные оценки давать не берусь.
Проблема в том, что управляемый код работает поверх неуправляемого. Это никак не исправить. Поэтому костыли Dispose.
Вот если бы стала мейнстримом ОС наподобие Singularity, изначально разрабатывавшаяся на управляемой платформе, вот там вполне могло бы не быть таких проблем. Но это из области фантастики.
Re[38]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 22:17
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Элементарно — на добавление N элементов надо будет переместить N элментов в АП

EP>>Подробнее.
I>Все предельно просто — случай когда количество всех объектов сильно зависит от этого N, например, добавляем тупо новые объекты, длина списка так же зависит от N.
I>Соответсвенно при наличии фрагментации нужно будет бегать по всему графу объектов, так как GC заранее не знает, что ему делать. Это уже само по себе N * log(N) если считать только сами объекты без ссылок на них, т.к. количество аллокаций только для списка это log(N).

При push_back'е элемент за элементом, без предварительного reserve сложность получается O(N).
Например, нужно 16 элементов, grow factor=2:
1
2
4
8

16
На каждой реаллокации происходит пробежка по все текущим элементам (это либо copy/move constructor в C++, либо Mark у GC — не суть).
Числа выше сможешь просуммировать?

I>Перемещать нужно будет так же количество элментов, которое зависит от N, хоть и слабее и это будет или N или log(N). + если в дело вступит своп, то это бедствие. Выглядит на UI примерно так — приложение морозит полчаса и потом работает какое то время нормально, а иногда и дохнет от ООМ.


Ты не то что "практически N^2", а даже O(N * log(N)) не показал

EP>>>>2. Миллионный List из Point3D — это тоже ужас-ужас в квадрате?

I>>>Не в курсе что это такое
EP>>Структура с тремя double.
I>Это 50мб данных одним окном. В большом приложении на х32 это уже проблемный размер.

В структуре 3*8 байт, миллион структур. Откуда 50MB нарисовались?
Re[39]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 22:19
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Я чучка погорячился про квадратичность, но сути это не меняет. N*log(N) с подключением свопа мало чем отличается для обсуждаемого размера АП.


Ну ты даже O(N*log(N)) не показал. То о чём ты говоришь это O(N).
Re[16]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 22:21
Оценка:
Здравствуйте, koodeer, Вы писали:

K>Проблема в том, что управляемый код работает поверх неуправляемого. Это никак не исправить. Поэтому костыли Dispose.

K>Вот если бы стала мейнстримом ОС наподобие Singularity, изначально разрабатывавшаяся на управляемой платформе, вот там вполне могло бы не быть таких проблем. Но это из области фантастики.

И что, в такой OS не будет файлов, мьютексов, соединений?
Re[39]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 22:27
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Числа выше сможешь просуммировать?


Я уже две недели по 12 часов без выходных работаю

EP>>>Структура с тремя double.

I>>Это 50мб данных одним окном. В большом приложении на х32 это уже проблемный размер.

EP>В структуре 3*8 байт, миллион структур. Откуда 50MB нарисовались?


У меня в проекте аналогичные структуры выровнены на границу 16 байт Ну будет 24мб если что, это попроще, но тоже не факт ,что всегда будет такое окно.
Re[40]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.13 22:33
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Я чучка погорячился про квадратичность, но сути это не меняет. N*log(N) с подключением свопа мало чем отличается для обсуждаемого размера АП.


EP>Ну ты даже O(N*log(N)) не показал. То о чём ты говоришь это O(N).


Кстати, GC будет дергаться даже во время размещения новых элементов. Не сильно в курсе, как происходит переход из поколения в поколение, но факт, что GC будет вызываться чаще чем log(N)
Re[41]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 22:42
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Я чучка погорячился про квадратичность, но сути это не меняет. N*log(N) с подключением свопа мало чем отличается для обсуждаемого размера АП.

EP>>Ну ты даже O(N*log(N)) не показал. То о чём ты говоришь это O(N).
I>O(log(N)) аллокаций массива в списке, для каждой из них надо пробежать граф из O(N) элементов
I>Сколько это по твоему ?

Выделенное неверно.
Аллокаций действительно O(log(N)), вот только на каждой нужно пробежать по количеству зависящему от номера текущей аллокации, а не от общего числа элементов.
Без разницы, что ты добавляет 128 элементов, что 65536 — на первых реалокациях (допустим на первых 6) — нужно пробежать одинаковое колличество элементов, независящее от N.

Суммарная дистанция пробега для заполнения N элементами будет суммой первых O(log(N)) членов геометрической прогрессии:
(1 — grow_factor^( log(N)/log(grow_factor) )) / (1 — grow_factor)
если упростить степень, то останентся: (1 — N) / (1 — grow_factor)
то есть O(N).
Re[17]: собеседования, Реверс списка
От: koodeer  
Дата: 17.10.13 22:49
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>И что, в такой OS не будет файлов, мьютексов, соединений?


Я полагаю, в изначально управляемой среде их можно сделать такими, что среда будет полностью отслеживать их использование, и автоматически удалять/закрывать/освобождать.
Re[18]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 23:12
Оценка:
K>Я полагаю, в изначально управляемой среде их можно сделать такими, что среда будет полностью отслеживать их использование, и автоматически удалять/закрывать/освобождать.

Или например как создавать свои ресурсы? Как сказать системе что делать при их закрытии?
Re[38]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 17.10.13 23:23
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Представь — есть 1гб список и АП 2гб, условно — больше никто не юзает память и АП. Выделяешь список с капасити 1гб, делаешь реверс и отдыхаешь. Вот больше 1гб не получится и вот это уже НЕ фрагментация, а тупо нехватка памяти. Все что сваливается меньше 1гб это фрагментация.

EP>>[ | | | | | | | | | | | | | |*|*|*|*|*|*|*|*]
EP>>* — занятное List'ом, пробел — свободное.
EP>>Попробуй увеличь capacity вдвое — и покажи где тут фрагментация
I>Объясняю еще раз — если задаешь правильный капасити не надо ничего увеличивать. Надо 1гб — поставь точно такой же капасити, реаллокаций не будет, а следовательно GC не надо будеть гонять объекты по АП.

У нас же этот
Автор: Ikemefula
Дата: 09.10.13
случай:
var list = new List<Item>();
while (condition())
{
  list.Add(current());
}
?
Сколько резервировать будешь?

Да и вообще ты так и не показал, где там фрагментация на диаграмме выше

EP>>>>Где это было, в какой среде? Случаем не в C# <=VS2008?

I>>>Начиная с TP5.5-BP7.0, потом TC2.0-BC3.1, Watcom C, потом VS 97 и заканчивая VS 2012, примерно так Вот на ассемблере этого не было, динамику как то не сильно использовал, извини.
EP>>Ты же про C# говорил
Автор: Ikemefula
Дата: 10.10.13
и его списки? Зачем про Паскаль загоняешь?

I>Потому что фрагментация вылазит всегда и везде, когда потребление памяти близко к размеру АП. Когда софт дорастет до границ х64, то там тоже вылезет проблема с фрагментацией. Радикально решить можно будет толко увеличением АП, то есть, переходом на 128 бит, а потом на 256 и так далее. Правда, есть шанс, что солнце погаснет раньше, чем мейнстрим дорастет до такой разрядности.

Не надо тут про Солнце, конкретно отвечай — о какой VS говорил по ссылке.
Большая разница — обжегся ли ты об кривой аллокатор, либо об вполне оправданную фрагментацию (которая не является прямым следствием примитивной политики аллокации).


EP>>А твой ответ показывал полное не понимание:

EP>>

V>>>>Если в тесте после грубо 660 метров не удалось выделить память, то это значит, что всего было запрошено порядка 660*3=1980 метров. ЧТД.
i>>>А почему на три надо помножать, если добавляем по одному байту ?

EP>>Тут нет ничего про 1.5x, тут есть "добавляем по одному байту"
I>Это специально для vdimas. Я ожидал от него чтото навроде "Ага ! Попался, двоечник !!! байты ни при чем !!!!111расрас" и на тот момент у меня был заготовлен более интересный троллинг

Хитрый планЪ, однако
Re[19]: собеседования, Реверс списка
От: koodeer  
Дата: 18.10.13 00:09
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Ну а что, например, делать с мьютексом? Ждать пока система его разлочит?

EP>А если там какая-нибудь синхронизация чуть сложнее тривиальной — один мьютекс система отпустит, а другой нет, и внезапно наступает deadlock

Например, в дотнете есть библиотека TPL — task parallel library. При её использовании можно почти не думать о мьютексах и т.п. Всё автоматически распараллеливается, синхронизируется, освобождается. Почти сказка.
Конечно, внутри TPL используются примитивы синхронизации и прочее. Но у прикладного программиста не болит голова от их использования, потому что они не торчат наружу.
Я не могу ручаться, но вполне вероятно в полностью управляемой среде спрятать от прикладных программеров почти все подобные аспекты.

EP>Или например как создавать свои ресурсы? Как сказать системе что делать при их закрытии?


Создавать как обычно. Что делать при закрытии пишется в специальном методе (будет он зваться деструктор, финализатор или dispose — не важно). Этот метод автоматически вызывается, когда в больше нет ссылок на данный ресурс. И, в отличие от нынешнего GC, не обеспечивающего детерминизм, вполне можно создать альтернативный, которому можно указать, что данный конкретный объект нуждается в мгновенном освобождении, а не когда обычный GC проснётся.

Я отнюдь не ратую всеми силами за управляемые среды. Мне больше по нраву c/c++ и ассемблер: биты, байты, регистры, прерывания... На дотнете сижу вынужденно — что востребовано, то и использую. Я лично считаю, что нынешние управляемые среды со временем умрут. Примерно тогда же, когда умрёт c++. А на смену должно прийти нечто наподобие D — где и полный контроль над железом есть, и сборщик мусора имеется.
Re[20]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 00:21
Оценка:
Здравствуйте, koodeer, Вы писали:

K>Например, в дотнете есть библиотека TPL — task parallel library. При её использовании можно почти не думать о мьютексах и т.п. Всё автоматически распараллеливается, синхронизируется, освобождается. Почти сказка.


Это всё понятно.

K>Я не могу ручаться, но вполне вероятно в полностью управляемой среде спрятать от прикладных программеров почти все подобные аспекты.


Вряд ли такое возможно в языке достаточно широкого назначения.

EP>>Или например как создавать свои ресурсы? Как сказать системе что делать при их закрытии?


K>Создавать как обычно. Что делать при закрытии пишется в специальном методе (будет он зваться деструктор, финализатор или dispose — не важно). Этот метод автоматически вызывается, когда в больше нет ссылок на данный ресурс. И, в отличие от нынешнего GC, не обеспечивающего детерминизм, вполне можно создать альтернативный, которому можно указать, что данный конкретный объект нуждается в мгновенном освобождении, а не когда обычный GC проснётся.


Детерминизм действительно важен, и поэтому в C# есть using, в Java — try-with-resources , в Python — with — и везде требуется подобие IDisposable.

Возвращаясь к исходного тезису:

K>Dispose-костыли в управляемой среде предназначены в основном для решения проблем с нативным кодом.

Мой поинт в том, что ресурсы существуют сами по себе, а не являются какой-то особенностью native.
Re[42]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 04:26
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>>>Я чучка погорячился про квадратичность, но сути это не меняет. N*log(N) с подключением свопа мало чем отличается для обсуждаемого размера АП.

EP>>>Ну ты даже O(N*log(N)) не показал. То о чём ты говоришь это O(N).
I>>O(log(N)) аллокаций массива в списке, для каждой из них надо пробежать граф из O(N) элементов
I>>Сколько это по твоему ?

EP>Выделенное неверно.

EP>Аллокаций действительно O(log(N)), вот только на каждой нужно пробежать по количеству зависящему от номера текущей аллокации, а не от общего числа элементов.

Не боись, я уже понял, с математикой у меня действительно все плохо, хуже некуда
Re[24]: собеседования, Реверс списка
От: Erop Россия  
Дата: 18.10.13 06:17
Оценка:
Здравствуйте, Abyx, Вы писали:


A>купи планшет, дешевле будет чем бумагу и картриджи переводить.


Ничего страшного, я могу себе позволить потратиться на бумагу и печать...
А планшеты -- это для нищебродов
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[24]: собеседования, Реверс списка
От: Erop Россия  
Дата: 18.10.13 06:19
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Я ж говорю — колхоз. Есть вещи более эффективные нежели твои бумажки.


Я же говорю, от задачи зависит. Тупой кодинг автоматизирован довольно хорошо, а я не программист же. Я скорее математик
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[28]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 08:55
Оценка:
Здравствуйте, Sinix, Вы писали:

EP>>Весь топик про то, "какие опасные List'ы". Я в своём сообщении попытался разобраться в чём же дело.

EP>>Вполне вероятно, что дело было в плохом аллокаторе.
S>Не, проблема не в list как таковом, а в его использовании без чтения документации.

Проблема действительно не в List, и чтение документации List'а тут ничем бы не помогло. Так как дефект был в аллокаторе.

S>Дотнетчиков лучше искать в профильных разделах, мы в основном не буйные


Возможно Но пока получается пересекаться только в КСВ

EP>>Я же не говорю что так нужно писать код, или что проблему нельзя обойти. Это пример является demo того, что был плохой аллокатор, и многие на нём могли обжечся

S>Многие — это очень сильно преувеличено. Не, серьёзно — как часто в прикладном коде требуется активно аллоцировать гигабайты в памяти, причём по мааленьким кусочкам да ещё вперемешку с мелкими долгоживущими массивами?

В приложении аллокации могут быть размазаны по коду, и не всегда следят что и в каких объёмах аллоцируется, по крайней мере до OOM. Я уверен что такой аллокатор будет всё портить и в других сценариях, например в долгоживущих приложениях.

EP>>О, кстати. Я спрашивал про аналог C++1998 std::deque — мне пытались впарить LinkedList
Автор: Evgeny.Panasyuk
Дата: 15.10.13
под видом деки. Может ты покажешь какую деку обычно используют в .NET — ведь должно же быть что-то стандартное, или распространённое, раз с List'ом такой ужас-ужас.

S>С List проблем нет, как уже не раз говорилось. В дотнете из коробки есть только однонаправленная Queue<T>, если нужен имено дек — есть готовые реализации, например http://nitodeque.codeplex.com/

Нужен именно O(1) random-access реализованный на чанках, как и std::deque.
По этой ссылке, вроде то что нужно — "This deque provides O(1) indexed access,". Но смущает: "all page views=613" — для такой базовой структуры не слишком надёжно.
Re[20]: собеседования, Реверс списка
От: Erop Россия  
Дата: 18.10.13 09:08
Оценка:
Здравствуйте, Abyx, Вы писали:

A>эти фичи практически всегда можно протестировать вручную, а можно протестировать автоматически.


1) функциональное тестирование не является юнит-тестом.
2) Я не против тестов, я за
3) В общем случае доказать работоспособность кода они всё равно не могут
Например, у меня есть бор, в котором хранится словарь естественного языка. В структуре бора есть ограничения, на всякие там вещи типа число детей у узла, скажем и битность ссылки. Доказать что для любого естественного языка хватит тестами трудно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[29]: собеседования, Реверс списка
От: Sinix  
Дата: 18.10.13 09:18
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:


EP>В приложении аллокации могут быть размазаны по коду, и не всегда следят что и в каких объёмах аллоцируется, по крайней мере до OOM. Я уверен что такой аллокатор будет всё портить и в других сценариях, например в долгоживущих приложениях.

Я всё что мог — написал выше, так что спорить не буду

S>>В дотнете из коробки есть только однонаправленная Queue<T>, если нужен имено дек — есть готовые реализации, например http://nitodeque.codeplex.com/

EP>Нужен именно O(1) random-access реализованный на чанках, как и std::deque.
EP>По этой ссылке, вроде то что нужно — "This deque provides O(1) indexed access,". Но смущает: "all page views=613" — для такой базовой структуры не слишком надёжно.
Не, по ссылке реализация "всё в одном внутреннем массиве".

Если нужно именно на чанках — есть BigList в PowerCollections, больше ничего на глаза не попадалось, специально не искал.
Re[25]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 12:22
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Я ж говорю — колхоз. Есть вещи более эффективные нежели твои бумажки.


E>Я же говорю, от задачи зависит. Тупой кодинг автоматизирован довольно хорошо, а я не программист же. Я скорее математик


Я и говорю что ты не программист, твои каменты это однозначно демонстрируют.
Re[31]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 12:46
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

S>>Если нужно именно на чанках — есть BigList в PowerCollections, больше ничего на глаза не попадалось, специально не искал.


EP>Вот, уже теплее "all page views=296189". Но судя по тому, что там, как они говорят, эффективные вставки в середину — это не прямой аналог std::deque.

EP>Точно: "Getting or setting an item takes time O(log N), where N is the number of items in the list" против O(1) у std::deque. То есть это, по идее, аналог std::map<std::size_t,T>.

Биглист это точно отстой. Примитивная, на коленке, реализация деки рвет биглист как тузик грелку как раз потому что биглист это не аналог деки.
Re[30]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 12:51
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Проблема действительно не в List, и чтение документации List'а тут ничем бы не помогло. Так как дефект был в аллокаторе.

I>Это не дефект, а свойство аллокатора. Если это называть дефектом, то любая особенность станет дефектом

Ну да, и кубическая сортировка — тоже не дефект?

I>Для внятного разруливания таких случаев нужны подсказки аллокатору, хоть где угодно, менеджед или нативный аллокатор.


кубической сортировке тоже можно дать подсказки типа "сделай вот такую перестановку".

I>Скажем, если вместо ручного копирования взять Array.resize и сделать так, что бы GC выделял память не последовательно, а скажем, примерно так — если блок находится в большом окне, выделить память в противоположном конце окна, то, внезапно, проблема с фрагментацией исчезнет и можно выделить больше чем N/3, что очевидно — четные аллокации будут в начале фрейма, нечетные — в конце. Середина будет оставаться свободной и выделить можно будет больше половины размера доступного АП.


Давай, включайся, уже вообще не интересно

Вот тебе картинка, * — это то, что занято list'ом:
[ | | | | | | | | | | | | | |*|*|*|*|*|*|*|*]
внешняя фрагментация нулевая

Покажи как ты увеличишь capacity вдвое
Re[32]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 13:19
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Предположим, АП 50, размер списка — 32, это больше чем 50/3. Согласно твоей логике, более 16 выделить не получится, если двигать блоки нельзя.


Неверно, перечитывай заново
Автор: Evgeny.Panasyuk
Дата: 17.10.13
, по буквам, по слогам, по словам:

EP>Даже при полном отсутствии всякой фрагментации, у тебя capacity не сможет вырасти в два раза, когда ты уже съел треть памяти, хоть ты тресни. Тебе уже это на протяжении нескольких страниц объясняли

Re[33]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 13:54
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Неверно, перечитывай заново
Автор: Evgeny.Panasyuk
Дата: 17.10.13
, по буквам, по слогам, по словам:

EP>

EP>>Даже при полном отсутствии всякой фрагментации, у тебя capacity не сможет вырасти в два раза, когда ты уже съел треть памяти, хоть ты тресни. Тебе уже это на протяжении нескольких страниц объясняли


Во первых — что мешает задать капасити изначально ?
Во вторых — если ты выделяешь треть и она не по середине, то слева или справа будет две трети, то есть, удваивается. Покажи на моём примере, где было АП 50, а то я твои идеи не понимаю
Re[34]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 14:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Поиски распространённого аналога std::deque продолжаются. Ведь что-то должно было вымучиться за 10 лет плохого аллокатора

I>А чем не угодила дека из STL.Net ?
I>http://msdn.microsoft.com/en-us/library/bb398188.aspx
I>Я правда не пользовался, только что нашел

Во-первых пишут что она не работает в C#.
А во-вторых — её тут никто не упоминал. Уже вроде как три C#'иста пытались безрезультатно найти аналог
Re[34]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 14:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Во первых — что мешает задать капасити изначально ?


Во-первых, ты это уже спрашивал. Ответ тут
Автор: Evgeny.Panasyuk
Дата: 18.10.13
.
Во-вторых, мы же всё ещё обсуждаем тот пример где нет никакого reserve? Так вот, речь о том, что если аллокация фейлится когда grow_factor*capacity > total_free_memory, то будь хоть у тебя нулевая внешняя фрагментация — тебе бы это не помогло.
Точно такая же ситуация будет и в x64.

I>Во вторых — если ты выделяешь треть и она не по середине, то слева или справа будет две трети, то есть, удваивается.


Треть это порог. Перешагнёшь через него — и больше твоя capacity не сможет вырасти в два раза.

I>Покажи на моём примере, где было АП 50, а то я твои идеи не понимаю


Если мы пришли в любую capacity > 16 — то больше сделать 2x не получится
Re[35]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 14:43
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Во-первых пишут что она не работает в C#.

EP>А во-вторых — её тут никто не упоминал.

Она работает, только параметризовать её нельзя. Т.е. все решается чз генеренный враппер, будет работать с небольшим пенальти из за этого.

т.е. тупо

std.deque<SomeCustomType> deque = new  std.deque<SomeCustomType>();


Напрямую работать не будет. Но как минимум можно сделать кое какие обходным маневры, из за того, что темплейты разворачивает компилятор, а генерики — рантайм.

А вот так — будет


var x = instance.GetDeque();



>Уже вроде как три C#'иста пытались безрезультатно найти аналог


Пудозреваю, это демонструет востребованность
Re[26]: собеседования, Реверс списка
От: Erop Россия  
Дата: 18.10.13 14:49
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Я и говорю что ты не программист, твои каменты это однозначно демонстрируют.


Вот ты и говоришь, что по сути дела тебе сказать нечего и ты перешёл к личности собеседника
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[27]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 14:51
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Я и говорю что ты не программист, твои каменты это однозначно демонстрируют.


E>Вот ты и говоришь, что по сути дела тебе сказать нечего и ты перешёл к личности собеседника


Профориентация не является частью личности, не льсти себе.
Re[35]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 14:57
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Я правда не пользовался, только что нашел


E>Тем и не угодила, что хотелось бы понять как проблему решали НА ПРАКТИКЕ...


Я уже рассказывал, но ты же не читатель.
Re[35]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 16:15
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>В этой Large Object Heap основные жители это массивы.

EP>Как я понял, Large Object в виде структуры/класса при пороге 85kB получить крайне трудно. Особенно учитывая то, что fixed-size массивы там крайне неудобные (только unsafe context).

Наоборот, очень легко. Для хештейбла это всего 5000 элементов.

EP>В такой ситуации std::deque, особенно с одинаковым размером chunk'а среди разных типов, решил бы кучу проблем. Все эти chunk'и можно было бы аллоцировать в простейшем и быстром free-list'е.


С одинаковым не получится, в том то и проблема. Если хранить в листе вещи навроде гуидов, то получается чунк 85кб/16 = 5000 элементов

EP>Из крупных объектов остался бы какой-нибудь interop, и внутренние массивы дэки (где указатели на chunk'и) — но их во-первых немного, а во-вторых они сравнительно маленькие.

EP>

Немаловажный фактор это суммарный оверхед по памяти и всякие косвенные расходы. Без профайлера сравнивать две коллекции занятие имеющее не сильно много смысла.
Re[36]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 16:44
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>В этой Large Object Heap основные жители это массивы.

EP>>Как я понял, Large Object в виде структуры/класса при пороге 85kB получить крайне трудно. Особенно учитывая то, что fixed-size массивы там крайне неудобные (только unsafe context).
I>Наоборот, очень легко. Для хештейбла это всего 5000 элементов.

Ну так а что у hashtable внутри? Не массив случайно?

EP>>В такой ситуации std::deque, особенно с одинаковым размером chunk'а среди разных типов, решил бы кучу проблем. Все эти chunk'и можно было бы аллоцировать в простейшем и быстром free-list'е.

I>>С одинаковым не получится, в том то и проблема. Если хранить в листе вещи навроде гуидов, то получается чунк 85кб/16 = 5000 элементов

Ты о том, что много на один chunk получается?
1. Их можно попробовать за-pool'ить, порезать куски 85kB на несколько chunk'ов
2. Я не предлагаю отказываться совсем от массивов — я показываю альтернативу
3. MS могли бы снизить размер, добавить chunk heap или ещё что-нибудь, а не мариновать 10 лет плохим аллокатором.
4. Расход лишних 85kB на массив, это не так ужасно по сравнению с OOM.
5. Сделать гибридный массив/дэку, который сам подменяет реализацию.

да много вариантов

EP>>>Из крупных объектов остался бы какой-нибудь interop, и внутренние массивы дэки (где указатели на chunk'и) — но их во-первых немного, а во-вторых они сравнительно маленькие.

EP>>>
I>>Немаловажный фактор это суммарный оверхед по памяти и всякие косвенные расходы. Без профайлера сравнивать две коллекции занятие имеющее не сильно много смысла.

А что там сравнивать — у deque'и при random access на одну косвенность больше. Линейная итерация, если реализовывать максимально эффективно, то получается практически также
Re[21]: собеседования, Реверс списка
От: koodeer  
Дата: 18.10.13 17:25
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

K>>Я не могу ручаться, но вполне вероятно в полностью управляемой среде спрятать от прикладных программеров почти все подобные аспекты.


EP>Вряд ли такое возможно в языке достаточно широкого назначения.


Ну почему же. В шарпе к этому очень хорошо приблизились. А c# — язык широкого назначения. Конечно, не все детали низкого уровня спрятаны, но лишь потому, что управляемую среду натянули поверх неуправляемой. Вот и текут абстракции.


EP>Детерминизм действительно важен, и поэтому в C# есть using, в Java — try-with-resources , в Python — with — и везде требуется подобие IDisposable.


Чуть вернёмся назад. Возможно, я не совсем понял, когда влез в обсуждение. Основной пойнт в упоминании Dispose был в том, что его всё равно нужно вызывать вручную, несмотря на наличие GC? И так же как в неуправляемом коде в многопоточке непонятно, когда именно удалять объект, так же и в управляемом коде в многопоточке непонятно, когда вызывать Dispose? Правильно я понял?
Опять же, я считаю, что эта проблема лишь из-за того, что управляемая среда работает поверх неуправляемой. Вполне можно было бы сделать автоматическое удаление/освобождение любого ресурса детерминированно. Возможно, это будет чуть накладнее, чем ручной вызов диспоза. Но для прикладного кода в большинстве случаев это было бы приемлемо.


EP>Мой поинт в том, что ресурсы существуют сами по себе, а не являются какой-то особенностью native.


Согласен. Тем не менее, вполне можно сделать их детерминированное автоматическое освобождение (в изначально управляемой среде).
Re[28]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 17:46
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>>>Расскажи лучше как в VS2008 выбрать .NET 4.0

НС>>>http://msdn.microsoft.com/en-us/library/w4atty68.aspx
EP>>http://stackoverflow.com/questions/1986287/visual-studio-2008-support-for-new-net-4/1986317#1986317
НС>Очередная демонстрация, что ты не в теме.

Не в теме чего?

НС>1) C# 4 это не тоже самое, что FW 4.0


А где я говорил про C# 4?

НС>2) Собранное компилятором C# 3 прекрасно работает в FW 4.0


Ты лучше ответь на вопрос который в самом верху.
Re[22]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 18:06
Оценка:
Здравствуйте, koodeer, Вы писали:

K>>>Я не могу ручаться, но вполне вероятно в полностью управляемой среде спрятать от прикладных программеров почти все подобные аспекты.

EP>>Вряд ли такое возможно в языке достаточно широкого назначения.
K>Ну почему же. В шарпе к этому очень хорошо приблизились. А c# — язык широкого назначения. Конечно, не все детали низкого уровня спрятаны, но лишь потому, что управляемую среду натянули поверх неуправляемой. Вот и текут абстракции.

Ну вот например соединение с базой данных — эта такая абстракция которая течёт из native'а?

EP>>Детерминизм действительно важен, и поэтому в C# есть using, в Java — try-with-resources , в Python — with — и везде требуется подобие IDisposable.


K>Чуть вернёмся назад. Возможно, я не совсем понял, когда влез в обсуждение. Основной пойнт в упоминании Dispose был в том, что его всё равно нужно вызывать вручную, несмотря на наличие GC?


Это говорил
Автор: koodeer
Дата: 17.10.13
Marty. Что конкретно он подразумевал я не знаю — тут могут быть несколько вариантов.

K>Тем не менее, вполне можно сделать их детерминированное автоматическое освобождение (в изначально управляемой среде).


Можно. Например using/try-with-resources/with, да и вообще управляемые среды не исключают RAII.
Re[38]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 18:55
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Ну так а что у hashtable внутри? Не массив случайно?

I>Целых два.

И как это опровергает:

EP>В этой Large Object Heap основные жители это массивы.

?

EP>>А что там сравнивать — у deque'и при random access на одну косвенность больше. Линейная итерация, если реализовывать максимально эффективно, то получается практически также


I>Какую задачу ты хочешь декой решить?


Аллокацию array-like данных в условиях фрагментации, топик разве не про это

Мне уже надоело объяснять тривиальные вещи, поэтому следующие два перла оставляю тебе на домашнее задание:

I>итерации по линкед лист и по какому нибудь полу-массиву практически одинаково стоят.




I>У деки преимущество не в рандомном доступе, а в сложности рандомного добавления, удаления.


Re[25]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 19:30
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Речь идёт про загаживание LOH большими объектами, с которым дела обстояли плохо вплоть до VS2008.

НС>>Стоит начать хотя бы с понимания того факта, что рантайм (и поведение GC) от версии студии практически никак не зависит.

EP>Это очень важный факт, который меняет в корне всю дискуссию. Когда делал примеры — выбирал максимально доступный Runtime.

EP>Расскажи лучше как в VS2008 выбрать .NET 4.0

Ты определись, чего хочешь, скомпилить код или проверить код под конкретным рантаймом ?

Если первое, то это к доктору. Если второе, то компилится ОДИН РАЗ хоть для .Net 1.0 и дальше переключаешь рантайм в манифесте. Я совсем недавно обнаружил, что часть прекомпиленых сборок никто не билдил ажно с 2003го года, это .Net 1.1
И это, представь, на флагманском продукте который зарабатывал основные деньги для всей компании.

Пойми простую вещь, если код компилится в древней вижле, то это вовсе не значит, что работать он будет под тем же древним рантаймом. Большей частью наоборот, а вижла нужна только для того, что бы какой нибудь экзотический компилер поднять, которой микрософт перестала майнтейнить, навроде J#.
Re[29]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 19:31
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Ты лучше ответь на вопрос который в самом верху.


Ты лучше сформулируй проблему, которую хочешь решить. С вероятностью 99% НС уже дал исчерпывающий ответ.
Re[40]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 19:52
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>И как это опровергает:

EP>>

EP>>>В этой Large Object Heap основные жители это массивы.

EP>>?
I>А я где то написал опровержение ? Дай ссылку что ли

http://rsdn.ru/forum/flame.comp/5335848.1
Автор: Ikemefula
Дата: 18.10.13


EP>>В этой Large Object Heap основные жители это массивы.
EP>>Как я понял, Large Object в виде структуры/класса при пороге 85kB получить крайне трудно. Особенно учитывая то, что fixed-size массивы там крайне неудобные (только unsafe context).
I>Наоборот, очень легко. Для хештейбла это всего 5000 элементов.



I>>>Какую задачу ты хочешь декой решить?

EP>>Аллокацию array-like данных в условиях фрагментации, топик разве не про это
I>Они все разные, array-like данные. Если не критично удаление-добавление по индексу, то от деки толку мало.

Какая сложность добавления элемента в центр std::deque?
Re[14]: собеседования, Реверс списка
От: vdimas Россия  
Дата: 18.10.13 20:00
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

V>>Возможно... Но мне даже трудно представить задачу, когда нам нужно десятки/сотни миллионов элементов в линейном массиве.

НС>Сочувствую, чо.

Ну я типа ждал ЛЮБОГО примера, чтобы показать, что линейный массив для него не нужен. )))
Re[37]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 18.10.13 20:02
Оценка:
Здравствуйте, Erop, Вы писали:

E>просто перестали использовать большие вектороподобные коллекции


Офигеть. А можно логическую цепочку, которая привела тебя к такому выводу?
Re[32]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 20:19
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Поясни как вот это
Автор: Ночной Смотрящий
Дата: 17.10.13
относится к обсуждаемой проблеме и приведённым примерам. И как бы возможность смены рантайма помогла бы всем этим людям в своё время.

I>Объясняю — ты не раз и не два писал "а вон в той вижле GC не так работает"
I>А потом попросил совета, как сбилдить прожку не под той вижлой, очевидно, для проверки LOH
I>Не нужно ничего билдить в разных вижлах, правишь манифест, а билди хоть вижлой 2002го года один раз на все случаи жизни.

У меня есть все VS начиная с 2005, и мне не трудно прогнать тест в каждой

I>Всем этим людям смена вижлы не поможет никак — версия вижлы не влияет на ГЦ и рантайм.


Видишь дату вопроса? Каким образом они могли бы использовать .NET 4.0 или .NET 4.5 в 2009 году
Re[33]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 20:32
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Не нужно ничего билдить в разных вижлах, правишь манифест, а билди хоть вижлой 2002го года один раз на все случаи жизни.


EP>У меня есть все VS начиная с 2005, и мне не трудно прогнать тест в каждой


Если тебе нравится работать руками, так работай руками, зачем тебе советы ?

I>>Всем этим людям смена вижлы не поможет никак — версия вижлы не влияет на ГЦ и рантайм.


EP>Видишь дату вопроса? Каким образом они могли бы использовать .NET 4.0 или .NET 4.5 в 2009 году


А ты читай, в самом начале говорится про .Net 4, более того, там указано, что вижла была 2010 бета 2.
Re[34]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 20:47
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Всем этим людям смена вижлы не поможет никак — версия вижлы не влияет на ГЦ и рантайм.

EP>>Видишь дату вопроса? Каким образом они могли бы использовать .NET 4.0 или .NET 4.5 в 2009 году
I>А ты читай, в самом начале говорится про .Net 4, более того, там указано, что вижла была 2010 бета 2.

Ну значит всё ещё хуже, и хотя тест VS2010 выше показал небольшое улучшение (почти всю память смогла выделить только аж VS2012), видимо на реальных приложениях было всё ещё печально
Re[35]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 20:53
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>А ты читай, в самом начале говорится про .Net 4, более того, там указано, что вижла была 2010 бета 2.


EP>Ну значит всё ещё хуже, и хотя тест VS2010 выше показал небольшое улучшение (почти всю память смогла выделить только аж VS2012), видимо на реальных приложениях было всё ещё печально


А ты думал я тебе сказки рассказываю ?
Re[42]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 20:56
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Так здесь совсем другое, вот класс хештейбла, он спокойно войдет в LOH при определнном размере


Весь хештейбл, или только массив?

I>Или ты имеешь ввиду одним куском шоб сразу все было ? Не совсем ясно, для чего это нужно


Ещё раз, ты что хотел вот тут сказать:

EP>>>>В этой Large Object Heap основные жители это массивы.
EP>>>>Как я понял, Large Object в виде структуры/класса при пороге 85kB получить крайне трудно. [...]
I>>>Наоборот, очень легко.[...]

Как часто в LOH будут находится обычные классы/структуры, а не какие-нибудь массивы?

EP>>>>Аллокацию array-like данных в условиях фрагментации, топик разве не про это

I>>>Они все разные, array-like данные. Если не критично удаление-добавление по индексу, то от деки толку мало.
EP>>Какая сложность добавления элемента в центр std::deque?
I>Ты лучше сразу напиши, с чем ты не согласен, а то я устал уже. Если вставка-удаление в деку хуже константы, то дека никому не нужна.

Тем не менее проблему аллокации array-like данных в условиях фрагментации она решает

I>В моей реализации — константа.


Поздравляю
Re[23]: собеседования, Реверс списка
От: koodeer  
Дата: 18.10.13 21:01
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Ну вот например соединение с базой данных — эта такая абстракция которая течёт из native'а?


На мой взгляд — да.

EP>>>Детерминизм действительно важен, и поэтому в C# есть using, в Java — try-with-resources , в Python — with — и везде требуется подобие IDisposable.


Довольно часто на форумах встречается вопрос, почему не работает такой код:
public SomeDisposableType foo() {
    using(var some = new SomeDisposableType())
        return some;
}

В данном примере объект диспозится ещё до того, как будет возвращён. А если убрать using, то диспозить его нужно вручную. Причём можно и не вызывать диспоз вручную, тогда объект удалится финализатором, но недетерминированно, неизвестно когда. А я считаю, что вполне можно создать такой механизм, который будет удалять объект сразу же, как только он будет использован в последний раз. Только и всего.
Re[36]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 21:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>А ты читай, в самом начале говорится про .Net 4, более того, там указано, что вижла была 2010 бета 2.

EP>>Ну значит всё ещё хуже, и хотя тест VS2010 выше показал небольшое улучшение (почти всю память смогла выделить только аж VS2012), видимо на реальных приложениях было всё ещё печально
I>А ты думал я тебе сказки рассказываю ?

Тут половину топика пытались выяснить в чём же корни векторо-фобии.
Когда же я сделал тесты которые показывали что вероятной причиной является кривой аллокатор в старых версиях, а не List сам по себе — прибежали C#'исты с криками о том, что я даже чуть-чуть не разбираюсь, нужно читать доки, что проблема давно обкостылевается, и вообще не в теме
Re[43]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 21:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Так здесь совсем другое, вот класс хештейбла, он спокойно войдет в LOH при определнном размере


EP>Весь хештейбл, или только массив?


Массив конечно, он в памяти отдельно будет.

EP>Как часто в LOH будут находится обычные классы/структуры, а не какие-нибудь массивы?


Всегда Есть ряд специальных классов инстанцы которых нельзя двигать, их рантайм помещает в лох. НО ! таких экземпляров совсем мало в общем количестве.

I>>Ты лучше сразу напиши, с чем ты не согласен, а то я устал уже. Если вставка-удаление в деку хуже константы, то дека никому не нужна.


EP>Тем не менее проблему аллокации array-like данных в условиях фрагментации она решает


Кроме фрагментации хотелось бы что бы программа работала за вменяемое время. Если некоторый алгоритм, которому пользователь подаст на вход простыню из сотен тысяч элементов, будет работать из за добавления-удаления целый день, то это мало чем лучше проблемы с фрагментацией.

Я например посмотрел, какие операции занимают больше всего времени и оказалось, что ElementAt(index) можно пренебречь по сравнению с удалением-добавлением по индексу, а больше всего времени занял Contains. Так что выбор был совсем не велик.
С чунками как в деке из стл , если двигать только один чунк, то в среднем на элемент будет пол-размера чунка перемещений. Для коллекции в миллион элментов это дает несколько миллиардов перемещений, поверь, это очень неприятная вещь, ибо таки операции идут чуть не все время.

Вобщем дека выходит какой то сомнительной структурой, слишком специализированой, что бы тащить её в стандартную либу. Так что считаю одно обвинение с Микрософта надо снять
Re[24]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 21:15
Оценка:
Здравствуйте, koodeer, Вы писали:

K>В данном примере объект диспозится ещё до того, как будет возвращён. А если убрать using, то диспозить его нужно вручную. Причём можно и не вызывать диспоз вручную, тогда объект удалится финализатором, но недетерминированно, неизвестно когда. А я считаю, что вполне можно создать такой механизм, который будет удалять объект сразу же, как только он будет использован в последний раз. Только и всего.


"Ящетаю полне можно создать" это слишком сильное утверждение, что бы принимать на веру. В сингулярити есть про это дело что нибудь или где ?
Re[44]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 21:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Я например посмотрел, какие операции занимают больше всего времени и оказалось, что ElementAt(index) можно пренебречь по сравнению с удалением-добавлением по индексу, а больше всего времени занял Contains. Так что выбор был совсем не велик.

[...]
I>Вобщем дека выходит какой то сомнительной структурой, слишком специализированой, что бы тащить её в стандартную либу. Так что считаю одно обвинение с Микрософта надо снять

У тебя недержание контекста?

Есть List. На кривом аллокаторе его использовать трудно — так?
Нужно его заменить на аналог, менее чувствительный к фрагментации, причём так чтобы сложность основных операций была не хуже. И это один из use-case'ов std::deque
Если твой алгоритм не вставлял/удалял данные в середину List'а — то почему он вдруг начнёт это делать с декой?
Re[37]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 21:25
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Тут половину топика пытались выяснить в чём же корни векторо-фобии.


Нету никакой фобии, этот лист используется чуть не в каждом методе. Более того, его при всем желании невозможно избежать. Поэтому, считаю, дотнетчики обязаны знать тонкости и особенности такого часто используемого класса, даже если эти тонкости вылазят в виде проблем только в небольшом количестве приложений.

EP>Когда же я сделал тесты которые показывали что вероятной причиной является кривой аллокатор в старых версиях, а не List сам по себе — прибежали C#'исты с криками о том, что я даже чуть-чуть не разбираюсь, нужно читать доки, что проблема давно обкостылевается, и вообще не в теме


Лист сам по себе кривой до безобразия, а GC не идеален, только и всего.

Скажем, 10 лет назад у сиплюсников было стойкое мнение, что динамическая аллокация это очень медленно и проблемно. Но это же не значит, что и сейчас так же. А вот мифы до сих пор ходят. Забавно наблюдать как очередной бывший сиплюсник начинает бороться с new
Re[24]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 21:28
Оценка:
Здравствуйте, koodeer, Вы писали:

EP>>Ну вот например соединение с базой данных — эта такая абстракция которая течёт из native'а?

K>На мой взгляд — да.

То есть в чудесном управляемом мире с эльфами и единорогами, в языках достаточно широкого назначения не будет таких объектов как DBConnection, так как это всё от native'а?

K>А я считаю, что вполне можно создать такой механизм, который будет удалять объект сразу же, как только он будет использован в последний раз. Только и всего.


Подобие счётчика ссылок?
Re[38]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 21:34
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Лист сам по себе кривой до безобразия,


Подробнее.

I>а GC не идеален, только и всего.


Да причём тут идеален-неидеален, нормальные алгоритмы аллокации известны уже десятки лет

I>Скажем, 10 лет назад у сиплюсников было стойкое мнение, что динамическая аллокация это очень медленно и проблемно.


Зависит от политики аллокации. Но, даже при использовании самой быстрой, это всё равно косвенно бьёт по производительности — так как добавляет лишние индерекции в данные
Re[45]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 22:22
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>У тебя недержание контекста?


EP>Есть List. На кривом аллокаторе его использовать трудно — так?


Нет, не так. Его трудно использовать в конкретных условиях, которые сто раз перечислены.

EP>Нужно его заменить на аналог, менее чувствительный к фрагментации, причём так чтобы сложность основных операций была не хуже. И это один из use-case'ов std::deque

EP>Если твой алгоритм не вставлял/удалял данные в середину List'а — то почему он вдруг начнёт это делать с декой?

Формально ты прав, если нет удалений-вставок, то будет не хуже. А если есть — мало чем лучше выйдет.
Re[39]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 22:27
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Лист сам по себе кривой до безобразия,


EP>Подробнее.


Что, опять ? grow factor фиксирован, это практически преступление.

I>>а GC не идеален, только и всего.


EP>Да причём тут идеален-неидеален, нормальные алгоритмы аллокации известны уже десятки лет


Это и есть — неидеален. Джава та же намного старше дотнета, а особо ничем и не лучше, только что либ в ней больше. В кое каких сценариях ГЦ у ней быстрее, но в целом сливает дотнету.

С питоном — тоже самое. С джаваскриптом — снова тоже самое.


EP>Зависит от политики аллокации. Но, даже при использовании самой быстрой, это всё равно косвенно бьёт по производительности — так как добавляет лишние индерекции в данные


При этом, уже 10 лет назад GC на ряде сценариев обгонял дефолтный плюсовый. Статьи на этм сайте смотри.
Re[40]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 18.10.13 22:50
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Лист сам по себе кривой до безобразия,

EP>>Подробнее.
I>Что, опять ? grow factor фиксирован, это практически преступление.

В реализациях STL он тоже фиксирован, и причём в разных библиотеках он разный — и как-то векторо-фобии не наблюдается

I>Джава та же намного старше дотнета, а особо ничем и не лучше, только что либ в ней больше. В кое каких сценариях ГЦ у ней быстрее, но в целом сливает дотнету.

I>С питоном — тоже самое. С джаваскриптом — снова тоже самое.

Интересно будет прогнать тот же тест.

EP>>Зависит от политики аллокации. Но, даже при использовании самой быстрой, это всё равно косвенно бьёт по производительности — так как добавляет лишние индерекции в данные

I>При этом, уже 10 лет назад GC на ряде сценариев обгонял дефолтный плюсовый. Статьи на этм сайте смотри.

Цена аллокации это часть проблемы — другая часть это косвености в данных. И надо не забывать, что в C++ проектах аллокаций на порядки меньше.
И да, GC'шный аллокатор может обогнать стандартный C++ на аллокациях, так как он заточен под другое. Но он также платит передвижением объектов за скорость аллокации.
А в LOH'е захотели и скорость, и без дефрагментации, за что и поплатились (точнее поплатились пользователи). Кстати, в тех версиях в которых начали фиксить аллокатор — LO аллоцируются в разы дольше (видно на глаз, но не замерял).
Re[41]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.13 22:57
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>В реализациях STL он тоже фиксирован, и причём в разных библиотеках он разный — и как-то векторо-фобии не наблюдается


Фобия это когда список используется повсеместно ? Странная у тебя терминология.
Re[25]: собеседования, Реверс списка
От: koodeer  
Дата: 18.10.13 23:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>"Ящетаю полне можно создать" это слишком сильное утверждение, что бы принимать на веру. В сингулярити есть про это дело что нибудь или где ?


Насчёт Сингуларити не знаю, я глубоко в неё не вникал.
А способов сделать можно предложить несколько. Например, отдельный постоянно работающий поток, который постоянно отслеживает специальным образом помеченные объекты, владеющие ресурсами, которые нужно быстро освободить. Примерным аналогом может служить поток финализации. Да, этот способ далеко не идеален, и накладен с точки зрения производительности. Но я говорю лишь о теоретической возможности, и только для прикладного кода, где производительностью можно поступиться во имя удобства.
Re[25]: собеседования, Реверс списка
От: koodeer  
Дата: 18.10.13 23:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>То есть в чудесном управляемом мире с эльфами и единорогами, в языках достаточно широкого назначения не будет таких объектов как DBConnection, так как это всё от native'а?


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


EP>Подобие счётчика ссылок?


Да, как вариант это может быть счётчик ссылок.
Re[38]: собеседования, Реверс списка
От: Erop Россия  
Дата: 19.10.13 05:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Кроме того, там где нужны большие вектороподобные коллекции, C# гарантировано сливает нативным плюсам в большинстве сценариев. Подумай головой — дотнетчики они почти все бывшие плюсовики, что еще они могли заюзать ?


Ну, то есть, ты хочешь сказать, что если в задаче возникали большие массивы, то её просто писали на плюсах и всё?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[39]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.10.13 06:22
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Кроме того, там где нужны большие вектороподобные коллекции, C# гарантировано сливает нативным плюсам в большинстве сценариев. Подумай головой — дотнетчики они почти все бывшие плюсовики, что еще они могли заюзать ?


E>Ну, то есть, ты хочешь сказать, что если в задаче возникали большие массивы, то её просто писали на плюсах и всё?


Если совсем плохо, то и так.
Re[33]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.10.13 06:33
Оценка:
Здравствуйте, Erop, Вы писали:

E>Если ты такой умный, ты сам мог провести эти тесты ПРАВИЛЬНО, а ещё в 2002-м там или 2003-м или когда у тебя проблемы с ООМ под С# начались? Мог разобраться с ними и придумать адекватную замену листу...


Ты не волнуйся — все проблемы вовремя решались, в том числе и в 2003м

E>Евгений сейчас за два дня разобрался в проблеме лучше вас двоих обоих "спецов" по шарпу, что лично меня немного удивляет, однако, и как бы намекает...


Ога
Re[37]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.10.13 06:51
Оценка:
Здравствуйте, Erop, Вы писали:

E>2) Что бы разобраться в этой проблеме сообществу шарпистов понадобилось 10 лет и решение нашлось в целом вообще в духе платформы, типа пусть авторы рантайма и фиксят, а пока некоторый класс алгоритмов юзать поостережёмся


Судя по форумам, сообществу плюсовиков еще предстоит разобраться с указателями.

E>Если она в чём-то не точна, то ты можешь её уточнить, показать КАК ЕЩЁ решали проблему РАНЬШЕ, например...


Есть мнение, что смысла объяснять нет, ибо ты как то по особенному читаешь, кусочками, небось разные алгоритмы пробуешь, то с конца, то с начала, то с середины, то через фразу. Правильное дело — алгоритмы надо постоянно прокачивать.
Re[40]: собеседования, Реверс списка
От: Erop Россия  
Дата: 19.10.13 16:35
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>А зачем комуто говорить, если я сам перечислил ?



Имя, сестра, имя!!!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[39]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 19.10.13 22:49
Оценка:
Здравствуйте, Erop, Вы писали:

НС>>Офигеть. А можно логическую цепочку, которая привела тебя к такому выводу?

E>Так никто так и не назвал ЧТО ОН ИСПОЛЬЗОВАЛ в качестве такой коллекции...

Ты на вопрос можешь ответить?

E>Вот ты, например, что использовал?..


Для чего?
Re[39]: собеседования, Реверс списка
От: Sinix  
Дата: 21.10.13 10:00
Оценка:
Здравствуйте, Erop, Вы писали:

E>В смысле "ошибка" Так етсь таки проблемы с фрагментацией LOH или нет?

На практике за 10 лет не встречал ни разу. Как добиться — в курсе, но зачем так делать — ума не приложу

E>Ты всё время тут пытаешься найти какие-то за и против шарпа.

Да ладно Пролистай последние 2 страницы

шарповый аллокатор тупит на больших блоках
...
тот дотнетовский аллокатор, который работает сейчас в программах у пользователей -- УГ
...
Евгений сейчас за два дня разобрался в проблеме лучше вас двоих обоих "спецов" по шарпу
...
У тебя недержание контекста? Есть List. На кривом аллокаторе его использовать трудно — так?
...
прибежали C#'исты с криками о том, что я даже чуть-чуть не разбираюсь, нужно читать доки, что проблема давно обкостылевается

Это _я_ пытаюсь найти за и против?

E>Мне интересно, как решали таки проблему с плохой работой аллокатора больших объектов? Судя по гуглению форумов всяких, проблема таки была, а хорошего решения я не нашёл, в смысле при гуглении. И тут никто не сказал ничего кроме двух

E>1) перейти на х64
E>2) перейти на новый рантайм.
... 3. Использовать постоянный (кратный) размер блоков
4. Избегать лишних аллокаций

Ну так это общие (заведомо рабочие) рекомендации. Чтобы посоветовать что-то более конкретное, нужно лезть и разбираться. Причём разбираться придётся долго и нудно, на реальном приложении и с профайлером памяти, ну, или хотя бы с дампом+windbg. Ну и сама проблема достаточно редкая. Быстро погуглил, получил:
1. А может ли оно упасть?

However, after my last post last night, I decided to bite the bullet and test this vigorously. I left a small program running overnight which continually allocated large byte arrays on multiple threads. The idea is that if LOH fragmentation was a concerned, then the program would eventually crash with OutOfMemory exception as a result of massive fragmentation. To my great surprise it didn't. It ran for about 5 hours. My servers assuming its reasonably active, are not going to generate that many buffers in month. More telling, the working set of the application stayed stable. I can only assume that LOH fragmentation is an old problem or MS foresaw this an specifically optimized for large byte arrays since its so ubiquitous in the framework. So it seems its been a non-issue from the start.


2. OutOfMemoryException при попытке запихнуть большой лог в список. Чёрт его знает, как автор этого добился, в топике подробностей нет. Единственная мысль — в списке были большие структуры и человек словил ограничение в 2гб на размер массива.

Собственно, всё

E>Ну, то есть решение и отладку проблемы разработчики пререложили на всторов рантайма. Так же, например, пользователи ворда не бросаются чего-то там допиливать в ворде, что бы оно не падало на больших документах, а обновляют ворд, например.

Эмм, ну а как поступают нативщики, если их не устраивает выхлоп текущей версии компилятора притом что в следующей оно уже исправлено? Переписывают?

E>В С++ популярные под виндой аллокаторы большие объекты сразу по VirtualAlloc выделяют, без пачек, и сразу же по virtualFree освобождают, тоже без пачек...


Так и LOH делает примерно так же — резервируется сегмент (сегменты) АП и затем по мере необходимости или освобождаются, или переиспользуются. Собственно, в 1.0 и использовался malloc. Вся проблема — в не совсем корректном поиске свободных фрагментов в нескольких очень частных сценариях. Но даже для таких извратов (если иначе никак) были предусмотрены костыли. Я где-то выше уже приводил ссылку:

In CLR 2.0 we added a feature called VM Hoarding that may be applicable if you are in a situation where segments (including those for both the large and small object heaps) are frequently acquired and released. To specify VM Hoarding, you specify a startup flag called STARTUP_HOARD_GC_VM via the hosting API (see go.microsoft.com/fwlink/?LinkId=116471). When you specify this, instead of releasing empty segments back to the OS, the memory on these segments is simply decommitted and put on a standby list. The segments on the standby list will be used later to satisfy new segment requests. So next time I need a new segment, I'll use one from this standby list if I can find one that's big enough.

Note that this isn't done for the segments that are too large. This feature is also useful for applications that want to hold onto the segments that they've already acquired, like some server apps that seek to avoid fragmentation of the VM space as much as they can so that they don't cause out-of-memory errors

Re[39]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 10:16
Оценка:
Здравствуйте, Erop, Вы писали:

E>В смысле "ошибка" Так етсь таки проблемы с фрагментацией LOH или нет?


Проблемы есть и было сказано, когда и при каких условиях они возникают.

S>>Итак, раз уж мы говорим за 10 лет — где хоть одна статья с описанием нерешаемых проблем, вызванными особенностями LOH? Только плиз, написанная нормальным разработчиком со знанием матчасти, а не "Вау, мы поломали дотнет!"


E>Ты всё время тут пытаешься найти какие-то за и против шарпа. А мне это не интренесно, IMHO, это просто инструмент со своим кругом задач. И всё. Мне интересно, как решали таки проблему с плохой работой аллокатора больших объектов? Судя по гуглению форумов всяких, проблема таки была, а хорошего решения я не нашёл, в смысле при гуглении. И тут никто не сказал ничего кроме двух

E>1) перейти на х64
E>2) перейти на новый рантайм.

Естетсвенно, т.к. в общем случае задача нерешаема. Точно так же и в С++ — ты можешь накидать аллокаторы, но все равно для каждой стратегии аллокации будет худший сценарий, который и даст фрагментацию.

E>В С++ популярные под виндой аллокаторы большие объекты сразу по VirtualAlloc выделяют, без пачек, и сразу же по virtualFree освобождают, тоже без пачек...


Это никакого отношения к фраментации АП не имеет. Я показал два сценария, в которых твой VirtualAlloc ничем не помогает.
Re[41]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 10:54
Оценка:
Здравствуйте, Erop, Вы писали:

S>>На практике за 10 лет не встречал ни разу. Как добиться — в курсе, но зачем так делать — ума не приложу

E>Ну, то есть, на практике этот острый угол просто обходят, в том числе и избегая индексируемых по числу больших коллекций. Я так тебя и понял. Прямого способа пофиксить косяк аллокатора на практике, как я понял, не применяют.

Нет его, прямого способа. Не существует.

E>Дык тупит и УГ же, если есть большие списки. Мало того, сама MS это признала и в текущей версии рантайма поправила, но у пользователей большинство программ пока что ещё на старом рантайме же?..


Подфиксить можно только кое что. В общем случае проблема нерешаема.

E>В общем и в целом, я не знаю, возможно я что-то обидное нечаянно сказал, но суть всё равно свелась к двум тезиса.

E>1) АББРН
E>2) Эту проблему обходили выбирая другие алгоритмы/платформы, а не коллекции.

алгоритмы, платформы и коллекции в т.ч.
Re[40]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 21.10.13 12:24
Оценка:
Здравствуйте, Sinix, Вы писали:

E>>>>Пока что удалось выяснить что

E>>>>1) дотнетовский аллокатор вообще очень плохо совместим с большими кускам памяти, в отличии от кучи других аллокаторов. Не в последнюю очередь и потому, что он вообще неправильно с большими объектами работает.
S>>>Ошибка уже в первом пункте
E>>В смысле "ошибка" Так етсь таки проблемы с фрагментацией LOH или нет?
S>На практике за 10 лет не встречал ни разу. Как добиться — в курсе, но зачем так делать — ума не приложу

Так в чём ошибка? В том что это неправда, или в том что ты этого не встречал?

E>>Ты всё время тут пытаешься найти какие-то за и против шарпа.

S>Да ладно Пролистай последние 2 страницы
S>

шарповый аллокатор тупит на больших блоках [...]
S>тот дотнетовский аллокатор, который работает сейчас в программах у пользователей -- УГ


Правда же

S>

У тебя недержание контекста? Есть List. На кривом аллокаторе его использовать трудно — так?


Тебе форма не нравится? Так это обращение к Ikemefula — он вообще-то заслужил

S>

прибежали C#'исты с криками о том, что я даже чуть-чуть не разбираюсь, нужно читать доки, что проблема давно обкостылевается


Так это ты же прибежал и наехал
Автор: Sinix
Дата: 17.10.13
:

S>Вы хоть чуть-чуть разберитесь, перед тем как писать.

а в чём именно не разобрался так и не сказал

S>Это _я_ пытаюсь найти за и против?


Мы тут не пытаемся найти минусы/плюсы разных языков/сред, а обсуждаем конкретную проблему.

S>1. А может ли оно упасть?

S>2. OutOfMemoryException при попытке запихнуть большой лог в список. Чёрт его знает, как автор этого добился, в топике подробностей нет. Единственная мысль — в списке были большие структуры и человек словил ограничение в 2гб на размер массива.

Оба сообщения датируются 2012 годом, как минимум .NET 4.0 (в которой ситуация с аллокацией чуть лучше чем в предыдущих) уже доступна.
Кстати, там советы вида:

>The only way that I know of is Object Pooling, I know that it can be a pain in the rear(not the word I wanna choose), but it is an option.
[...]
>You could cap the size of the packets below the 80k limit. Then your buffers won't go on the LOH. Weigh up the speed gains from packets >80k against the need to specifically manage all the large objects.

Что скорее подтверждает выводы озвученные Erop'ом
Re[42]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 21.10.13 12:54
Оценка:
Здравствуйте, Sinix, Вы писали:

S>>>... 3. Использовать постоянный (кратный) размер блоков

E>>Да, грануляция, я про то и говорил с самого начала. Только это хорошо бы, что бы поддерживалось таки в контейнере самом. Как называется аналог листа, но с грануляцией размеров буфера?
S>Обычно зовётся paged list или chunked list. Из готовых есть BigList в PowerCollections

BigList это аналог std::map<std::size_t, T>, с O(log(N)) random access. А нужен именно аналог листа, чтобы после замены не выросла сложность алгоритма
Re[43]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 13:04
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

S>>>>... 3. Использовать постоянный (кратный) размер блоков

E>>>Да, грануляция, я про то и говорил с самого начала. Только это хорошо бы, что бы поддерживалось таки в контейнере самом. Как называется аналог листа, но с грануляцией размеров буфера?
S>>Обычно зовётся paged list или chunked list. Из готовых есть BigList в PowerCollections

EP>BigList это аналог std::map<std::size_t, T>, с O(log(N)) random access. А нужен именно аналог листа, чтобы после замены не выросла сложность алгоритма


С чего ты взял, что random access всегда является узким местом array-like структурах ?

Это может сказать только профайлер. Нужно знать, насколько критичен этот random access. Во многих случаях List можно заменить на BigList или даже ScanList или даже LinkedList, а во многих случаях random access можно на раз получить с помощью простого словаря, который будет создаваться-разрушаться на каждую операцию. Если время работы алгоритма больше долей секунды, то издержками на копирование в словарь можно пренебречь.
Re[42]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 21.10.13 13:49
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

E>> В алгоритме нужен большой вектор с доступом по индексу, но GC на таком листе дохнет из-за неудачной политики работы своего аллокатора больших объектов. Что в таком случае дылал лично ты, например?

НС>Если обязательно с доступом по индексу, то ChunkedList. В какой то мере его можно воспринимать как упрощенную вариацию деки на чанках. Но обычно доступа по индексу и не нужно.

Существует ли какая-нибудь распространённая реализация ChunkedList?
Re[46]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 21.10.13 15:27
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Итого — если у тебя есть возражения, покажи где я ошибся и что сделал неправильно, если тебе конечно есть что сказать.


У тебя был случай, где нужны были InsertAt(0)/RemoveAt(0)/InsertAt(random)/RemoveAt(random), и изначально ты выбрал List, а потом заменил на что-то более подходящее?
И ты пытаешься сказать что из этого следует, что std::deque вообще не нужна, и является лишь "рассуждением о прекрасном", а нужно что-то что даёт быструю вставку в середину?

Здесь обсуждаются случаи где изначально был List, и он был адекватным выбором, без всяких вставок в начало/середину, но из-за плохого аллокатора нужна альтернатива.
То что тебе когда-то потребовалось что-то типа std::set/unordered_set/etc, и ты это смог распознать, это конечно чрезвычайно полезный для тебя опыт, и видимо отпечатался в памяти как что-то необычное и чрезвычайно увлекательное. Но к данной дискуссии это не имеет никакого отношения
Re[48]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 21.10.13 16:06
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>У тебя был случай, где нужны были InsertAt(0)/RemoveAt(0)/InsertAt(random)/RemoveAt(random), и изначально ты выбрал List, а потом заменил на что-то более подходящее?

I>Другие операции тоже были нужны List был выбран 10 лет назад, только сначала это был ArrayList, потом поменяли из за дженериков, и только в 2012м году профайлер показал, что узкое место это коллекции. До этого были другие узкие места, что вполне объяснимо.

Ещё раз, этот твой конкретный опыт выбора структур данных (видимо вообще единичный), мало относится к текущему обсуждению

EP>>Здесь обсуждаются случаи где изначально был List, и он был адекватным выбором, без всяких вставок в начало/середину, но из-за плохого аллокатора нужна альтернатива.

I>Вставки в начало-середину становятся критичными только когда размер коллекции превышает определенный порог, до этого они даже незаметны.

До определённого порога, они будут быстрее в обычных массивах — это, например, одно из оснований использовать boost::flat_map-like. Но как это относится к данному топику? У нас же "огромные и ужасные List'ы"
Re[50]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 21.10.13 16:29
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>До определённого порога, они будут быстрее в обычных массивах — это, например, одно из оснований использовать boost::flat_map-like.

I>То есть, оптимизировать без реальной на то обходимости ? "у нас небольшой List давайте заменим на flat_map, потому что асимптотика подходит"

у flat_map вставка O(N)

>>Но как это относится к данному топику? У нас же "огромные и ужасные List'ы"

I>Правильно. И ответ, на что менять List, дает ответ профайлер и требования, а не рассуждения о прекрасном.

Профайлер дал ответ, что нужен random-access, что было ясно и без него(например, потому что реализуется heap), дальше что?
Re[43]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 21.10.13 16:51
Оценка:
Здравствуйте, Erop, Вы писали:

НС>>Кому?

E>Всем, это же публичный форум, не?..

Когда ты задаешь вопросы, кому то отвечая, по умолчанию эти вопросы относятся к тому кому ты отвечаешь.

НС>>Икемефуле? А почему тогда ты сделал вывод о "С#-разрабов в массе своей"? Я пока логики у тебя не улавливаю.

E>Бывает. В целом я не обещал, что до всех дойдёт...

Перешел на личности — слил.

E>Так что там у нас с общепринятым решением?


Ты так и не ответил — решением какой задачи?

НС>>Для чего того же? Для разворота списка?

E>Очень трудно поймать чёрную кошку в тёмной комнате, особенно если её не ловить...

Т.е. ты не знаешь для чего?

НС>>Но обычно доступа по индексу и не нужно.

E>Это можно интерпретировать так, что обычно алгоритмы, где таки нужно, программируют на более иных языках?..

Не перестаешь меня поражать вершинами своей логики.

НС>>Разумеется, абсолютно универсального рецепта нет.

E>Ну вот я про то же самое, как бы...

Нет, ты про то что "С#-разрабы в массе своей не смогли разобраться в причинах проблемы и просто перестали использовать большие вектороподобные коллекции".
Re[44]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 17:43
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Нет, ты про то что "С#-разрабы в массе своей не смогли разобраться в причинах проблемы и просто перестали использовать большие вектороподобные коллекции".


"... и перестали строить боевых человекоподобных роботов-гигантов"
Re[42]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 17:48
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Для чего того же? Для разворота списка?


Кстати, о развороте списка.
Насколько я понял из обсуждения, с фрагментацией всё будет плохо после того, как размер буфера перевалит несколько сотен метров, но в решении с листом, у нас же был лист ссылок, так что его размер буфера равнялся, как раз, издержкам твоего односвязного списка на ссылках, это если нет других накладных расходов на аллокацию. Кстати, они таки есть?

В любом случае, такое решение становится неработоспособно только тогда, когда уже и сам односвязный список слишком дорог, так как если элемент в нём больше, чем ссылка, то память закончится раньше, чем скажутся ограничения листа, а если меньше, то выходит, что там очень низкий кпд какой-то...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[48]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 18:01
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Другие операции тоже были нужны List был выбран 10 лет назад, только сначала это был ArrayList, потом поменяли из за дженериков, и только в 2012м году профайлер показал, что узкое место это коллекции. До этого были другие узкие места, что вполне объяснимо.


А как ты думаешь, тормоза из-за неадекватного выбора коллекции, возникли 0 лет назад, и только в 2012 тебе их удалось заметить профайлером, или сначала их не было?
А то может у вас там всё так же неадекватно было запрограммировано, и вы потом профайлером 10 лет выпрямляли изначально кривую архитектуру?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[44]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 18:16
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Когда ты задаешь вопросы, кому то отвечая, по умолчанию эти вопросы относятся к тому кому ты отвечаешь.

Это твоё мнение, но оно не обязательно разделяется всеми участниками форума.
Во всяком случае ты, например, зачем-то стал отвечать на реплики Евгения и мои, опубликованные в ответах на сообщения I...

НС>Перешел на личности — слил.

В смысле? Это ты заметил, наконец, что вместо шарповского листа давно уже меня обсуждаешь?
Или о каком переходе на личности речь? Я не обещал разъяснять всем свои тезисы до полного их понимания всеми, и не буду это делать. Если тебе не удалось уловить мою логику, то могу посоветовать перечитать всё внимательно и попытаться таки уловить, или просто смириться, что ты этого не поймёшь...
В чём тут переход на личности, я

НС>Т.е. ты не знаешь для чего?

Я знаю, что ты не поймёшь меня, потому, что тебе хочется не понять...

Если тебе нужна пример задачи с выборкой по индексу, то ради бога. У тебя есть два сигнала. Один используется во всех запросах, и он записан с шагом в t микросекунд в буфер, вернее не он, а его интеграл, а второй меняется от запроса к запросу и является перечислением интервалов, ну там с такого времени по такое + с такого по такое и -- единица, а остальное время -- ноль т. д.
Надо быстро считать свёртки...

НС>Нет, ты про то что "С#-разрабы в массе своей не смогли разобраться в причинах проблемы и просто перестали использовать большие вектороподобные коллекции".


Ну так так и есть. Я только не понимаю, поему ты достраиваешь это утверждение фразой "потому, что они дураки", а не фразой, "потому, что им это не надо"?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[52]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 18:18
Оценка:
Здравствуйте, Ikemefula, Вы писали:
I>То есть, даже рассуждения о прекрасном не помогают ?
Рассуждения без понимания не понимают никогда.

I>Вот тогда можно подбирать конкретную оптимизацию. И вот именно random-access как правило редкий случай, почти что экзотический. Там где он становится узким местом, почти наверняка проблема не в коллеции, а в платформе, если алгоритм верный. Чем тебе здесь дека поможет — совершенно не ясно.


Угу. Понимаю. Ну да, сервер медленный, нужен апгрейд, кто ы сомневался...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[46]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 21.10.13 18:51
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Это может сказать только профайлер.

EP>>Давай ты не будешь разводить демагогию на тему node-based tree vs indexed chunks, необходимость профайлеров и всё-такие, ок?
I>Демагогия это у тебя, т.к. общие рассуждения о прекрасном при отрицании необходимости профайлера.

Я не отрицаю необходимость профайлера. Я говорю что он далеко не всегда нужен, особенно в тривиальных местах

I>В реальном приложении обращения к коллекции не все одинаковые, а это разные операции у которых, внезапно, разная частота использования. И вот этот расклад, внезапно, показывает профайлер !


Однажды шеф дал мне кусок кода в ~250 строк из стороннего проекта, мол тормозит нужно оптимизировать.
В том коде использовалась библиотека и среда которая у меня не была установлена+настроена. Используя только документацию по этой библиотеке и текстовый редактор (omg, без компилятора! ) я улучшил производительность в 10x на конкретных данных (а в общем случае и того больше) — при этом код собрался и заработал с первого раза, без ошибок и предупреждений.
А ты говоришь profiler
Re[45]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 21.10.13 18:54
Оценка:
Здравствуйте, Erop, Вы писали:

НС>>Когда ты задаешь вопросы, кому то отвечая, по умолчанию эти вопросы относятся к тому кому ты отвечаешь.

E>Это твоё мнение, но оно не обязательно разделяется всеми участниками форума.

А, ну конечно — твоя версия что никто не знает на них ответов конечно же правдоподобнее А главное — как удобно то.

E>Во всяком случае ты, например, зачем-то стал отвечать на реплики Евгения и мои, опубликованные в ответах на сообщения I...


Затем что посчитал интересным на них ответить. Но это вовсе не означает, что если я на какие то другие, напрямую мне не заданные вопросы в этом топике не ответил, то это означает что я не способен на них ответить.

НС>>Перешел на личности — слил.

E>В смысле?

В прямом. Начал в очередной раз обсуждать мою личность — слил.

E> Это ты заметил, наконец, что вместо шарповского листа давно уже меня обсуждаешь?


Это ты что то лишнее заметил — я обсуждаю не тебя, а твои высказывания.

E>Или о каком переходе на личности речь? Я не обещал разъяснять всем свои тезисы до полного их понимания всеми, и не буду это делать.


Ну так и скажи — продемонстрировать логическую цепочку не можешь.

НС>>Т.е. ты не знаешь для чего?

E>Я знаю, что ты не поймёшь меня, потому, что тебе хочется не понять...



E>Если тебе нужна пример задачи с выборкой по индексу, то ради бога. У тебя есть два сигнала. Один используется во всех запросах, и он записан с шагом в t микросекунд в буфер, вернее не он, а его интеграл, а второй меняется от запроса к запросу и является перечислением интервалов, ну там с такого времени по такое + с такого по такое и -- единица, а остальное время -- ноль т. д.

E>Надо быстро считать свёртки...

Если надо быстро считать, то тут точно на С++ писать придется. Но не из-за памяти, а потому что CLR до сих пор не имеет интринсиков для векторных расширений.

НС>>Нет, ты про то что "С#-разрабы в массе своей не смогли разобраться в причинах проблемы и просто перестали использовать большие вектороподобные коллекции".


E>Ну так так и есть.


Нет, так не есть.

E> Я только не понимаю, поему ты достраиваешь это утверждение фразой "потому, что они дураки", а не фразой, "потому, что им это не надо"?


У тебя какие то помехи в канале, я твою фразу не достраивал, я ее привел as is, путем копирования через буфер обмена.
Re[43]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 21.10.13 18:54
Оценка:
Здравствуйте, Erop, Вы писали:

E>Насколько я понял из обсуждения, с фрагментацией всё будет плохо после того, как размер буфера перевалит несколько сотен метров, но в решении с листом, у нас же был лист ссылок, так что его размер буфера равнялся, как раз, издержкам твоего односвязного списка на ссылках, это если нет других накладных расходов на аллокацию.


Сорри, я не смог распарсить что ты написал. О каких издержках речь?

E> Кстати, они таки есть?


Я не очень тебя понял, но в GC, покуда мы в LOH не попадаем, накладные расходы на аллокацию — единицы тактов процессора.

E>В любом случае, такое решение становится неработоспособно только тогда, когда уже и сам односвязный список слишком дорог, так как если элемент в нём больше, чем ссылка, то память закончится раньше, чем скажутся ограничения листа


1) Не стоит путать меня с Икемефулой. Я нигде не утверждал что на задаче реверса списка без какого либо другого кода будут проблемы с фрагментацией спейса.
2) Что же касается фрагментации в целом, то я лично тебе писал, что проблемы с фрагментацией на практике наступают даже при размере непрерывных кусков в единицы десятков мегабайт. Но на примитивных тестах это не так то просто воспроизвести, потому что процесс отчасти случайный и вылазит обычно в сложных и многоплановых приложениях, работающих не в батч-режиме, а откликаясь на внешние возбуждения. И решаются они, кстати, чаще вовсе не хитрыми структурами данных или аллокаторами памяти, а переделкой алгоритмов на такие, которые способны работать без индексного доступа.
И вот в таком разрезе таки вылазит нагляднейшая разница между вариантом со списком и вариантом с IEnumerable. Потому что этот IEnumerable вполне может тянуть данные напрямую из сети или с диска (а если добавить его зеркало, IObservable, то еще и лить напрямую в сеть/на диск), и потребление памяти сократится до игрушечных величин.
Re[47]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 21.10.13 18:59
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>В том коде использовалась библиотека и среда которая у меня не была установлена+настроена. Используя только документацию по этой библиотеке и текстовый редактор (omg, без компилятора! ) я улучшил производительность в 10x на конкретных данных (а в общем случае и того больше) — при этом код собрался и заработал с первого раза, без ошибок и предупреждений.


Вопрос только в том, сколько бы времени заняло то же самое без профайлера, и насколько меньше пришлось бы уродовать кода в угоду оптимизации.
Re[48]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 21.10.13 19:08
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>В том коде использовалась библиотека и среда которая у меня не была установлена+настроена. Используя только документацию по этой библиотеке и текстовый редактор (omg, без компилятора! ) я улучшил производительность в 10x на конкретных данных (а в общем случае и того больше) — при этом код собрался и заработал с первого раза, без ошибок и предупреждений.

НС>Вопрос только в том, сколько бы времени заняло то же самое без профайлера,

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

НС>и насколько меньше пришлось бы уродовать кода в угоду оптимизации.


Там было ~20 простых правок, как раз на правильное обращение с памятью и структурами данных.
Re[49]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 21.10.13 19:10
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Там не использовался профайлер.


Ну так в том и вопрос — что бы было если бы использовался.

НС>>и насколько меньше пришлось бы уродовать кода в угоду оптимизации.

EP>Там было ~20 простых правок, как раз на правильное обращение с памятью и структурами данных.

Ну, если ты смог найти в коде явный косят это здорово, вот только далеко не всегда это можно сделать глазами за приличное время.
Re[50]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 21.10.13 19:18
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>Там не использовался профайлер.

НС>Ну так в том и вопрос — что бы было если бы использовался.

Я уверен что в этом конкретном случае было бы дольше — так как всё было на поверхности.

НС>>>и насколько меньше пришлось бы уродовать кода в угоду оптимизации.

EP>>Там было ~20 простых правок, как раз на правильное обращение с памятью и структурами данных.
НС>Ну, если ты смог найти в коде явный косят это здорово, вот только далеко не всегда это можно сделать глазами за приличное время.

Согласен. Но мой поинт в том, что большой класс проблем с производительностью можно избежать в зародыше, правильно выбрав структуры данных, а не ждать что-же скажет profiler по этому поводу.
Re[43]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 19:21
Оценка:
Здравствуйте, Erop, Вы писали:

E>Кстати, о развороте списка.

E>Насколько я понял из обсуждения, с фрагментацией всё будет плохо после того, как размер буфера перевалит несколько сотен метров, но в решении с листом, у нас же был лист ссылок, так что его размер буфера равнялся, как раз, издержкам твоего односвязного списка на ссылках, это если нет других накладных расходов на аллокацию. Кстати, они таки есть?

Очевидно — есть и я даже написал, какие именно.

E>В любом случае, такое решение становится неработоспособно только тогда, когда уже и сам односвязный список слишком дорог, так как если элемент в нём больше, чем ссылка, то память закончится раньше, чем скажутся ограничения листа, а если меньше, то выходит, что там очень низкий кпд какой-то...


Ты похоже отказываешься понять, что "память закончится" это вещь сильно относительная.
Re[47]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 19:23
Оценка:
Здравствуйте, Erop, Вы писали:

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


I>>Не всех операций, а только критичных, что покажет __профайлер__. Вообще оптимизируются исключительно __узкие__ места, а не все подряд.


E>а пессимизируются, зато все? Или как?


Или как разумеется.

>В целом, подход весьма экологичен, и мне нравится. Если какие-то операции, не дай Бог преждевременно оптимизируешь, то профайлер покажет, что остальные тормозят, и надо ускорять код, а вот если тормоза аккуратненько ровным слоем размазать, то профайлер "покажет", что тормозит сервер, и надо ускорять датацентр...


Если тормоза размазать ровным слоем, то профайлер покажет, что тормоза размазаны ровным слоем.
Re[51]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 21.10.13 19:25
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Согласен. Но мой поинт в том, что большой класс проблем с производительностью можно избежать в зародыше, правильно выбрав структуры данных


А мой опыт оптимизации реального кода говорит, что 90% устраняемых при этом проблем вовсе не из-за неправильно выбранных структур данных.
Re[44]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 19:49
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Сорри, я не смог распарсить что ты написал.

Бывает...

НС>О каких издержках речь?

У односвязного списка есть естественный оверхед -- это один указатель на элемент.
Если мы храним в списке данные размером байт в 100, то это фигня, а если мы таки имеем односвязный список букв, то в случае без выравнивания, получим, что на букву (один или два байта) нам надо 4 байта оверхеда, в 32-битном случае, а с выравниванием 6-7 байт...

Но, у аллокаторов иногда бывают ещё и доп издержки, их ещё внутренней фрагментацией иногда называют. Ну, там кто-то хранит размеры блоков, кто-то выравнивает границы блоков на 16 байт, кто-то ещё что-то такое делает.

E>> Кстати, они таки есть?

Ну я е знаю, в дотнете как аллокатор работает. Там есть оверхед на аллокцируемый блок по памяти какой-то? И если есть, то каков он?

НС>Я не очень тебя понял, но в GC, покуда мы в LOH не попадаем, накладные расходы на аллокацию — единицы тактов процессора.

Тебя не смутило, что я оверхед в мегабайтах исчисляю? Я про память, если ты не заметил...

НС>1) Не стоит путать меня с Икемефулой. Я нигде не утверждал что на задаче реверса списка без какого либо другого кода будут проблемы с фрагментацией спейса.

Если ты тоже считаешь стартовое сообщение этой темы излишне паникёрским и неадекватно преувеличивающим проблемы, то у нас с тобой тогда по этому вопросу разногласий нет...

НС>2) а переделкой алгоритмов на такие, которые способны работать без индексного доступа.

Да понял я это, не волнуйся. Я не только понял, но даже кратко сформулировал и повторил... почему это вызвало такой протест я не понимаю. Все шарписты, которые тут отметились, говорят ровно тоже самое, но не согласны при этом с моим утверждением.

НС>И вот в таком разрезе таки вылазит нагляднейшая разница между вариантом со списком и вариантом с IEnumerable. Потому что этот IEnumerable вполне может тянуть данные напрямую из сети или с диска (а если добавить его зеркало, IObservable, то еще и лить напрямую в сеть/на диск), и потребление памяти сократится до игрушечных величин.


Да я понял, уже всё, что ты сказал на эту тему.
Ну вот прикинь, сигнал мы пишем с датчика, в память, храним потом его, и для каки-то исследований, считаем разные свёртки. при этом сигнал, пока пишем, ещё и интегрируем, что бы свёртки быстро считать можно было.

Я конечно понимаю, что в каком-то приближении под WIN32, если у нас вообще есть своп-файл, то память и диск -- это примерно одно и то же. Но таки не совсем...

Засим тему предлагаю зарыть, ты уже вполне достаточно объяснил, что в шарпе наступил коммунизм, в том смысле, что нет не нормальной коллекции с доступом по индексу, а потребности в ней, ровно как и в колбасе при коммунизме
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[45]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 19:53
Оценка:
Здравствуйте, Erop, Вы писали:

E>Да я понял, уже всё, что ты сказал на эту тему.

E>Ну вот прикинь, сигнал мы пишем с датчика, в память, храним потом его, и для каки-то исследований, считаем разные свёртки. при этом сигнал, пока пишем, ещё и интегрируем, что бы свёртки быстро считать можно было.

Представь себе — большей частью такие приложения на дотнете не пишутся. Есть конечно самоделкины, которые реалтайм хотят обеспечить да еще кое какие потоковые данные обрабатывать, но их совсем не много.
Re[44]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 20:01
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты похоже отказываешься понять, что "память закончится" это вещь сильно относительная.


Ну это у кого как... У некоторых есть цели в ТЗ, что программа должна помещаться в столько-то рам даже без свопа и привет
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[46]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 20:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I> Я тебе страшное скажу — на продуктах, где я работал, ключевые алгоритмы и структуры данных определялись не программистами, а математиками. Да и программисты в основном были с математическим образованием.

Почему страшное? Я вот тоже с математическим образованием, и скорее не программист, а математик...

Кстати, ты им тоже говори так гордо, что они в IT не работают и не программисты вовсе?..

I> И это, кстати говоря, не отменяет необходимость профайлера — никто в своем уме не проектирует структуры данных под вырост на любой размер данных.

Ну, обычно, если есть проект, то там указаны ограничения, или легко из него понятны, так скажем...

I>Вобщем твои понты прошли мимо кассы.

В смысле "понты"? Пока что всё, что ты рассказываешь, точно соответствует моим "понтам", ну кроме того, что ты "не математик", и, похоже, этим горд и менять такого важного статуса не планируешь...
Хотя я же уже писал, что это тоже вполне подход и для некоторыхх задач он очень даже в тему.

I>Были даже еще более убогими 10 лет назад С++ за С++ не считался, если с теперешним сравить.


Не знаю, кто там у кого не считался, и за что, но 10 лет назад был 2003 год, ну это так, для сведения о календаре и прочих жизненных обстоятельствах на нашей планете
А на вашей что было?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[46]: собеседования, Реверс списка
От: Erop Россия  
Дата: 21.10.13 20:26
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Представь себе — большей частью такие приложения на дотнете не пишутся. Есть конечно самоделкины, которые реалтайм хотят обеспечить да еще кое какие потоковые данные обрабатывать, но их совсем не много.


Чёрт! Я же так и понял, что в случае если нужны таки большие массивы, то пишем на С++ и не жужжим. И так и написал в нескольких местах. Ты можешь пояснить кто тут с чем не согласен-то?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[51]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 20:47
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Согласен. Но мой поинт в том, что большой класс проблем с производительностью можно избежать в зародыше, правильно выбрав структуры данных, а не ждать что-же скажет profiler по этому поводу.


Я за свои годы в основном тем и занимался, что реанимировал убитые проекты, занимаясь, в т.ч. оптимизацией.

Со структурами данных все понятно, когда у тебя все локализовано и можно посчитать вычислительную сложность "на коленке". А если кода >50мб, из них большая часть всевозможные алгоритмы, самой разной природы, то "правильно выбрав структуры данных" есть просто "рассуждения о прекрасном".

То есть,в большом приложении совершенно не ясно, как повлияет на общий расклад изменение одной единственной операции, которая нужна везде, всем и постоянно. Она может вызываться на порядок другой чаще других, быть написаной сколь угодно неэффективно, но при это её вклад в общее время работы меньше 1-10%. И на кой ляд её трогать ?

В таком коде проблемы большей частью не в структурах данных, а во внутреннем АПИ, дизайне взаимодействия модулей и тд и тд. И очень часто проблемы можно решить ровно на тех же структурах данных, меняя сам способ управления данными — например, тупо загружая по требованию
Re[52]: собеседования, Реверс списка
От: Evgeny.Panasyuk Россия  
Дата: 21.10.13 20:55
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Согласен. Но мой поинт в том, что большой класс проблем с производительностью можно избежать в зародыше, правильно выбрав структуры данных, а не ждать что-же скажет profiler по этому поводу.

I>Я за свои годы в основном тем и занимался, что реанимировал убитые проекты, занимаясь, в т.ч. оптимизацией.
I>[skip]

Это всё конечно очень интересно, но к чему всё это?
Ты притянул за уши какой-то случай из своей практики, где замена вектора на деку не помогла бы, потому что (surprise!) вектор изначально был выбран не правильно
Хотя у нас тут обсуждается случай вектора, который валится на фрагментации из-за плохого аллокатора.
Re[47]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 20:58
Оценка:
Здравствуйте, Erop, Вы писали:

I>> Я тебе страшное скажу — на продуктах, где я работал, ключевые алгоритмы и структуры данных определялись не программистами, а математиками. Да и программисты в основном были с математическим образованием.

E>Почему страшное? Я вот тоже с математическим образованием, и скорее не программист, а математик...

E>Кстати, ты им тоже говори так гордо, что они в IT не работают и не программисты вовсе?..


Им то зачем ? Они уверенно отличают адресное пространство от памяти, и четко понимают, что VirtualAlloc в обсуждаемом вопрос как козе боян.

I>> И это, кстати говоря, не отменяет необходимость профайлера — никто в своем уме не проектирует структуры данных под вырост на любой размер данных.

E>Ну, обычно, если есть проект, то там указаны ограничения, или легко из него понятны, так скажем...

Представь себе продукт навроде САПР, в котором только дотнетного кода 50мб, а есть еще джава, С++, куча скриптов и даже кое что на ассемблере + кучка 3rd party либ. Над продуктом на старте работало почти пол-сотни человек, при том, что индусского кода в нём практически нет, и бОльшая часть — или математики, или с математическим образованием. Алгоритмы — свои же наработки из R&D, так и заимствования из разных разделов математики.

Но, не сомневаюсь, ты бы за день все требования вкурил, за второй проанализировал код, а за третий переписал все с нуля на С++.

I>>Вобщем твои понты прошли мимо кассы.

E>В смысле "понты"? Пока что всё, что ты рассказываешь, точно соответствует моим "понтам", ну кроме того, что ты "не математик", и, похоже, этим горд и менять такого важного статуса не планируешь...

Время нельзя потратить на всё подряд. Есть вещи, которые у меня получаются лучше математики. Так что я спокойно смотрю, если у кого то математика получается лучше, чем у меня.
Re[53]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.10.13 21:21
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Это всё конечно очень интересно, но к чему всё это?

EP>Ты притянул за уши какой-то случай из своей практики, где замена вектора на деку не помогла бы, потому что (surprise!) вектор изначально был выбран не правильно

Если рассуждать о прекрасном то можно далеко зайти. Вектор вообще то изначально правильно был выбран. Узким местом он стал только в 2012м году и в основном потому, что
1 в проекте нельзя было уйти от х32 — 3rd party, плюсовый код и тд
2 потребовалось увеличить вдвое объем данных в памяти, специфика такая

Скажем, для х64 мы бы оставили тот же вектор, но соптимизировали другую часть, и совершенно иначе — тупо распыляя память и дублируя данные, совмещая это с отложеной загрузкой. Типичный комп под наши задачи на х64 это от 8гб и выше, и это нормально, такие у кастомеров машины. Но вот проблемы с х32 забороть не вышло, а держать две версии продукта при радикально различных направлениях оптимизации мягко говоря, не дешево.
Re[52]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 05:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Просто так. У меня КСВ это способ пар выбросить, а не чтото дельное показать. За прошлые две недели я вкинул кода больше, чем за всё лето, так что нужно было где то отвлекаться, что бы мозг не закипел.


Сочувствую. IMHO, решать психологические проблемы путём форумов почти так же плохо, как с помощью еды или алкоголя
Кстати, если ты всё это про пар, напишешь в подписи, то к тебе будут относиться с большим пониманием...

I>Что касается обращения списка, то оно ужасное. Я хотя ошибся в масштабе проблемы, с математикой плохо, но в целом все верно — добавление в List без указания размера слишком часто не имеет права на жизнь. Нагрузка на GC слишком большая, хоть это и неочевидно.

1) У этого "не имеет права на жизнь" и "ужасное" есть какие-то ЧИСЛЕДННЫЕ оценки?..
2) Как я тебя понял, ты оценить издержки того или иного кода без профайлера не можешь, как ты это сделал тут?

I>Во вторых, оно громоздкое, втрое длиннее обычного решения "в лоб" — в большинстве случаев короткий код чаще всего понятнее, правильнее, быстрее и вообще эффективнее.

Зато код со списком проще, и, если такого рода кода в проекте много, то копирование туда и сюда будут функциями...

I>Вот надо будет к проекту студента "на вырост" подключить — он в таких местах накосячит будь здоров. А с понятным кодом таких мин не будет.


Не-не-не, Давид Блейн, студент, скорее накосячит с кодом, который жонглирует ссылками, а не с кодом, который сначала в массив всё перекладывает, а потом обратно...

Кстати, обрати внимание, скока споров в основной ветке вызвало решение Дворкина. А всё из-за непонятности, кстати...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[43]: собеседования, Реверс списка
От: Sinix  
Дата: 22.10.13 06:11
Оценка:
Здравствуйте, Andir, Вы писали:

A>Есть способ проще, надо всего лишь, чтобы приложение работало с COM-компонентом x86.

A>За свою практику я уже несколько раз видел проекты с OOM из-за фрагментации памяти именно в таких условиях. Ещё один опыт был в Silverlight приложении, которое тоже работает в x86-браузере ессно.

Кстати, да — с интеропом всегда грабель немеряно.
Re[49]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 10:26
Оценка:
Здравствуйте, Erop, Вы писали:

E>Второе -- это они зря. Вот у вас ООМ 10 лет и выскакивает поэтому...


Несовсем ясно, откуда с 2012 по 2013й взялось десять лет

E>И что? Ты хочешь сказать, что этот проект сложнее, чем вы можете управлять, или что?


Я хочу сказать, что проект сложнее чем ты себе нафантазировал.

E>Обычно, когда разрабатывают что-то такое, то проводят, в том числе и нагрузочное тестирование. Ну типа самый большой документ, как ещё можно, самая объёмная операция и т. д. И что бы это тестирование провести выясняют на что у нас программа-то рассчитана и почему. В чём суть ограничений...


Спасибо, капитан очевидность.

E>Могут, конечно, вылезти потом совсем неожиданные косяки, но чем лучше управление проектом, тем этих неожиданных косяков, а если вы 10 лет, как на вулкане живёте и строгаете затычки по результатам профилирования, то значит качество управления не очень хорошее. Я не хочу сказать, что у вас так или сяк, я не знаю как у вас. Я просто указал два полюса, тебе виднее к какому ближе ваша контора...


Покажи откуда следует "строгаете затычки по результатам профилирования"

I>>Но, не сомневаюсь, ты бы за день все требования вкурил, за второй проанализировал код, а за третий переписал все с нуля на С++.


E>В смысле? Какие требования?


О, дурачка включил.

E>Только я не понимаю всё равно, чего ты споришь о сложности алгоритмов ничего в этом не понимая, и как ты понял, что использовать лист в задаче обращения списка накладно, хот ты это решение не профилировал...


Наоборот. Именно реверсом можно пренебречь, а вот добавлением в список — такое постоянно где нибудь вылазит.
Re[53]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 10:30
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Что касается обращения списка, то оно ужасное. Я хотя ошибся в масштабе проблемы, с математикой плохо, но в целом все верно — добавление в List без указания размера слишком часто не имеет права на жизнь. Нагрузка на GC слишком большая, хоть это и неочевидно.

E>1) У этого "не имеет права на жизнь" и "ужасное" есть какие-то ЧИСЛЕДННЫЕ оценки?..

Все уже было сказано.

E>2) Как я тебя понял, ты оценить издержки того или иного кода без профайлера не можешь, как ты это сделал тут?


Рассуждать о прекрасном можно сколько угодно. Профайлер сообщит те самые константы, которые почему то всегда исключают из рассмотрения.

I>>Во вторых, оно громоздкое, втрое длиннее обычного решения "в лоб" — в большинстве случаев короткий код чаще всего понятнее, правильнее, быстрее и вообще эффективнее.

E>Зато код со списком проще, и, если такого рода кода в проекте много, то копирование туда и сюда будут функциями...

Который проще ? Который в три раза больше нормального ?

E>Не-не-не, Давид Блейн, студент, скорее накосячит с кодом, который жонглирует ссылками, а не с кодом, который сначала в массив всё перекладывает, а потом обратно...


Да как то наоборот выходит

E>Кстати, обрати внимание, скока споров в основной ветке вызвало решение Дворкина. А всё из-за непонятности, кстати...


Оно, во первых, на плюсах, с указателями. Во вторых, полный вариант решения, а не огрызок.
Re[54]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 11:09
Оценка:
Здравствуйте, Ikemefula, Вы писали:

E>>1) У этого "не имеет права на жизнь" и "ужасное" есть какие-то ЧИСЛЕДННЫЕ оценки?..

I>Все уже было сказано.

То есть ответ
1а) оценок нет
1б) ты не математик к тому же

Я верно перевл?

I>Рассуждать о прекрасном можно сколько угодно. Профайлер сообщит те самые константы, которые почему то всегда исключают из рассмотрения.

Так как ты оценил-то без профалера?
И, кстати, кто конкретно "всегда исключает из рассморения"? Математики из вашей конторы или кто-то ещё?..

I>Который проще ? Который в три раза больше нормального ?

"Больше" не значит "сложнее".

I>Да как то наоборот выходит

О! У вас и студенты тоже *высший клас*... А вот у НС большинство не осиливают таки реверс списка в том ключе, какой он и ты хотите, а вот с промежуточнм листом осиливают. Интересно, как так выходит?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[51]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 11:50
Оценка:
Здравствуйте, Erop, Вы писали:

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


I>>Несовсем ясно, откуда с 2012 по 2013й взялось десять лет

E>Ты писал, что архитектуре 10 лет, но тормоза от листа вылечили тока в 2012...

Нет, такого не писал. Я написал что ООМ вылез в 2012м, а до того узким местом были не коллекции а совсем другие вещи, но ты, конечно, не читатель

E>А до того их не замечали. Или ты как-то неточно выразился?


Похоже твои навыки чтения оставляют желать лучшего

I>>Я хочу сказать, что проект сложнее чем ты себе нафантазировал.

E>А уоткуда ты знаешь, что я себе нафантазировал?..

А это очевидно — ", если есть проект, то там указаны ограничения, или легко из него понятны, так скажем..."

I>>Спасибо, капитан очевидность.

E>Пожалуйста, тогда у меня вопрос, если вы всё так и делали, как так полцчилось, что вы превысили проектные нагрузки, вы узнали из профайлера?

Проектные нагрузки никто не превышал. Если кастомеру нужно скажем объем данных Х, то в релизе будет запас некоторый. Какие проблемы решаются до релиза, кастомера не интересует, главное что бы ООМ не было у кастомера.
Новые требования — увеличить объемы данных примерно вдвое. И при всем этом проект масштабировался __постоянно__, а не раз в 10 лет.
Поэтому в условиях ограниченного АП, т.е. х32, ООМ это вполне ожидаемая проблема.

Более того, после оптимизации, если кастомеры снова захотят удвоить объем данных, снова вылезет ООМ. В общем случае для х32 это не решается, все что можно — это найти решение для текущего объема данных, с некоторым запасом.
Re[55]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 11:58
Оценка:
Здравствуйте, Erop, Вы писали:

E>То есть ответ

E>1а) оценок нет
E>1б) ты не математик к тому же

E>Я верно перевл?


Твои навыки чтения оставляют желать лучшего. Поищи что я писал про фрагментацию и размер непрерывного окна в АП в большом приложении под х32

I>>Рассуждать о прекрасном можно сколько угодно. Профайлер сообщит те самые константы, которые почему то всегда исключают из рассмотрения.

E>Так как ты оценил-то без профалера?

С профайлером.

E>И, кстати, кто конкретно "всегда исключает из рассморения"? Математики из вашей конторы или кто-то ещё?..


В зависимости от сложности математики.

I>>Который проще ? Который в три раза больше нормального ?

E>"Больше" не значит "сложнее".

В большинстве случаев наоборот.

I>>Да как то наоборот выходит

E>О! У вас и студенты тоже *высший клас*... А вот у НС большинство не осиливают таки реверс списка в том ключе, какой он и ты хотите, а вот с промежуточнм листом осиливают. Интересно, как так выходит?..

Не знаю, чего умеют ваши студенты, в свое время я попал на собеседование в голландскую контору, где предложили за час решить около двух десятков задач, включая реверс списка. Как оказалось, эти задания они дают джуниорами и от джуниора требуется решить не менее 80% задач и реверс это обязательное условие. Для более опытного кандидата 100% это просто повод для дальнейшего разговора. Так что вот.

Да и вообще, по честному, задача по сложности навроде реверса, решается вменяемым студентом за пол-часа от силы.
Re[41]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 12:01
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Проблемы есть и было сказано, когда и при каких условиях они возникают.

E>А вот твой коллега утверждает
Автор: Sinix
Дата: 21.10.13
, что конкретно такая проблема -- редкость...


Более того — я сам говорил, что это не типичная проблема. Забыл ? "типичный случай нетипичного случая"

I>>Это никакого отношения к фраментации АП не имеет. Я показал два сценария, в которых твой VirtualAlloc ничем не помогает.


E>Это всё, как ты говоришь, "рассуждения о прекрасном", а в реальности ещё как помогает, и я даже уже пару раз объяснял тут почему помогает, но Ikemefula-то, если и читатель, то уж точно не пониматель


Я показал два сценария фрагментации, один из них простейший, проще не бывает — два фрагмента. Покажи как там поможет VirtualAlloc.
Re[41]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 12:11
Оценка:
Здравствуйте, Erop, Вы писали:

E>Это всё, как ты говоришь, "рассуждения о прекрасном", а в реальности ещё как помогает, и я даже уже пару раз объяснял тут почему помогает, но Ikemefula-то, если и читатель, то уж точно не пониматель


В реальности те случаи VirtualAlloc, про которые ты говорил, организуются на раз самопальным аллокатором безо всякого VirtualAlloc. Физической памяти сожрут больше, а с фрагментацией будет все в порядке, более того, можно сделать так, что указатели на размещаемые объекты будут идентичными. Представь себе весь ужас
Re[45]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 12:56
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Ты похоже отказываешься понять, что "память закончится" это вещь сильно относительная.


E>Ну это у кого как... У некоторых есть цели в ТЗ, что программа должна помещаться в столько-то рам даже без свопа и привет


Как бы очевидно, что если прога должна работать с объемом данных Х, то на этом объеме не должно быть ни ООМ, ни свопа, ни лагов, ни замерзаний.

Вот тебе это очевидно ?
Re[52]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 12:58
Оценка:
Здравствуйте, Ikemefula, Вы писали:

E>>Ты писал, что архитектуре 10 лет, но тормоза от листа вылечили тока в 2012...


I>Нет, такого не писал. Я написал что ООМ вылез в 2012м, а до того узким местом были не коллекции а совсем другие вещи, но ты, конечно, не читатель


Ну так может оно память и АП жрало не по делу и раньше, просто до ООМ не доходило пока?..

I>А это очевидно — ", если есть проект, то там указаны ограничения, или легко из него понятны, так скажем..."

Ну дык и? Вот, например, ограничения и всякие системные требования ОС виндовс майкрософт оценить в состоянии, например. У вас проект сложнее винды?..

I>Проектные нагрузки никто не превышал. Если кастомеру нужно скажем объем данных Х, то в релизе будет запас некоторый. Какие проблемы решаются до релиза, кастомера не интересует, главное что бы ООМ не было у кастомера.


Ну да. Но я так тебя понял, что ООМ в 2012 был для вас неожиданностью...
И что рвануло смотрели по профайлеру. Вот наши продукты, например, всё время проверяются на то, скока памяти ап и прочих ресурсов кушают и излишки каждый раз подрезаются...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[56]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 13:01
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>С профайлером.

и что ты профилировал?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[42]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 13:03
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>В реальности те случаи VirtualAlloc, про которые ты говорил, организуются на раз самопальным аллокатором безо всякого VirtualAlloc.


Это пока у тебя единый код и весь на одном гц... А как только появляются разные компоненты, так выбора нет, приходится использовать тот же аллокатор, что и все, иначе вы с ними в момент всё сфрагментируете...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[46]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 13:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>> (*) Ты похоже отказываешься понять, что "память закончится" это вещь сильно относительная.


I> (****) Как бы очевидно, что если прога должна работать с объемом данных Х, то на этом объеме не должно быть ни ООМ, ни свопа, ни лагов, ни замерзаний.


I>Вот тебе это очевидно ?


Мне не то, что бы неочевидно, а совсем не понятно, как (*) сочетается с (****)...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[53]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 13:23
Оценка:
Здравствуйте, Erop, Вы писали:

I>>Нет, такого не писал. Я написал что ООМ вылез в 2012м, а до того узким местом были не коллекции а совсем другие вещи, но ты, конечно, не читатель


E>Ну так может оно память и АП жрало не по делу и раньше, просто до ООМ не доходило пока?..


А это не важно. Результат оценивается исходя из поставленых целей. Достигли — есть результат. Не достигли — нет результат. А руководствоваться рассуждениями о прекрасном только тебе и EP интресно.

I>>А это очевидно — ", если есть проект, то там указаны ограничения, или легко из него понятны, так скажем..."

E>Ну дык и? Вот, например, ограничения и всякие системные требования ОС виндовс майкрософт оценить в состоянии, например. У вас проект сложнее винды?..

Ну вот не очевидно, т.к. проблемы они фиксуют годами и даже десятилетиями

I>>Проектные нагрузки никто не превышал. Если кастомеру нужно скажем объем данных Х, то в релизе будет запас некоторый. Какие проблемы решаются до релиза, кастомера не интересует, главное что бы ООМ не было у кастомера.


E>Ну да. Но я так тебя понял, что ООМ в 2012 был для вас неожиданностью...


Это твои фантазии.

E>И что рвануло смотрели по профайлеру. Вот наши продукты, например, всё время проверяются на то, скока памяти ап и прочих ресурсов кушают и излишки каждый раз подрезаются...


Ты внятно скажи что у вас за продукты и какие требования ставятся по расходу ресурсов.
Re[57]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 13:31
Оценка:
Здравствуйте, Erop, Вы писали:

I>>С профайлером.

E>и что ты профилировал?..

Потребление памяти.
Re[58]: собеседования, Реверс списка
От: Erop Россия  
Дата: 22.10.13 13:32
Оценка:
Здравствуйте, Ikemefula, Вы писали:

E>>и что ты профилировал?..

I>Потребление памяти.
Код какой, и на каком запросе?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[59]: собеседования, Реверс списка
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.10.13 13:33
Оценка:
Здравствуйте, Erop, Вы писали:

E>>>и что ты профилировал?..

I>>Потребление памяти.
E>Код какой, и на каком запросе?

Нет никаких запросов Код — разный. Какую часть из 50мб показать ?
Re[47]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 22.10.13 19:18
Оценка:
Здравствуйте, Erop, Вы писали:

E>Не "никто", а люди, отметившиеся в теме. Например такие эксперты, как ты...


Перешел на личности — слил.

НС>>Затем что посчитал интересным на них ответить. Но это вовсе не означает, что если я на какие то другие, напрямую мне не заданные вопросы в этом топике не ответил, то это означает что я не способен на них ответить.


E>Этот вопрос я тебе уже несколько раз задал напрямую.


Где?

E> На всякий случай и здесь вот ещё раз спрашиваю...


Что именно?


НС>>Если надо быстро считать, то тут точно на С++ писать придется. Но не из-за памяти, а потому что CLR до сих пор не имеет интринсиков для векторных расширений.

E>У-у-у, а зачем тут векторные расширения?..

Для быстрого вычисления сверток. DSP — он такой.

НС>>Нет, так не есть.

E>Доказательства?..

Утверждение ты делал, тебе и доказывать.

НС>>У тебя какие то помехи в канале, я твою фразу не достраивал, я ее привел as is, путем копирования через буфер обмена.

E>Ну ты ещё раз подтвердил, что не поймёшь меня, потому, что хочешь не понять...

Или ты просто понял, что фигню сморозил, а признать неправоту не способен. Вот и прячешься за софистикой.
Re[45]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 22.10.13 19:18
Оценка:
Здравствуйте, Erop, Вы писали:

E>Если ты тоже считаешь стартовое сообщение этой темы излишне паникёрским и неадекватно преувеличивающим проблемы, то у нас с тобой тогда по этому вопросу разногласий нет...


А вопрос то и был не по этому вопросу, а по твоим фантастическим обобщениям.

НС>>2) а переделкой алгоритмов на такие, которые способны работать без индексного доступа.

E>Да понял я это, не волнуйся.

Пальцем в небо. Я не волнуюсь.

E> Я не только понял, но даже кратко сформулировал и повторил... почему это вызвало такой протест я не понимаю.


Протест вызвали твои фантастические обобщения.

E>Засим тему предлагаю зарыть, ты уже вполне достаточно объяснил, что в шарпе наступил коммунизм, в том смысле, что нет не нормальной коллекции с доступом по индексу, а потребности в ней, ровно как и в колбасе при коммунизме


Опять какие то левые выводы без намеков на логику.
Re[53]: собеседования, Реверс списка
От: Ночной Смотрящий Россия  
Дата: 22.10.13 19:21
Оценка:
Здравствуйте, Erop, Вы писали:

E>Дык, по идее, это же и означает, что в 90% случаев программистам удаётся таки как-то выбрать адекватные структуры данных ещё на этапе проектирования


Ну да. Но есть нюансы. К примеру, передать byte[] через практически все RPC фреймворки существенно проще, чем Stream или какой нибудь MySuperCollection.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.