私は.NETに移植されたExcelのBETAINV機能を持っていることについて質問を:BetaInv function in SQL Server.NET数学計算公演
は、今私は、純粋な依存少ないC#コードでその関数を記述するために管理し、私はよりも、同じ結果を得ますかMS Excelの最大6桁または7桁のコンマの後、結果は正常ですが、問題はそのようなコードがSQL CLR関数に埋め込まれており、ストアドプロシージャから何千もの時間が呼び出され、プロシージャ全体が約50その機能を使用するかどうかを30秒から1分まで遅くすることができます。
ここにいくつかのコードがありますが、深い分析を求めているわけではありませんが、この計算を行っているところで大きなパフォーマンス上の問題がある人はいますか?ダブルスの代わりに他のデータ型を使用するのと同じように...?
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);
}
これを試してみてください。ありがとう:)) –
クール、56秒から39秒に下がって、静的配列も読み取り専用でなければならない、またはSQL Serverがアセンブリのインポート/作成に不平を言う。どうもありがとう! –