Я пытаюсь написать функцию в C ++, используя MPFR для вычисления нескольких значений. В настоящее время я использую массив mpfr для хранения этих значений. Неизвестно, сколько значений необходимо рассчитывать и хранить каждый раз. Вот функция:
void Calculator(mpfr_t x, int v, mpfr_t *Values, int numOfTerms, int mpfr_bits) {
for (int i = 0; i < numOfTerms; i++) {
mpfr_init2(Values[i], mpfr_bits);
mpfr_set(Values[i], x, GMP_RNDN);
mpfr_div_si(Values[i], Values[i], pow(-1,i+1)*(i+1)*pow(v,i+1), GMP_RNDN);
}
}
Сама программа имеет цикл while, который имеет вложенный цикл for, который принимает эти значения и выполняет с ними вычисления. Таким образом, мне не нужно пересчитывать эти значения каждый раз в цикле for. Когда цикл for закончен, я очищаю память
delete[] Values;
прежде чем цикл while запускается снова, в этом случае он повторно объявляет массив
mpfr_t *Values;
Values = new mpfr_t[numOfTerms];
Количество значений, которые необходимо сохранить, рассчитывается другой функцией и передается функции через переменную numOfTerms. Проблема в том, что по какой-то причине массив сильно тормозит программу. Я работаю с очень большими числами, поэтому мысль заключается в том, что если я каждый раз пересчитываю эти значения, это становится чрезвычайно дорогим, но этот метод значительно медленнее, чем просто пересчет значений в каждой итерации цикла for. Есть ли альтернативный метод этому?
РЕДАКТИРОВАТЬ ** Вместо того, чтобы повторно выделять массив каждый раз, я переместил объявление и значения delete [] за пределы цикла while. Теперь я просто очищаю каждый элемент массива
for (int i = 0; i < numOfTerms; i++) {
mpfr_clear(Values[i]);
}
внутри цикла while до начала цикла while. Программа стала заметно быстрее, но все еще намного медленнее, чем просто вычисление каждого значения.
Если я правильно понимаю, вы делаете внутри while
цикл: mpfr_init2
(в начале итерации) и mpfr_clear
(в конце итерации) на numOfTerms
Числа MPFR и значение numOfTerms
зависит от итерации. И это то, что занимает большую часть времени.
Чтобы избежать этих многочисленных выделений памяти mpfr_init2
и освобождение от mpfr_clear
Я предлагаю вам объявить массив вне while
цикл и первоначально вызвать mpfr_init2
вне while
петля. Длина массива (то есть количество терминов) должна соответствовать максимальному количеству терминов. Может случиться так, что для некоторых итераций выбранное количество терминов было слишком маленьким. В таком случае вам нужно увеличить длину массива (для этого потребуется перераспределение) и вызвать mpfr_init2
на новые элементы. Это будет новая длина массива для оставшихся итераций, пока массив не нужно будет снова увеличивать. После while
цикл, сделать mpfr_clear
«S.
Когда вам нужно увеличить массив, имейте хорошую стратегию, чтобы выбрать новое количество элементов. Просто принимая необходимое значение numOfTerms
для текущей итерации не может быть хорошей, так как она может привести ко многим перераспределениям. Например, убедитесь, что у вас есть как минимум увеличение N%. Сделайте несколько тестов, чтобы выбрать лучшее значение для N … Смотрите Динамический массив например. В частности, вы можете использовать реализацию динамических массивов на C ++, как упоминалось в этой статье в Википедии.