Производительность и использование памяти в массивах Java и массивах С++ - программирование
Подтвердить что ты не робот

Производительность и использование памяти в массивах Java и массивах С++

Я работаю над небольшой компанией, где я работаю над созданием банковского программного обеспечения. Теперь мне нужно создать некоторую структуру данных, например:

Array [Int-Max] [2] // Large 2D array

Сохраните это на диске и загрузите его на следующий день для будущей работы.

Теперь, поскольку я знаю только Java (и немного C), они всегда настаивают на использовании С++ или C. В соответствии с их предложением:

  • Они видели, что Array [Int-Max] [2] в Java займет почти в 1,5 раза больше памяти, чем C и С++ - это какой-то разумный объем памяти, чем Java.

  • C и С++ могут обрабатывать произвольно большие файлы, где Java не может.

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

Теперь мой вопрос:

  • Почему C или С++ всегда предпочтительнее в большой базе данных/структуре данных над Java? Потому что C может быть, но С++ также является ООП. Итак, как он получает преимущество над Java?

  • Должен ли я оставаться на Java или их предложение (переключиться на С++), будет полезно в будущем в большой среде базы данных/структуры данных? Любое предложение?

Извините, я очень мало знаю обо всех этих и только начал работать над проектом, так что действительно запутался. Поскольку до сих пор я только что создал какой-то школьный проект, понятия не имею о относительно большом проекте.

4b9b3361

Ответ 1

почему C/С++ всегда предпочтительнее в большой базе данных/структуре данных Ява? Потому что C может быть, но С++ также является ООП. Итак, как это получается преимущество над Java?

Помните, что массив java (объектов) 1 на самом деле является массивом ссылок. Для простоты рассмотрим 1D-массив:

Java:

[ref1,ref2,ref3,...,refN]
ref1 -> object1
ref2 -> object2
...
refN -> objectN

С++:

[object1,object2,...,objectN]

служебные данные не нужны в массиве при использовании версии С++, массив содержит сами объекты, а не только их ссылки. Если объекты небольшие - эти накладные расходы действительно могут быть значительными.

Кроме того, как я уже сказал в комментариях, есть еще одна проблема при распределении небольших объектов в С++ в массивах vs java. В С++ вы выделяете массив объектов - и они смежны в памяти, а в java - сами объекты не являются. В некоторых случаях это может привести к тому, что С++ будет иметь гораздо лучшую производительность, поскольку он намного эффективнее с точки зрения кеша, чем программа java. Я однажды обратился к этой проблеме в этот поток

2) Должен ли я оставаться на Java или их предложение (переключиться на С++), будет полезны в будущем в условиях большой базы данных/структуры данных? Любые предложение?

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

Вы также можете профилировать свой код с ожидаемым размером массива и алгоритмом заглушки перед реализацией ядра и профилировать его, чтобы увидеть, какова реальная разница. (Предполагая, что массив действительно является ожидаемым пользователем основного пространства)


1: Накладные расходы, которые я описываю далее, не относятся к массивам примитивов. В этих случаях (примитивы) массивы представляют собой массивы значений, а не ссылок, как и С++, с незначительными издержками для самого массива (например, length).

Ответ 2

Похоже, вы работаете в неопытном программисте на новой работе. Скорее всего, "они" давно занимаются бизнесом и знают (или, по крайней мере, думают, что знают) больше о домене и его требованиях к программированию, чем вы.

Мой совет - просто делать то, что они настаивают на том, что вы делаете. Если они хотят код на C или С++, просто напишите его на C или С++. Если вы думаете, что у вас будут трудности, потому что вы не знаете много C/С++... предупредите их заранее. Если они все еще настаивают, они могут нести ответственность за любые проблемы и задерживать свои настойчивые причины. Просто убедитесь, что вы делаете все возможное... и старайтесь не быть "скрипучим колесом".


1) Они видели, что Array [Int-Max] [Int-Max] в Java будет занимать почти в 1,5 раза больше памяти, чем C и С++ берет некоторый разумный объем памяти, чем Java.

Это возможно, хотя это зависит от того, что находится в массивах.

  • Java может представлять большие массивы большинства примитивных типов, используя почти оптимальные объемы памяти.

  • С другой стороны, массивы объектов в Java могут занимать значительно больше места, чем в C/С++. Например, в С++ вы обычно выделяете большой массив с помощью new Foo[largeNumber], чтобы все экземпляры Foo были частью экземпляра массива. В Java new Foo[largeNumber] фактически эквивалентен new Foo*[largeNumber]; т.е. массив указателей, где каждый указатель обычно ссылается на другой объект/кучу node. Легко понять, как это может занимать гораздо больше места.

2) C/С++ может обрабатывать сколь угодно большой файл, где Java не может.

Существует жесткий предел количества элементов в одном массиве Java с 1-D... 2 ^ 31. (Вы можете обойти это ограничение, но это сделает ваш код более сложным.)

С другой стороны, если вы говорите о простом чтении и записи файлов, Java может обрабатывать отдельные файлы размером до 2 ^ 63 байта... что больше, чем вы могли когда-либо захотеть.

1) почему C/С++ всегда предпочтительнее в большой базе данных/структуре данных над Java? Потому что C может быть, но С++ также является ООП. Итак, как он получает преимущество над Java?

Из-за жесткого ограничения. Предел является частью спецификации JLS и JVM. Это не имеет ничего общего с ООП.

2) Должен ли я оставаться на Java или их предложение (переключиться на С++), будет полезно в будущем в большой среде базы данных/структуры данных? Любое предложение?

Пойдите с их предложением. Если вы имеете дело с большими наборами данных в памяти, то их проблемы действительны. И даже если их опасения (гипотетически) немного раздуты, нехорошо сражаться с начальством/пожилыми людьми...

Ответ 3

1) Они видели, что Array [Int-Max] [Int-Max] в Java будет занимать почти в 1,5 раза больше памяти, чем C и С++ берет некоторый разумный объем памяти, чем Java.

Это зависит от ситуации. Если вы создаете new int[1] или new int[1000], в Java или С++ практически нет различий. Если вы выделяете данные в стеке, он имеет высокую относительную разницу, поскольку Java не использует стек для таких данных.

Сначала я гарантирую, что это не микро-настройка приложения. Стоит вспомнить, что один день вашего времени стоит (при условии, что вы получаете минимальную зарплату) составляет около 2,5 ГБ. Поэтому, если вы не экономить 2,5 ГБ в день, делая это, подозревайте, что его не стоит гоняться.

2) C/С++ может обрабатывать сколь угодно большой файл, где Java не может.

У меня в памяти отображается файл с 8 ТБ в чистой программе Java, поэтому я понятия не имею, что это значит.

Существует предел, в котором вы не можете отображать более 2 ГБ или иметь более 2 миллиардов элементов в массиве. Вы можете обойти это, имея более одного (например, до 2 миллиардов из них)

Поскольку мы должны работать с такой большой базой данных/структурой данных, C/С++ всегда предпочтительнее.

Я регулярно загружаю 200 - 800 ГБ данных с более чем 5 миллиардами записей в один Java-процесс (иногда более одного раза на одном компьютере)

1) почему C/С++ всегда предпочтительнее в большой базе данных/структуре данных над Java?

Существует больше опыта в том, как это сделать в C/С++, чем в Java, и их опыт в том, как это сделать, только в C/С++.

Потому что C может быть, но С++ также является ООП. Итак, как он получает преимущество над Java?

При использовании больших наборов данных более распространено использование отдельной базы данных в мире Java (встроенные базы данных относительно редки)

Java просто вызывает те же системные вызовы, которые вы можете использовать в C, поэтому нет никакой реальной разницы в том, что вы можете сделать.

2) Должен ли я оставаться на Java или их предложение (переключиться на С++), будет полезно в будущем в большой среде базы данных/структуры данных? Любое предложение?

В конце дня они платят вам, а иногда и технические аргументы на самом деле не имеют значения.;)