您的位置:首页 > 编程语言

.NET下几种动态生成代码方式比较

2004-09-10 11:59 579 查看
场景:

平时在日常工作中往往会遇到这样的情况:一般的解决方案性能不是最好的,但性能最好的解决方案往往又不一定容易理解。如何兼顾这两者呢?这里有一个Microsoft网站上的例子,它用了几种动态代码生成的方法去实现同一个问题,可以对它们的性能做一个简单的比较,以后到底用那种方法心中就有数了。

要解决的问题:

计算一个多项式的值:
Y = A0 + A1 * X + A2 * X2 + … + An * Xn

比较指标:

1. 参数只有一个的情况: A0=5.5
2. 参数只有7个的情况: A0=5.5 A1=7.0 A2=15 A3=30 A4=500 A5=100 A6=1
3. 参数有30个的情况:A0=0 A1=1 ... A29=29
4. 参数有50个的情况:A0=0 A1=1 ... A49=49
5. 参数有100个的情况:A0=0 A1=1 ... A99=99

实现方式:

最普通的用循环的实现方式:(不涉及动态编程的内容,参考作用)
对参数进行循环。

public override double Evaluate(double value)

显然这样的方式循环是很多的,这里对参数循环,外面还要对指数幂循环。为了减少循环的次数,考虑将上面Evaluate的方法用动态代码的方式实现。
// polynomial evaluator
// Evaluating y = 5.5 + 7 X^1 + 7 X^2 + 7 X^3 + 7 X^4 + 7 X^5 + 7 X^6

class Poly_1
// polynomial evaluator
// Evaluating y = 5.5 + 7 X^1 + 15 X^2 + 30 X^3 + 500 X^4 + 100 X^5 + 1 X^6

class Poly_1001: PolyInterface.IPolynomial
// Polynomial evaluator
// Evaluating Y = 5.5 + 7 X^1 + 15 X^2 + 30 X^3 + 500 X^4 + 100 X^5 + 1 X^6
public class Poly_1001 : PolyInterface.IPolynomial {

public double Evaluate(System.Double x) {
return (5.5
+ (x
* (7
+ (x
* (15
+ (x
* (30
+ (x
* (500
+ (x
* (100
+ (x
* (1 + 0)))))))))))));
}
}

4.<<PolyEmit.cs>>
这里直接用元编程技术,跳过文本编译生成的过程,直接生成动态编译结果然后调用。
a.建立动态程序集;
b.元编程技术实现动态类和方法;
c.通过动态类的接口调用结果;

结果比较: (数据是在机子上某次运行的结果)

动态代码花费的时间(主要花费在代码编译上)

花费时间(s)1个参数7个参数30个参数50个参数100个参数
一般代码方式(PolySimple.cs)00000
动态代码方式一(PolyCodeSlow.cs)0.490.370.340.340.36
动态代码方式二(PolyCode.cs)0.470.40.360.370.43
动态代码方式三(PolyCodeDom.cs)0.510.380.430.390.38
动态代码方式四(PolyEmit.cs)0.010000
每秒可以运行多少个表达式(性能比较)

 1个参数7个参数30个参数50个参数100个参数
一般代码方式(PolySimple.cs)2484414910976159360626721071761050327
动态代码方式一(PolyCodeSlow.cs)5990559525589815786056057
动态代码方式二(PolyCode.cs)802588571170321429739091930444980942
动态代码方式三(PolyCodeDom.cs)1136363491100179829600871917754769594
动态代码方式四(PolyEmit.cs)1136363491191672229359061925118859074
由此可见:

后面三种动态方式的性能差不多,虽然元编程不花费时间在编译上,但其技术难度相对也高些。

相关例子下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: