gpt4 book ai didi

c# - .NET 数学计算性能

转载 作者:行者123 更新时间:2023-11-30 22:35:31 24 4
gpt4 key购买 nike

我问了一个关于将 Excel 的 BetaInv 函数移植到 .NET 的问题:BetaInv function in SQL Server

现在我设法在纯依赖较少的 C# 代码中编写了该函数,并且我得到的结果与在逗号后最多 6 或 7 位的 MS Excel 中得到的结果相同,结果对我们来说很好,问题是这样的代码是嵌入的在 SQL CLR 函数中,并从存储过程中被调用数千次,使整个过程的执行速度慢了大约 50%,无论我是否使用该函数,从 30 秒到一分钟不等。

这是它的一些代码,我不是要进行深入分析,但是有没有人看到我在进行此计算时遇到的任何主要性能问题?例如,使用其他数据类型而不是 double 据类型或其他任何类型...?

private static double betacf(double a, double b, double x)
{
int m, m2;
double aa, c, d, del, h, qab, qam, qap;

qab = a + b;
qap = a + 1.0;
qam = a - 1.0;

c = 1.0; // First step of Lentz’s method.

d = 1.0 - qab * x / qap;

if (System.Math.Abs(d) < FPMIN)
{
d = FPMIN;
}

d = 1.0 / d;
h = d;

for (m = 1; m <= MAXIT; ++m)
{
m2 = 2 * m;
aa = m * (b - m) * x / ((qam + m2) * (a + m2));
d = 1.0 + aa * d; //One step (the even one) of the recurrence.

if (System.Math.Abs(d) < FPMIN)
{
d = FPMIN;
}

c = 1.0 + aa / c;

if (System.Math.Abs(c) < FPMIN)
{
c = FPMIN;
}

d = 1.0 / d;
h *= d * c;

aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));
d = 1.0 + aa * d; // Next step of the recurrence (the odd one).

if (System.Math.Abs(d) < FPMIN)
{
d = FPMIN;
}

c = 1.0 + aa / c;

if (System.Math.Abs(c) < FPMIN)
{
c = FPMIN;
}

d = 1.0 / d;
del = d * c;
h *= del;

if (System.Math.Abs(del - 1.0) < EPS)
{
// Are we done?
break;
}
}

if (m > MAXIT)
{
return 0;
}
else
{
return h;
}
}

private static double gammln(double xx)
{
double x, y, tmp, ser;

double[] cof = new double[] { 76.180091729471457, -86.505320329416776, 24.014098240830911, -1.231739572450155, 0.001208650973866179, -0.000005395239384953 };

y = xx;
x = xx;
tmp = x + 5.5;
tmp -= (x + 0.5) * System.Math.Log(tmp);

ser = 1.0000000001900149;

for (int j = 0; j <= 5; ++j)
{
y += 1;
ser += cof[j] / y;
}

return -tmp + System.Math.Log(2.5066282746310007 * ser / x);
}

最佳答案

唯一让我印象深刻且通常会影响性能的是内存分配。我不知道 gammln 的调用频率,但您可能希望将 double[] cof = new double[] {} 移动到静态一次性分配。

关于c# - .NET 数学计算性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7413891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com