执行效率太低,求大神优化迭代语句
public void JXCC()
{
Double a = 0.2;
int j = 0;
for (; a < t; a += t / 100)
{
Double c = 0.1;
for (double i =0 ;i<1000;++i )
{
Double MPm = Pm * Convert.ToDouble(textBoxX8.Text);
Double MKmat = Convert.ToDouble(textBoxX7.Text) / Convert.ToDouble(textBoxX11.Text);
a = a * Convert.ToDouble(textBoxX13.Text);//步长
c = c * Convert.ToDouble(textBoxX13.Text)+0.1;//步长
Double W = Convert.ToDouble(textBoxX1.Text);
Double fi = Convert.ToDouble(textBoxX14.Text);
Double Xa = URS31_2_1.Xa(c, a, Ri);
Double Mt = URS31_2_1.Mt(Xa);
Double Ms = URS31_2_1.Ms(a, t, Mt, Xa);
Double arf = URS31_P.arf(a, c, t);
Double Qpref = URS31_P.Qref(Pm, arf);
Double Lpr = Math.Abs(URS31_2_1.Lpr(Qpref, Qys));
Double ffi = URS31_P.ffi(a, c, fi);
Double jt = URS31_P.jt(c, Rh, fi);
Double fw = URS31_P.fw(Rh, W, c, a, t);
Double g4 = URS31_P.g4(a, c);
Double g3 = URS31_P.g3(a, c, t, fi);
Double g2 = URS31_P.g2(jt);
Double g1 = URS31_P.g1(a, c, t, fi);
Double M3 = URS31_P.M3(a, c);
Double M2 = URS31_P.M2(a, c);
Double M1 = URS31_P.M1(a, c);
Double Pc = Convert.ToDouble(textBoxX3.Text);
Double Q = URS31_2_1.Q(a, c);
Double Mm = URS31_P.Mm(M1, M2, M3, a, t, g1, g2, g3, g4, ffi, fw);
Double KI = URS31_P.KI(Mm, MPm, Pc, a, Q);
if (KI < 0.0)
{
KI = 0.0;
}
Double QSRref = URS31_P.Qref(Psrm, arf);
Double KSRI = URS31_P.KI(Mm, Psrm, Pc, a, Q);
if (KSRI < 0.0)
{
KSRI = 0.0;
}
Double OI = 1.0;
Double LSRr = URS31_2_1.LSRr(QSRref, Qys);
if (KSRI == 0.0) OI = URS31_2_1.OI1(KSRI);
else OI = URS31_2_1.OI2(LSRr, KSRI, 0.683, 0.333);
Double Kr = URS31_2_1.Kr2(KI, KSRI, OI, Convert.ToDouble(textBoxX7.Text));//理论值
Double Kr1 = (1 - 0.14 * Lpr * Lpr) * (0.3 + 0.7 * Math.Pow(2.71828, -0.65 * Lpr * Lpr * Lpr * Lpr * Lpr * Lpr));//实际值
if ((1.25 - Math.Round(Lpr, 2) >= 0.0 && (Math.Round(Kr1, 2) - Math.Round(Kr, 2) == 0.0) ||
(1.25 - Math.Round(Lpr, 2) == 0.0 && (Math.Round(Kr1, 2) - Math.Round(Kr, 2) >= 0.1) && 0 <= Math.Round(Kr, 2))))
{
cList.Add(c);
aList.Add(a);
break;
}
}
j++;
}
}
[解决办法]
if ((1.25 - Math.Round(Lpr, 2) >= 0.0 && (Math.Round(Kr1, 2) - Math.Round(Kr, 2) == 0.0)
[解决办法]
(1.25 - Math.Round(Lpr, 2) == 0.0 && (Math.Round(Kr1, 2) - Math.Round(Kr, 2) >= 0.1) && 0 <= Math.Round(Kr, 2))))
这一句优化一下。
Math.Round(Lpr, 2)等计算了多次,弄个变量在外面算一次。
从
[解决办法]
处分成两个独立的部分。上下两个部分按照&&的逻辑变成多层判断,概率最低的在外侧。
例如:
Double Lpr_2 = Math.Round(Lpr, 2);
Double Kr1_2 = Math.Round(Kr1, 2);
Double Kr_2 = Math.Round(Kr, 2);
if (1.25 - Lpr_2 >= 0.0)
{
if (Kr1_2 - Kr_2 == 0.0)
{
//你的代码
}
}
if (1.25 - Lpr_2 == 0.0)
{
if (Kr1_2 - Kr_2 >= 0.1)
{
if (0 <= Kr_2)
{
//你的代码
}
}
}
[解决办法]
你知道你哪里效率低吗?
你每次循环都在 Convert.ToDouble() 这是很耗时间的,但是这个完全可以提出来放在第一个 for 的最外面
[解决办法]
private static void Jxcc(double t)
{
//
// Optimization!
//
double x1 = Convert.ToDouble(textBoxs[1].Text); // W
double x3 = Convert.ToDouble(textBoxs[3].Text); // Pc
double x7 = Convert.ToDouble(textBoxs[7].Text);
double x8 = Convert.ToDouble(textBoxs[8].Text);
double x11 = Convert.ToDouble(textBoxs[11].Text);
double x13 = Convert.ToDouble(textBoxs[13].Text);
double x14 = Convert.ToDouble(textBoxs[14].Text); // fi
for (double a = 0.2D; a < t; a += t / 100)
{
for (double i = 0D, c = 0.1D; i < 1000D; i++)
{
double MKmat = x7 / x11;
a = a * x13;
c = c * x13 + 0.1D;
double Xa = URS31_2_1.Xa(c, a, Ri);
double Ms = URS31_2_1.Ms(a, t, URS31_2_1.Mt(Xa), Xa);
double arf = URS31_P.Arf(a, c, t);
double Lpr = Math.Abs(URS31_2_1.Lpr(URS31_P.Qref(Pm, arf), Qys));
double Q = URS31_2_1.Q(a, c);
double Mm = URS31_P.Mm(URS31_P.M1(a, c), URS31_P.M2(a, c), URS31_P.M3(a, c), a, t,
URS31_P.G1(a, c, t, x14), URS31_P.G2(URS31_P.Jt(c, Rh, x14)), URS31_P.G3(a, c, t, x14),
URS31_P.G4(a, c), URS31_P.Ffi(a, c, x14), URS31_P.Fw(Rh, x1, c, a, t));
double KI = URS31_P.Ki(Mm, Pm * x8, x3, a, Q);
if (KI < 0.0) KI = 0.0;
double KSRI = URS31_P.Ki(Mm, Psrm, x3, a, Q);
if (KSRI < 0.0) KSRI = 0.0;
double LSRr = URS31_2_1.LSRr(URS31_P.Qref(Psrm, arf), Qys);
double OI = (KSRI == 0.0) ? URS31_2_1.OI1(KSRI) : URS31_2_1.OI2(LSRr, KSRI, 0.683, 0.333);
double Kr = URS31_2_1.Kr2(KI, KSRI, OI, x7);
double Kr1 = (1 - 0.14 * Lpr * Lpr) * (0.3 + 0.7 * Math.Pow(2.71828, -0.65 * Math.Pow(Lpr, 6D)));
double rndKr = Math.Round(Kr, 2);
double rndKr1 = Math.Round(Kr1, 2);
double rndLpr = 1.25 - Math.Round(Lpr, 2);
if (rndLpr >= 0.0 && (rndKr1 - rndKr == 0.0)
------解决方案--------------------
(rndLpr == 0.0 && (rndKr1 - rndKr >= 0.1) && rndKr >= 0))
{
aList.Add(a);
cList.Add(c);
break;
}
}
}
}