Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockP.S. Копирование пройдет быстро, если память уже реально выделенаДля realloc есть какой-то другой сценарий?Конечно, если память еще не была использована. А когда выделяют новую память для копирования в нее - вероятность этого вообще велика. Basil A. SidorovЕсть запросы памяти у системы (делаются большими блоками) и есть работа *alloc в приложенииТак или иначе, "реально" выделять (подыскивать) память система начнет только тогда, когда "в приложении" начнут обращаться к ней. А не в момент "запросов больших блоков у системы". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:21 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов?Можно просто нанять программиста более высокой квалификации. Который сумеет реализовать более адекватный алгоритм.О, я за этот вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:22 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockКонечно, если память еще не была использована. А когда выделяют новую память для копирования в нее - вероятность этого вообще велика.Вы курсы проктостоматологов не заканчивали? Ещё широко известный в узких кругах dz, лет двадцать тому назад, писал, что не надо стесняться использовать возможности виртуальной памяти: если типово требуется десять мегабайт, но иногда может понадобиться пятьдесят - запрашивайте пятьдесят.Так или иначе, "реально" выделять (подыскивать) память система начнет только тогда, когда "в приложении" начнут обращаться к ней. А не в момент "запросов больших блоков у системы".А вот это сильно зависит от эвристик системного диспетчера виртуальной памяти, доступных ему ресурсов и подсказок, которые могло предоставить приложение. P.S. Вы из мира сурового хайлоада, постоянно сидящего в свопе или что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:38 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovВы курсы проктостоматологов не заканчивали? Basil A. SidorovВы из мира сурового хайлоада, постоянно сидящего в свопе или что? Вы юы лучше разок "запросили у системы" указатель на гигабайт, а свободной памяти у системы, пусть, примерно столько же, и увидели, как мгновенно он "выделится"; и как далеко не мгновенно потом запишется в эту память хотя бы 1 байт. Чем писать весь этот бред. И далеко не всегда важно даже, напрямую у системы эту память просить, или через внутренний "в приложении" менеджер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:56 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockВы юы лучше разок "запросили у системы" указатель на гигабайт, а свободной памяти у системы, пусть, примерно столько же, и увидели, как мгновенно он "выделится"; и как далеко не мгновенно потом запишется в эту память хотя бы 1 байт. 1024*1024*1024/4096 раз по байту Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. java -Xms2g test Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 04:25 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Не нужен этот цикл был. Достаточно было 1 раз 1 элементу массива что-то присвоить. Да и при чем тут ява, кстати, не понятно. Ну думаю не важно, кто выделял - машина или нет. В общем, поздравляю, у Вас быстрый компьютер :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 04:38 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockНе нужен этот цикл был.А вы разделите миллисекунды на миллион - станет понятно зачем тут цикл.Да и при чем тут ява, кстати, не понятно.Притом, что "javac test.java&java test" - очень просто и, что немаловажно - очень кросплатформенно достигая пределов Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. максимум на моей железке Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 05:09 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovА вы разделите миллисекунды на миллионБыл неправ - винда использует "достаточно энергичный" алгоритм. Но, в любом случае, ~секунда на "почти миллион страниц" - вполне нормальный результат. Для желающих лучшего есть более продвинутые методики (*map и большие страницы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 05:21 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov~секунда на "почти миллион страниц"О том и речь. Секунда уходит на 1-е обращение к памяти, на остальнвые 999999 уходит меньше миллисекунды. Но нам на миллион делить не приходится. У на тут про перевыделение памяти топик. И утверждалось, что правильнее сразу выделять/копировать/освобождать для каждой итерации, тратя на это "секунду", не пытаясь довыделить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 14:00 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockИ утверждалось, что правильнее сразу выделять/копировать/освобождать для каждой итерации, тратя на это "секунду", не пытаясь довыделить."Никогда и ничего не доводи до абсурда, ибо человек, желающий трапезовать поздно вечером рискует трапезовать рано по утру" (ц) Козьма Прутков. Во-первых, не надо работать с "указателями на гигабайт" без специальных методик. Во-вторых, ваше рассуждение содержит изъян: распределить миллион страниц медленно в первый раз. повторим на бис ... Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. ... и много раз Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. И добавлю. Если "типично-иногда" много - перемножаете ожидаемые "иногда" и "много", запрашиваете буфер суммарного размера и делаете собственное управление памятью, оптимизированное для вашего частного случая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 15:30 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovПоэтому повторюсь: если типично требуется мегабайт, но иногда ожидается пять - запрашиваете пять. Ладно один раз я ему про Фому, он мне про Ярему. Но повторяться... Последний раз предлагаю подумать. Возьмем vector или динамический массив из других языков, раз тут уж и ява пошла. Когда создается вектор, естественно, резервируется память под 1000 (условно) указателей. И вот когда они заканчиваются, как Вы считаете (2 вопроса): 1. Правильнее было бы сразу выделить старый размер + еще под 1000 указателей, скопировать и освободить старый массив, либо попытаться довыделить эти 1000*(размер указателя), используя realloc для этого, и только если не получилось - произвести перевыделение: 2. Какой вариант из этих, по вашему, используют для таких задач RTL языков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 17:23 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovраспределить миллион страниц медленно в первый разИменно это я и пытался объяснить, указывая, что на миллион нам делить и усреднять не получится, т.к. память для копирования только выделена и именно и будет при копировании этот первый долгий раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 17:28 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockКогда создается вектор, естественно, резервируется память под 1000 (условно) указателей. И вот когда они заканчиваются, как Вы считаете (2 вопроса): 1. Правильнее было бы сразу выделить старый размер + еще под 1000 указателей, скопировать и освободить старый массив, либо попытаться довыделить эти 1000*(размер указателя), используя realloc для этого, и только если не получилось - произвести перевыделение:Я предлагаю немного подумать и сразу создать вектор на десять тысяч элементов. Лишние ~70-150 килобайт никого не задавят. Вас - в том числе.2. Какой вариант из этих, по вашему, используют для таких задач RTL языков.Массивы ява "условно примитивные" (их создаёт JVM) и массивы эти ни разу не динамические - после создания невозможно изменить размер массива. Вот разновсяческие векторы из библиотеки коллекций - да, динамика. Деталями реализации не интересовался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 17:43 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovЯ предлагаю немного подумать и сразу создать вектор на десять тысяч элементовПонятно, все проблемы решаем умножением на 10. Создателям rtl отправь свое предложение подумать, я о их алгоритмах речь вел. Но какие нафиг алгоритмы, если можно подумать и на 10 умножить. Всё, вопросов больше не имею. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 17:58 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovМассивы яваПоток мысли. Я не спрашивал, как устроены статические массивы ява. Впрочем, у меня уже давно всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:00 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Точки - нуллы, плюсики - указатели, звездочки - блоки данных. Есть вектор: Код: plaintext 1. Код: plaintext 1. Код: plaintext 1. 2. 3. Какой редиска мешал оценить максимальную потребность и сразу создать вектор нужного размера? Кому, кроме суровых микроконтрольщиков нужна такая пессимизация? P.S. Если вы о чём-то другом, то поясните, кто на ком стоял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:22 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovОбнаруживаем, что надо ещё элементов. Создаём бОльший вектор и копируем указатели из старого Это что, серьезно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:28 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovКакой редиска мешал оценить максимальную потребностьУсловие задачи мешало, в котором написано, что может быть и 0 и 10 и 10млн элементов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:31 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockЭто что, серьезно? "Сдаётся, джентельмены, что это была комедия". Вы точно не путаете массив переменных и массив указателей на переменные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:34 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockУсловие задачи мешало, в котором написано, что может быть и 0 и 10 и 10млн элементов.Я повторюсь - создаём массив массивов и реализуем алгоритм, оптимизированный под ваш частный случай. Ну или берём готовое из boost/stl. Ни в одном из этих случаев не возникает нужда в realloc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:37 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockЭто что, серьезно? "Сдаётся, джентельмены, что это была комедия". Вы точно не путаете массив переменных и массив указателей на переменные?Да, я говорю про массив указателей переменной длины, который дает возможность добавить элемент без пересоздания на больший. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:50 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovНу или берём готовое из boost/stl. Ни в одном из этих случаев не возникает нужда в realloc. Я ж говорю, мне надоело. Заходим в исходники std::vector или TList или не знаю, что там в java, видим там realloc и пишем письмо о том, что его использование нецелесообразно разработчикам - в Microsoft, Oracle, Idera и т.д. Мне писать уже ничего не надо, мне всё понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:54 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockЯ ж говорю, мне надоело. Заходим в исходники std::vector libstdc++ debug/vector подойдёт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 19:04 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockЯ ж говорю, мне надоело. Заходим в исходники std::vector libstdc++ debug/vector подойдёт?Да, нажми ctrl+f в открывшемся по своей ссылке, набери в строке поиска realloc и начинай писать письмо разработчикам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 19:25 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39559650&tid=2018035]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
158ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 274ms |

| 0 / 0 |
