首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

执行效率太低,求大神优化迭代语句,该怎么解决

2013-11-23 
执行效率太低,求大神优化迭代语句 public void JXCC(){Double a 0.2int j 0for ( a t a + t /

执行效率太低,求大神优化迭代语句
 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;
            }
        }
    }
}

热点排行