Выберите C ++ или Java для приложений, требующих огромных объемов оперативной памяти? [закрыто]

11

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

Кто-нибудь может указать на реальные примеры, связанные с этим?

dsign
источник
Я не думаю, что язык так важен, как программирование в этом случае. Любой зрелый язык может работать в зависимости от масштаба ваших вычислений. Есть Javas, C / C ++, даже Python и Rubies, которые могут участвовать в этой роли. Некоторые из них будут сложнее, чем другие, поскольку кажется, что вам действительно нужно иметь твердую уверенность в том, что у вас нет утечки памяти.
Буровая установка
2
Если вы можете получить ГБ за 7,99 долларов, это проблема? Кингстон 1 ГБ DDR3
Бо Перссон
2
@ БоПерссон, по моему опыту, люди, имеющие такие проблемы, начинают с полного заполнения своей материнской платы высокого класса и жалуются, что не могут поставить туда столько, сколько им хотелось бы, а затем подают набор данных настолько большого, насколько управляемый, а затем жалуются, что этого недостаточно.
AProgrammer
@dsign, в наши дни, когда вы можете получить материнскую плату, принимающую несколько сотен гигабайт памяти менее чем за 1000 €, несколько гигабайт не сильно потребляют память.
AProgrammer
1
Согласитесь с частью дешевой памяти. Что касается разработки, я некоторое время был на C ++, и хорошие практики кодирования делают утечки довольно редким явлением; На самом деле, я действительно предпочитаю C ++, а не Java.
подписано

Ответы:

11

Если вы говорите о приложении, которое должно подчеркивать ограничения машины, так что вы ожидаете, что будете выполнять хитрости программирования, чтобы избежать превышения этих ограничений, тогда C ++ - это путь. Не только C ++ дает вам пространство для оптимизации, в отличие от Java (как отметил Эмилио), но также сборщики мусора являются очень жадными до памяти приспособлениями, которым для эффективной работы требуется много дополнительной свободной памяти.

Ответы на этот вопрос: StackOverflow: Сколько дополнительной памяти требуется для сборки мусора ? нарисовать довольно мрачную картину, но даже если сборщикам мусора нужно, чтобы свободная память была примерно такой же, как выделенная память (что я и слышал), это все равно означает, что с Java вам все равно потребуется много свободной памяти чтобы он работал эффективно.

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

Я думаю, что вы должны серьезно рассмотреть эту опцию и, если возможно, использовать эту опцию и использовать Java вместо C ++, потому что намного легче разрабатывать что-то в Java, чем в C ++, и поддерживать его впоследствии.

Майк Накис
источник
Спасибо за Ваш ответ. Я согласен с вашей иллюстрацией оборудования.
подписано
Если вы не заботитесь о приостановке программы во время выполнения сборки мусора, потребности в памяти намного меньше.
1
Я не согласен с последним пунктом. Java не обязательно легче разрабатывать, чем C ++. Это было бы не для меня, так как я сделал много C ++ и относительно мало Java за последние пять или шесть лет. Можно писать поддерживаемый и не поддерживаемый код как на C ++, так и на Java.
Дэвид Торнли
1
@DavidThornley Я занимался C / C ++ более 10 лет, а Java более 6 лет. Я считаю, что Java проще по всем параметрам: создание прототипов, разработка, расширение и поддержка. Но в любом случае, это то, что мнения должны делать: разные . C -: =
Майк Накис
Кто-нибудь из вас запрограммирован на проект, требующий больших данных? Есть комментарии?
подписать
7

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

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

Правильным решением (в C ++) является использование контейнера и интеллектуальных указателей через классы распределителя, которые управляют распределением посредством фиксированных «сплетений» (ключевой момент здесь - написание хорошего класса распределителя). И это стиль программирования, который не имеет ничего общего с Java, поэтому любое сравнение не имеет смысла.

[EDIT] Это может быть устаревший образец: фиксированное распределение

Эмилио Гаравалья
источник
Спасибо за ваш ответ, Эмилио. Я хорошо знаю гибкость C ++ и склонен с вами согласиться. Опять же, я хотел бы знать несколько примеров реального использования, где эти методы были использованы для успеха.
подписать
@dsign: Сообщение отредактировано, см. ссылку
Эмилио Гаравалья
1
Я использовал эти методы ранее. У плохо работающего приложения его распределитель был изменен, чтобы использовать набор куч фиксированных блоков. Поэтому, когда вы хотели 4-байтовый блок, он пришел из кучи, в которой хранились только 4-байтовые блоки. Если вам нужно 5 байтов, это происходит из 8-байтовой кучи блоков и т. Д. Увеличение производительности (для нашего приложения с большим количеством ресурсов) было огромным. Вы можете не получить столь же хороший результат, но он может быть очень эффективным. Также была нулевая фрагментация, так как все ресурсы размещались в фиксированных блоках.
gbjbaanb
2

Преимущество сборки мусора заключается в том, что она имитирует машину с бесконечным объемом памяти. Механизм или реализация этой абстракции должны быть полностью прозрачными для вас, как для программиста. Все мы знаем, что этот механизм восстанавливает память, которая больше не используется программой, но на самом деле это не гарантируется. Если вы запустите программу на компьютере с большим объемом оперативной памяти, чем когда-либо фактически используется программой, сборка мусора может никогда не произойти. Опять же, не имеет значения, потому что вы можете просто написать программу, независимо от того, как она использует память. Диспетчер памяти будет просто выделять больше оперативной памяти всякий раз, когда программа запрашивает ее, и вы можете предположить, что такое распределение всегда будет успешным. Java - это язык для сборки мусора, а C ++ - нет. 1

Недостатком сборки мусора является то, что, как и все абстракции , она имеет утечку. Это не всегда работает идеально все время, особенно в крайних случаях, и вы, вероятно, столкнетесь с ошибками. Люди, которые написали алгоритм сборки мусора (тот, который должен быть прозрачным для вас, как программиста), оптимизировали работу для наиболее распространенных случаев, и проблема с общими случаями заключается в том, что они никогда не бывают настолько распространенными. В общем , вы не можете сделать лучше, чем сборщик мусора при управлении памятью. Но в определенных обстоятельствах (и при наличии достаточного количества времени, энергии и понимания) это может быть возможно. C ++ дает вам эту гибкость; Ява не

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

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

И тогда вам также нужно спросить себя, действительно ли это имеет значение. В неуместном комментарии Бо есть больше, чем намек на правду: память сейчас настолько дешевая, что вряд ли стоит слишком много загибать руки. Даже если вам нужны огромные суммы, эти суммы уже не так массивны, как 10 лет назад. Программирование и разработка приложений обходятся гораздо дороже, чем покупка больших объемов оперативной памяти и вычислительной мощности. Это не означает, что вы должны избегать экономики, где это возможно, но это также означает, что вы не должны тратить слишком много времени на это.


1 Конечно, это предположение подчеркивает более глубокий недостаток в этом вопросе. Как оказалось, «Java или C ++» - это нечто вроде красной селедки. Стандартная реализация Java обеспечивает сборку мусора, а C ++ не соответствует языковому стандарту, но нет абсолютно никаких причин, по которым вы не можете использовать сторонний сборщик мусора для C ++. Многие компании зарабатывали на жизнь, продавая эти вещи, а некоторые, вероятно, зарабатывали на жизнь, раздавая их бесплатно.

Коди Грей
источник