Я пишу небольшую библиотеку для статистической выборки, которая должна работать как можно быстрее. При профилировании я обнаружил, что около 40% времени, затрачиваемого функцией, тратится на вычисление аппроксимации Стирлинга для логарифма факториала. Я сосредоточил свои усилия по оптимизации на этой части. Вот мой код (использующий MPFR):
const double AL[8] =
{ 0.0, 0.0, 0.6931471806, 1.791759469, 3.178053830, 4.787491743,
6.579251212, 8.525161361 };
void HGD::mpfr_afc(mpfr_t &ret, const mpfr_t &val){
if(mpfr_cmp_ui(val, 7) <= 0){
mpfr_set_d(ret, AL[mpfr_get_ui(val, MPFR_RNDN)], MPFR_RNDN);
}else{
mpfr_set(ret, val, MPFR_RNDN);
mpfr_add_d(ret, ret, 0.5, MPFR_RNDN);
mpfr_log(LV, val, MPFR_RNDN);
mpfr_mul(ret, LV, ret, MPFR_RNDN);
mpfr_sub(ret, ret, val, MPFR_RNDN);
mpfr_add_d(ret, ret, 0.399089934, MPFR_RNDN);
}
}
У меня есть пара разных идей:
- Предварительно вычислите больше, чем первые 8 входных параметров функции.
- Оптимизируйте математику (используйте более грубое приближение для меньшей точности)
- Используйте несколько потоков для параллельных вычислений на разных входных данных
- Переключитесь на собственную арифметику, когда числа могут соответствовать типам машинных данных.
Есть ли другие подходы, которые я мог бы использовать?
double
я ожидаю 15-18 цифр точности. Но тогда, возможно, конечный результат не требует ответа высокой точности. - person chux - Reinstate Monica   schedule 12.02.2014val
? - person Glenn Teitelbaum   schedule 12.02.2014val
? Как частоval
меньше 8? - person pat   schedule 12.02.2014scipy
реализацию формулы Стирлинга, чтобы понять проблему: github.com/scipy/scipy/blob/ - person iljau   schedule 12.02.2014val
в целом меньше 8 очень редко, за исключением случаев, когда входные данные для функции выборки сами по себе малы. - person pg1989   schedule 13.02.2014