Я имею в виду научные приложения, которые в основном связаны с процессором и интенсивно используют кучи (не менее нескольких гигабайт). В любое другое время года я бы с удовольствием поехал с C ++, но в этом случае мне интересно, может ли серьезная проблема быть естественной для менеджера памяти C ++ по сравнению с преимуществом компактных сборщиков Java.
Кто-нибудь может указать на реальные примеры, связанные с этим?
Ответы:
Если вы говорите о приложении, которое должно подчеркивать ограничения машины, так что вы ожидаете, что будете выполнять хитрости программирования, чтобы избежать превышения этих ограничений, тогда C ++ - это путь. Не только C ++ дает вам пространство для оптимизации, в отличие от Java (как отметил Эмилио), но также сборщики мусора являются очень жадными до памяти приспособлениями, которым для эффективной работы требуется много дополнительной свободной памяти.
Ответы на этот вопрос: StackOverflow: Сколько дополнительной памяти требуется для сборки мусора ? нарисовать довольно мрачную картину, но даже если сборщикам мусора нужно, чтобы свободная память была примерно такой же, как выделенная память (что я и слышал), это все равно означает, что с Java вам все равно потребуется много свободной памяти чтобы он работал эффективно.
С другой стороны, в настоящее время мы обычно предпочитаем покупать более дорогое оборудование, чем выполнять хитрости программирования, чтобы избежать превышения аппаратных ограничений. В вашем случае проблемы с ОЗУ обычно решаются с помощью 64-разрядной машины и добавления на нее столько модулей ОЗУ, сколько необходимо. Видите ли, в настоящее время стоимость аппаратного обеспечения далеко не равна стоимости разработки в развитых странах.
Я думаю, что вы должны серьезно рассмотреть эту опцию и, если возможно, использовать эту опцию и использовать Java вместо C ++, потому что намного легче разрабатывать что-то в Java, чем в C ++, и поддерживать его впоследствии.
источник
Проблема не в том, чтобы использовать C ++, как это Java, и не в том, чтобы использовать Java, как это C ++. Контейнер C ++ обычно реализуется во избежание избыточной фрагментации, как это делает свободное хранилище Java.
Но если вы выделяете себе память напрямую, вы можете также делать вещи, которые Java не позволяет вам делать, что может привести к фрагментации.
Правильным решением (в C ++) является использование контейнера и интеллектуальных указателей через классы распределителя, которые управляют распределением посредством фиксированных «сплетений» (ключевой момент здесь - написание хорошего класса распределителя). И это стиль программирования, который не имеет ничего общего с Java, поэтому любое сравнение не имеет смысла.
[EDIT] Это может быть устаревший образец: фиксированное распределение
источник
Преимущество сборки мусора заключается в том, что она имитирует машину с бесконечным объемом памяти. Механизм или реализация этой абстракции должны быть полностью прозрачными для вас, как для программиста. Все мы знаем, что этот механизм восстанавливает память, которая больше не используется программой, но на самом деле это не гарантируется. Если вы запустите программу на компьютере с большим объемом оперативной памяти, чем когда-либо фактически используется программой, сборка мусора может никогда не произойти. Опять же, не имеет значения, потому что вы можете просто написать программу, независимо от того, как она использует память. Диспетчер памяти будет просто выделять больше оперативной памяти всякий раз, когда программа запрашивает ее, и вы можете предположить, что такое распределение всегда будет успешным. Java - это язык для сборки мусора, а C ++ - нет. 1
Недостатком сборки мусора является то, что, как и все абстракции , она имеет утечку. Это не всегда работает идеально все время, особенно в крайних случаях, и вы, вероятно, столкнетесь с ошибками. Люди, которые написали алгоритм сборки мусора (тот, который должен быть прозрачным для вас, как программиста), оптимизировали работу для наиболее распространенных случаев, и проблема с общими случаями заключается в том, что они никогда не бывают настолько распространенными. В общем , вы не можете сделать лучше, чем сборщик мусора при управлении памятью. Но в определенных обстоятельствах (и при наличии достаточного количества времени, энергии и понимания) это может быть возможно. C ++ дает вам эту гибкость; Ява не
Все это говорит, я думаю, что стандартный совет по выбору языка применим здесь, возможно, даже больше, в этом случае, учитывая ограничения. Выберите язык, который наиболее известен основным разработчикам проекта. В дополнение к очевидным причинам (например, вы сможете разрабатывать приложение быстрее и эффективнее), это особенноважно в случае, который вы описываете, потому что программирование на C ++ так же, как вы программируете на Java, приведет к ужасно неэффективным практикам управления памятью и, следовательно, к утечкам и сбоям. Аналогично, программирование на Java, как вы программируете на C ++, не принесет вам большой пользы и может привести к тому, что программа будет менее оптимизирована, учитывая, что алгоритмы сборки мусора настроены и настроены для наиболее распространенных случаев. ,
Программисты, которые привыкли работать на языках, собираемых мусором, учатся доверять сборщику мусора, а не бороться с ним. Если вы работаете на языке для сбора мусора, это те программисты, которые вам нужны в вашем проекте. Программисты, которые непривыкшие работать на языке, предназначенном для сбора мусора, скептически относятся к такой абстракции «бесконечной памяти», и часто по множеству веских причин. Как бы ни были хороши эти программисты, это не те, которые вы хотите работать на языке сборки мусора, потому что они будут сражаться с GC на каждом этапе пути, постоянно угадывая его и часто производя медленнее и менее эффективно используя память код, чем другой тип программиста. В лучшем случае, они просто потратят много времени на то, чтобы заново изобрести колесо, что обойдется вам в огромные деньги и даже в долгосрочные затраты на техническое обслуживание.
И тогда вам также нужно спросить себя, действительно ли это имеет значение. В неуместном комментарии Бо есть больше, чем намек на правду: память сейчас настолько дешевая, что вряд ли стоит слишком много загибать руки. Даже если вам нужны огромные суммы, эти суммы уже не так массивны, как 10 лет назад. Программирование и разработка приложений обходятся гораздо дороже, чем покупка больших объемов оперативной памяти и вычислительной мощности. Это не означает, что вы должны избегать экономики, где это возможно, но это также означает, что вы не должны тратить слишком много времени на это.
1 Конечно, это предположение подчеркивает более глубокий недостаток в этом вопросе. Как оказалось, «Java или C ++» - это нечто вроде красной селедки. Стандартная реализация Java обеспечивает сборку мусора, а C ++ не соответствует языковому стандарту, но нет абсолютно никаких причин, по которым вы не можете использовать сторонний сборщик мусора для C ++. Многие компании зарабатывали на жизнь, продавая эти вещи, а некоторые, вероятно, зарабатывали на жизнь, раздавая их бесплатно.
источник