Виберіть C ++ або Java для програм, які вимагають величезної кількості оперативної пам’яті? [зачинено]


11

Я думаю про наукові програми, які в основному пов'язані з процесором і важкі для використання в купі (принаймні, кілька гігабайт). В будь-який інший час року я б із задоволенням пішов з C ++, але в цьому випадку мені цікаво, чи не фрагментація природна для менеджера пам'яті C ++ може бути серйозною проблемою порівняно з перевагою компактних колекторів Java.

Чи може хтось вказати на реальні приклади, пов’язані з цим?


Я не думаю, що мова є такою важливою, як програмування в цьому випадку. Будь-яка зріла мова, ймовірно, може працювати залежно від масштабів вашого обчислення. Є Javas, C / C ++, навіть пітони та рубіни, які можуть скотитися в цю роль. Деяким було б важче, ніж іншим, бо це звучить так, що вам справді потрібно мати тверду впевненість, що ви не просочуєтесь пам’яттю.
Ріг

2
Якщо ви можете отримати ГБ за $ 7,99, це проблема? Kingston 1GB DDR3
Бо Персон

2
@BoPersson, на мій досвід, люди, які мають такі проблеми, починаються з повного заповнення материнської плати високого класу і скаржаться, що вони не можуть розміщувати там стільки, скільки хотіли, а потім подають набір даних настільки великі, як керовані, а потім скаржаться на це цього недостатньо
AProgrammer

@dsign, в ці дні, коли ви можете отримати материнську плату, яка приймає кілька сотень гігів пам’яті менше ніж за 1000 євро, декілька концертів не важкі для використання пам’яті.
AProgrammer

1
Погодьтеся з частиною дешевої пам'яті. Щодо розвитку, я деякий час був у С ++, і хороша практика кодування робить витоки досить рідкісним явищем; Власне кажучи, я дуже віддаю перевагу C ++ над Java у цьому плані.
dsign

Відповіді:


11

Якщо ви говорите про додаток, який зобов'язаний підкреслити межі машини, таким чином, ви очікуєте, що ви будете виконувати фокуси програмування, щоб уникнути перевищення цих лімітів, тоді C ++ - це шлях. Не тільки C ++ дає вам можливість для оптимізації, де Java не має, (як зазначив Еміліо), але також, і Garbage-Collectors - це дуже голодна пам'ять, яка потребує додаткової вільної пам'яті для ефективної роботи.

Відповіді на це питання: StackOverflow: Скільки зайвої пам’яті потрібно для збору сміття ? намалюйте досить похмуру картину, але навіть якщо збирачам сміття потрібна вільна пам’ять приблизно стільки ж, скільки виділена пам'ять (про що я чув), це все одно означає, що для Java вам все одно знадобиться багато вільної пам'яті щоб він працював ефективно.

З іншого боку, в даний час ми, як правило, вважаємо за краще купувати більш дороге обладнання, а не виконувати прийоми програмування, щоб уникнути перевищення меж обладнання. У вашому випадку проблеми з ОЗУ, як правило, вирішуються за допомогою 64-бітної машини та накидання на неї стільки модулів оперативної пам’яті. Розумієте, вартість апаратних засобів нині не близька до витрат часу на розробку в розвиненому світі в наш час.

Я думаю, що ви повинні серйозно розглянути цей варіант, і, якщо можливо, перейдіть з цим варіантом і з Java замість C ++, тому що набагато простіше розробити щось на Java, ніж на C ++, і продовжувати підтримувати його згодом.


Дякую за вашу відповідь. Я погоджуюся з вашою апаратною ілюстрацією.
dsign

Якщо ви не піклуєтесь про те, щоб програма призупинялася під час збирання сміття, потреби в пам'яті значно менші.

1
Я не згоден з останнім пунктом. Java необов'язково легше розвиватися, ніж C ++. Це не було б для мене, оскільки я робив багато C ++ і порівняно мало Java протягом останніх п'яти-шести років. Можна записати бездоганний і нездійснений код як на C ++, так і на Java.
Девід Торнлі

1
@DavidThornley Я роблю C / C ++ протягом 10+ років, а Java протягом 6+ років. Я вважаю, що Java простіша за всіма параметрами: розробкою прототипів, розробкою, розширенням та підтримкою. Але в будь-якому випадку, це те, що думки мають на меті робити: відрізнятися . C -: =
Майк Накіс

Хто-небудь з вас запрограмував проект для великих даних та процесорів? Будь-які коментарі там?
dsign

7

Проблема не в тому, щоб використовувати C ++, як це Java, а не використовувати Java, оскільки це C ++. Контейнер C ++ зазвичай реалізується, щоб уникнути зайвої фрагментації, як це робить безкоштовний магазин Java.

Але якщо ви виділяєте собі пам'ять безпосередньо, ви також можете робити те, що Java не дозволяє вам робити, що може призвести до фрагментації.

Правильне рішення (в C ++) - використовувати контейнерні та смарт-покажчики через класи алокаторів, які керують розподілом за допомогою фіксованих "плексив" (ключовим моментом тут є написання хорошого класу розподілу). І це стиль програмування, який не має нічого спільного з Java, тому будь-яке порівняння безглуздо.

[EDIT] Це може бути застарілий зразок: Фіксований розподіл


Дякую за вашу відповідь Еміліо. Я добре знаю гнучкість C ++ і відчуваю схильність погодитися з вами. Потім я знову хотів би ознайомитись із деякими прикладами використання в реальному масштабі, де ці методи були використані для успіху.
dsign

@dsign: Публікація відредагована, дивіться посилання
Еміліо Гаравалья

1
Я раніше використовував ці прийоми. Неефективна програма змінила свій розподільник на використання набору фіксованих блоків. Отже, коли ви хотіли 4-байтовий блок, він вийшов із купи, яка зберігала лише 4-байтові блоки. Якщо ви хотіли 5 байтів, він прийшов з 8-байтової купки блоків і т. Д. Підвищення продуктивності (для нашого сильно виділеного додатку) було приголомшливо. Ви можете отримати не такий хороший результат, але він може бути дуже ефективним. Була також нульова фрагментація, оскільки всі алоки надходили у фіксованих блоках.
gbjbaanb

2

Перевага збору сміття полягає в тому, що він імітує машину з нескінченною кількістю пам'яті. Механізм або реалізація цієї абстракції має бути повністю прозорим для вас як програміста. Всі ми знаємо, що механізм відновлює пам'ять, яка більше не використовується програмою, але це фактично не гарантується. Якщо ви запускаєте програму на машині з більшою кількістю оперативної пам’яті, ніж програма ніколи фактично використовує, то збирання сміття може ніколи не відбутися. Знову ж таки, неважливо, адже ви можете просто написати програму, не зважаючи на те, як вона використовує пам'ять. Менеджер пам'яті просто виділить більше оперативної пам’яті, коли програма цього вимагає, і ви можете припускати, що такі розподіли завжди матимуть успіх. Java - мова, зібрана сміттям, а C ++ - ні. 1

Недоліком збору сміття є те, що, як і всі абстракції , воно, як правило, є герметичним. Це не завжди ідеально працює весь час, особливо в крайніх випадках, і ви, швидше за все, натрапите на помилки. Люди, які написали алгоритм вивезення сміття (той, який повинен бути прозорим для вас як програміста), оптимізовані для найпоширеніших випадків, і проблема з типовими випадками полягає в тому, що вони ніколи не є такими поширеними. Взагалі , ви не можете зробити нічого кращого, ніж сміттєзбірник в управлінні пам’яттю. Але в конкретних обставинах (і з урахуванням достатньої кількості часу, енергії та розуміння) це можливо. C ++ надає вам цю гнучкість; Java не робить.

З урахуванням всього цього, я думаю, що тут застосовуються стандартні поради щодо вибору мови, можливо, навіть більше, ніж у цьому випадку, враховуючи обмеження. Виберіть мову, найбільш відому первинним розробникам проекту. Окрім очевидних причин (наприклад, ви зможете розвивати додаток швидше та ефективніше), це особливоВажливо у випадку, який ви описуєте, оскільки програмування C ++, як ви програмуєте Java, призведе до надзвичайно неефективних практик управління пам'яттю, а отже, витоків та збоїв. Аналогічно, програмування на Java, як ви програмуєте на C ++, не принесе багато користі, і може в кінцевому підсумку створити програму, що не є оптимізованою, враховуючи, що алгоритми збору сміття налаштовані та налаштовані на найбільш поширені випадки .

Програмісти, які звикли працювати на зібраних сміттях мовах, вчаться довіряти сміттєзбірнику, а не боротися з ним. Якщо ви працюєте мовою, зібраною зі сміттям, це програмісти, які вам потрібні у вашому проекті. Програмістів, яких немаєзвикли працювати мовою, зібраною зі сміттям, по своїй суті скептично ставляться до такої абстракції "нескінченної пам'яті" і часто з великою кількістю вагомих причин. Добре, як це можуть бути ці програмісти, це не ті, з ким ви хочете працювати на зібраному сміттям мові, тому що вони будуть боротися проти GC на кожному кроці, постійно вдруге здогадуючись про це і часто створюючи повільніші, менш ефективні пам'яті код, ніж інший тип програміста. У кращому випадку вони просто витратять багато часу на винахід колеса, що коштуватиме вам чималих грошей та ще більше витрат на довгострокове обслуговування.

І тоді також потрібно запитати себе, чи це насправді має значення. Існує більше, ніж натяк на істину до коментаря Bode sdode: пам’ять зараз така дешева, навряд чи варто занадто сильно затискати руки. Навіть якщо вам потрібні великі суми, ці суми зараз не такі вже й великі, як 10 років тому. Програмісти та розробка додатків коштують набагато дорожче, ніж просто покупка оперативної пам'яті та процесорної потужності. Це не означає, що вам слід уникнути економії, де це можливо, але це означає, що ви також не повинні витрачати занадто багато часу на це.


1 Звичайно, це припущення вказує на глибший недолік у питанні. Як виявляється, "Java або C ++" - це трохи червона оселедець. Стандартна реалізація Java передбачає збирання сміття, а C ++ не відповідає мовному стандарту, але немає абсолютно ніяких причин, щоб ви не могли використовувати сторонній смітник для C ++. Багато компаній заробляли на життя, продаючи ці речі, а деякі, напевно, заробляли на життя, даруючи їх безкоштовно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.