Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Пока вы не поубивали друг друга, замечу, что контейнеры позволяют резервировать память, сводя число realloc-ов к минимуму. оффтопвспоминается история из прошлого века, когда я был молодым и зелёным , мы делали вдвоём софт для некого девайса в НИИ, я делал пользовательскую часть, с кучей графиков. Делалось всё на LabView, у которой тогда уже были нормальные контейнеры (в STL они уже тоже были) встроенные прямо в средства построения графиков. Так вот, я по ходу поступления данных добавлял их в массив графика. Всё было ок, но через некоторое время учёные пожаловались на тормоза. Я загрустил, а мой более умный напарник даже не глядя в "код", сразу сказал, что я не сделал резервирование памяти, а компонент графика на каждое добавление делает realloc, что на уже на нескольких десятках тысяч записей становится заметно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 05:40 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockBasil A. SidorovНу или берём готовое из boost/stl. Ни в одном из этих случаев не возникает нужда в realloc. Я ж говорю, мне надоело. Заходим в исходники std::vector или TList или не знаю, что там в java, видим там realloc и пишем письмо о том, что его использование нецелесообразно разработчикам - в Microsoft, Oracle, Idera и т.д. Мне писать уже ничего не надо, мне всё понятно. std::vector не может использовать С-шный realloc, поскольку оперирует не только с POD-структурами, а также использует аллокаторы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 13:38 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНе думаю, что сам С/С++ внутри себя реализует стандартные функции. Для этого используются отдельные библиотеки, которые подключаются в программу с помощью директив препроцессору #include. И вот именно эти реализации библиотек определяют возможность многопоточной работы (а не факт запуска компиляции с какими- либо ключами). Например, по вашей ссылке видно, что malloc требует библиотеки <stdlib.h>.Никакие библиотеки с помощью директивы препроцессора #include в сборку не включаются. Включение библиотек указывается отдельно компилятору (обычно с помощью аргумента командной строки). Стандартные библиотеки Си и C++ могут быть не только библиотеками динамической линковки времени выполнения (runtime), но и статическими - слинкованными полностью с самим исполняемым файлом программы (к примеру, у "гнуса" есть параметры командной строки "-static-libgcc" и "-static-libstdc++"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 13:51 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZivТак и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно? А что насчет memcpy? НЕ БУДЕТ потокобезопасна. В том смысле, что с одной памятью в разных потоках оперировать ею нельзя.Оперировать-то можно, но программу придется писать с учётом барьеров компилятора и кэша процессора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 13:54 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
SiemarglНикто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц? Пока в странице, вообще нет проблем расшириться. А если нет - то дописать процессору в табличку аллокаций VM линейное расширение (я не настолько ос разработчик, но АФАИК, это тоже небольшая проблема)Это она для кучи выделяется страницами, а кучей заведует библиотечный менеджер памяти из стандартной либы, который может на одной странице выделять блоки для разных потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 13:58 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov~секунда на "почти миллион страниц" - вполне нормальный результат.А ты уверен, что современная 64-битная операционная система выделяет JVM'у страницы именно по 4кБ, а не по 4Мб? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 14:17 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
https://msdn.microsoft.com/ru-ru/library/dd335933.aspx Так же, как и в Win32, размер страницы на платформе x64 равен 4 Кб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 14:25 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima T https://msdn.microsoft.com/ru-ru/library/dd335933.aspx Так же, как и в Win32, размер страницы на платформе x64 равен 4 Кб.Спасибо, почитал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 15:13 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima T, очень старая статья. Я совсем не специалист в виндовс но даже мне понятно что виндовс 10 должна использовать двухмегабайтные странички. Иначе микрософту никогда недагнать линух. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 16:01 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
вЪюDima T, очень старая статья. Я совсем не специалист в виндовс но даже мне понятно что виндовс 10 должна использовать двухмегабайтные странички. Иначе микрософту никогда недагнать линух. А в линуксе они двухмегабайтные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 20:38 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Немного про споры выше про realloc(): не думаю что realloc() без копирования обходится, но в виндовсе есть HeapReAlloc() , а вот здесь уже средства ОС, т.е. перемещение и довставка страниц, вместо копирования. Если кому очень надо, то можно воспользоваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 20:45 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima Tне думаю что realloc() без копирования обходится Думать не надо. Достаточно произвести тест на 3 строки кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 20:50 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockДа, нажми ctrl+f в открывшемся по своей ссылке, набери в строке поиска reallocВы точно смотрели, что делают все эти realloc-и? Подсказка: наберите в строке поиска "alloc(" Ок, именно в Вашем спец-примере я не нашел "alloc(". Всё, значит, считайте, что я не прав. Копируйте память всегда и дальше. Хотя понятное дело, что перевыделение памяти происходит где-то в недрах, в base::resize... но искать я не намерен, не вижу смысла что-то доказывать. Считаете, что vector всегда тупо копирует память при необходимости увеличения изначально зарезервированного массива указателей? Ок, я не спорю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 20:54 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZiv std::vector не может использовать С-шный realloc, поскольку оперирует не только с POD-структурами, а также использует аллокаторы. Угу. Какой-то магический, другой менеджер памяти, в котором нет и не нужен realloc. Хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 20:55 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockDima Tне думаю что realloc() без копирования обходится Думать не надо. Достаточно произвести тест на 3 строки кода. Давай ссылку на тест из 3 строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 21:01 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TYuRockпропущено... Думать не надо. Достаточно произвести тест на 3 строки кода. Давай ссылку на тест из 3 строк. На тебе ссылку Код: 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. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 1-й MessageBox показывает "realloc time: 0", 2-й - ~2000 миллисекунд. Это на моём компе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 21:30 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
rdb_devА ты уверен, что современная 64-битная операционная система выделяет JVM'у страницы именно по 4кБ, а не по 4Мб?Ну, если не касаться совсем гигантских страниц, то, насколько мне известно: 1. По два мегабайта, а не по четыре; 2. Чтобы запросить у системы именно большие страницы требуется несколько предусловий, поэтому: 2.1. По умолчанию всегда выделяются четырёхкилобайтовые страницы; 2.2. Для работы с большими страницами есть отдельная опция комстроки, которая может быть проигнорирована системой; А действуют все эти ограничения потому, что у больших страниц чёткая и достаточно узкая область - работа с большими объёмом физической памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 21:53 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockMasterZiv std::vector не может использовать С-шный realloc, поскольку оперирует не только с POD-структурами, а также использует аллокаторы. Угу. Какой-то магический, другой менеджер памяти, в котором нет и не нужен realloc. Хорошо. нет и ненужен std::allocator . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 22:35 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TвЪюDima T, очень старая статья. Я совсем не специалист в виндовс но даже мне понятно что виндовс 10 должна использовать двухмегабайтные странички. Иначе микрософту никогда недагнать линух. А в линуксе они двухмегабайтные? в glibc стандартном аллокаторе - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 22:43 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
вЪюнет и ненужен Ну не нужен так не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 22:57 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
чисто приколоться Код: 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. 34. 35. 36. 37. 38. 39. 40. 41. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2017, 03:37 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Ну вот уже 700 мс, и еще приплюсовать сюда время на освобождение - оно далеко не мало. М это при достатке памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2017, 04:35 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockНу вот уже 700 мс, и еще приплюсовать сюда время на освобождение - оно далеко не мало.Это Спарта Ява - встроенный (фоновый) сборщик мусора. Но вы не понимаете главного: исключая специально подобранные случаи - невозможно воспользоваться "быстрым довыделением памяти" в реальной жизни . Поэтому в реальной жизни никто не будет работать с одним куском "в размер доступной памяти" - создадут массив из блоков более адекватного размера и будут разносить данных по этим (суб)блокам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2017, 07:27 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRock1-й MessageBox показывает "realloc time: 0", 2-й - ~2000 миллисекунд. Это на моём компе. Немного модифицировал тест Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Результат Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2017, 07:37 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39560254&tid=2018035]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
442ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 542ms |

| 0 / 0 |
