Самый быстрый способ использовать огромный вектор (или массив?) Объектов в C ++ против Java

Я пишу некоторый код для проекта по вычислительной биохимии, и мне нужно иметь возможность иметь массив или вектор с более чем 10 миллионами объектов и выполнять ~ 50-100 миллионов итераций Монте-Карло, где каждая итерация может модифицировать объект из список наугад. Я относительно новичок в C ++, перехожу с Java (надеюсь, помимо прочего, на более быстрые улучшения).

Моя лаборатория находится в процессе заказа компьютера с 128 ГБ ОЗУ и 2 процессорами, но мой текущий компьютер имеет 4 ГБ ОЗУ. На данный момент у меня есть компилятор Visual Studio Express, хотя я слышал, что G ++ используется некоторыми из наших сотрудники. Буду признателен за рекомендации компилятора, если у кого-то есть, так как знаю, что у некоторых есть различия в производительности во время выполнения.

Моя главная проблема в том, что я не могу даже заставить эти объявления разумно компилироваться:

#include <iostream>
#include <random>
#pragma pack(push, 16)      //Mostly ignorant about what this does
using namespace std;

struct RNAObject {
public:
string sequence;
string seqComplement;
int bindingInx5Prime;
int bindingInx3Prime;
int length;
enum type {MONOMER, SINGLE_STRAND, DOUBLE_STRAND, HAIRPIN, RIBOZYME};
};

void main() {
const static int maxSize = 10000000;
//RNAObject RNASoup[maxSize];  -Does not compile, stack overflow
//RNAObject* RNASoup[maxSize]; -Does not compile, stack overflow
vector<RNAObject> RNASoup(maxsize); //Compiles, but extremely slow already
cout << "Hello World";  //Stopped the compile before this line could happen
}

Однако в моей настройке Java на том же компьютере следующие строки компилируются немедленно, без каких-либо затруднений:

int maxSize = 10000000
RNAObject RNASoup[] = new RNAObject[maxSize];

Мне предстоит пройти долгий путь, поэтому любые соответствующие рекомендации будут с благодарностью.

3

Решение

Ваши две части кода (C ++ и Java) не эквивалентны.

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

Ваш код Java просто создает maxSize Рекомендации в RNAObjects. Эквивалент Java-кода вашему C ++-коду:

int maxSize = 10000000
RNAObject RNASoup[] = new RNAObject[maxSize];
for (int i = 0; i < maxSize; i++)
RNASoup[i] = new RNAObject();
4

Другие решения

Есть два места, из которых можно выделить память: куча и стек. Стек довольно ограничен и используется для небольших объектов, однако он намного быстрее. Любая декларация формы:

Sometype someVariable;

Выделяет переменную в стеке.

Любая декларация с участием new использует память из кучи, которая почти всегда ограничена только объемом оперативной памяти вашего компьютера. Следующая декларация выделяет указатель на Sometype в стеке, и экземпляр Sometype в кучу:

Sometype* someVariable = new Sometype();

Теперь о вашем коде:

1). RNAObject RNASoup[maxSize]; — создает одномерный массив RNAObjectв стеке.

2). RNAObject* RNASoup[maxSize]; — создает одномерный массив RNAObject указатели в стеке.

3). vector<RNAObject> RNASoup(maxsize); — создает вектор в стеке, тем не менее вектор хранит свои данные в куче, поэтому он работает. Однако вектор не очень подходит для вашего варианта использования: он был разработан для хранения данных, длина которых изменяется динамически, и эта функция снижает производительность.

Итак, что вы действительно хотите:

RNAObject* RNASoup = new RNAObject[maxSize];

Который создает указатель на массив в стеке и выделяет этот массив в куче.

Кроме того, из вашего вопроса совершенно очевидно, что вы не понимаете даже основ C ++. Вы должны выучить язык перед тем, как писать на нем, иначе у вас очень скоро будут большие проблемы.

1

ваша использованная строка и вектор в вашем коде, так что вам нужно

#include <string>

а также

#include <vector>

Кроме того, поскольку iostream, string и vector находятся в пространстве имен std, вам необходимо явно использовать это пространство имен, добавив

using namespace std;

или используйте полностью определенные имена, такие как

std::cout
std::vector

и т. д. чтобы ваш код работал.

-1