Ketika programmer tidak melakukan apa-apa atau mengoptimalkan kode menggunakan Linq.Expression

Kebetulan saya belum dapat secara aktif membuat kode selama lima tahun. Jadi setiap kesempatan untuk masuk ke dalam kode dan mengacaukan rekan-rekan Anda di sana dianggap dengan kegembiraan, sebagai kesempatan untuk mengguncang masa lalu dan memastikan bahwa masih ada "buah beri di pantat" (alias penusuk di pantat). Ya, dan saya akan segera membuat reservasi bahwa artikel tersebut lebih merupakan tutorial, bukan dari rangkaian "terlihat wow kerennya saya bisa", tetapi dari rangkaian "oh, pilihan yang bagus untuk ditunjukkan dengan contoh sederhana penggunaan teknologi yang menyebabkan kesulitan bagi beberapa rekan". Saya sangat yakin bahwa solusi semacam itu harus disertakan dalam gudang senjata pengembang C # mana pun.





Baru saja saya meninjau kode, yang mencakup proses pendekatan multi-langkah, di mana perolehan koefisien yang konstan terlibat secara aktif (Koefisien dipilih untuk berbagai nilai. pergi dari tabel CSF IGalla sesuai dengan kecepatan tubuh saat ini (kisaran kecepatan sesuai dengan CSF tertentu, sekitar 300 elemen dalam tabel). 





Prosesnya multi-langkah, operasi pencarian sering dilakukan, dan pengembang anak-anak hebat, melangkah lebih jauh dari pencarian biner, menerapkan perhitungan kunci integer untuk berbagai nilai dan mendapatkan koefisien untuk kunci ini melalui Dictionary



Dan karena tim Agile, dan saya, jelek, juga SixSigma dan Saya sangat suka melihat semuanya dalam angka - kemudian orang-orang secara meyakinkan menunjukkan keefektifan solusi yang dipilih. Untuk 1 perhitungan dari 1000 titik aproksimasi, biayanya adalah:





Pencarian linier dalam tabel - 0,6ms

Pencarian linier berdasarkan rantai if-return - 0,1ms

Cari berdasarkan pembagian di setengah - 0,08ms

Cari berdasarkan kamus - 0,018ms





Itu menghantam meja saya pada saat proyek merangkak ke tahap "dan sekarang kami melakukan perhitungan yang sama pada mikrokontroler". Ternyata transfer kamus itu entah bagaimana tidak terlalu baik (ya, mereka bisa berpikir sebelumnya, tetapi mereka menghadapi mikrokontroler untuk pertama kalinya, jadi kami akan memaafkan mereka atas kelalaian ini). 





Berkat tim, mereka telah menghitung angka untuk "berpikir", dan saya perhatikan bahwa perolehan "kode bersih" dibandingkan penelusuran dalam struktur data adalah 6 kali (baris pertama). Dan menyimpan kamus agar tidak menjadi separuh - sedikit lebih dari 4 kali. 





β€œ ”, - -, data-driven , 20 . - .NET β€œ ”. if , Linq ? , . , , β€œβ€ . 





- . . - - . - if, , - if, . 





if, , . - range (), , (value), (v) .   , , Linq - , if if.





If (v >= from && v < to) return value;
      
      



public Expression CreateSimpleIf(double from, double to, 
                      double value, 
                      Expression v, LabelTarget returnTarget)
{
    var returnStmt = Expression.Return(
      returnTarget, 
      Expression.Constant(value));
    var ifCondition = Expression.AndAlso(
        Expression.GreaterThanOrEqual(v, Expression.Constant(from)), 
        Expression.LessThan(v, Expression.Constant(to)));
    return Expression.IfThen(ifCondition, returnStmt);
}
      
      







. 1 2 , , -,   , . 





, . 









if (v >= mid.from && v < mid.to) 
   return mid.value 
if (v < mid.from)    
    return search in (0...mid-1) 
else    
    return search in (mid + 1...length - 1);
      
      



Span



/ / β€œ ”. 





public Expression CreateSpanExpression(Span<Coefficient> span, 
          Expression v, 
          LabelTarget returnTarget)
{
    if (span.Length == 1)
        return CreateSimpleIf(span[0].RangeFrom, 
                   span[0].RangeTo, 
                   span[0].Value, 
                   v, returnTarget);
    else if (span.Length == 2)
    {
        Expression[] ifs = new Expression[2];
        ifs[0] = CreateSimpleIf(span[0].RangeFrom, 
                   span[0].RangeTo, 
                   span[0].Value, 
                   v, returnTarget);
        ifs[1] = CreateSimpleIf(span[1].RangeFrom, 
                   span[1].RangeTo, 
                   span[1].Value, 
                   v, returnTarget);
        return Expression.Block(ifs);
    }
    else
    {
        int mid = span.Length / 2;
        Expression[] blocks = new Expression[2];
        blocks[0] = CreateSimpleIf(span[mid].RangeFrom, 
                       span[mid].RangeTo, 
                       span[mid].Value, 
                       v, returnTarget);

        var leftSide = 
          CreateSpanExpression(span.Slice(0, mid), 
                               v, returnTarget);
        var rightSide = 
          CreateSpanExpression(span.Slice(mid + 1, 
                               span.Length - mid - 1), 
                               v, returnTarget);

        Expression condition = 
          Expression.LessThan(v, 
                              Expression.Constant(span[mid].RangeFrom));
        blocks[1] = Expression.IfThenElse(condition, leftSide, rightSide);
        return Expression.Block(blocks);
     }
} 
      
      



- . , , lambda- . 





public Func<double, double> CreateBTReeExpression()	
{
    var value = Expression.Parameter(typeof(double), "value");
    var returnTarget = Expression.Label(typeof(double));

    var ifs = CreateSpanExpression(mCoefficients.ToArray(), 
                                   value, returnTarget);
    var body = Expression.Block(typeof(double), 
                 new Expression[] 
                 { 
                   ifs, 
                   Expression.Label(returnTarget, 
                     Expression.Constant(0.0))
                 });

    var expression = Expression.Lambda(typeof(Func<double, double>), 
                       body, 
                       new ParameterExpression[] { value });
    var functionDelegate = expression.Compile();
    return (Func<double, double>) functionDelegate;        
}
      
      







, , ? 0.012ms, 1.5 Dictionary



. . 





, , , β€œβ€ - , , , β€œβ€ . , - , .  





, , , β€œ IDE” , . 





, , , , - , , , , ( , ). β€œ, ”.  





, – , , . silver bullet .





P.S.: , , . - , , , , , . , , , . .








All Articles