我正在尝试用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循环内部。程序明显变得更快了,但仍然比仅仅计算每个值慢得多。
发布于 2015-02-08 08:08:39
如果我理解正确的话,您是在一个while循环中执行的:mpfr_init2 (在迭代开始时)和mpfr_clear (在迭代结束时)对numOfTerms MPFR number进行操作,而numOfTerms的值取决于迭代。这就是最耗费时间的事情。
为了避免由mpfr_init2分配的大量内存和由mpfr_clear分配的内存,我建议您在while循环外部声明数组,并在while循环外部最初调用mpfr_init2。数组的长度(即术语的数量)应该是您认为的最大术语数量。可能发生的情况是,对于某些迭代,选择的术语数量太少。在这种情况下,您需要增加数组的长度(这将需要重新分配),并在新元素上调用mpfr_init2。这将是数组在剩余迭代中的新长度,直到数组需要再次放大。在while循环之后,执行mpfr_clear。
当您需要扩大数组时,有一个好的策略来选择新的元素数量。仅仅获取当前迭代所需的numOfTerms值可能不是一个好的值,因为它可能会产生许多重新分配。例如,确保您至少有N%的增长。做一些测试来选择N值的最佳值...例如,参见Dynamic array。特别是,您可能想要使用动态数组的C++实现,正如这篇维基百科文章中所提到的那样。
https://stackoverflow.com/questions/28385736
复制相似问题