在 VS2010 里已经集成了 F# , F# 本身是函数型的编程语言,在数学运算方面具备天生的优越性,下面说明如何在 C# 中调用 F# ,并简单的从纯语法的角度来比较一下性能。
1. 建立一个 F# 库
2. 在 F# 的原文件中添加一个 Module (一定要添加哦,不然在 C# 中是无法调用的!),然后在这个 Module 中添加一个 Swap 函数。代码如下:
module FSModule
let Swap(a,b)=(b,a)
看习惯了 C 风格代码的程序员,再来看这段 F# 代码可能会感觉语法有怪异,但是真的挺简洁的。
3. 建立一个 C# 的应用程序,并添加这个 F# 库的引用
4. 在 C# 的应用程序里添加一个 C 风格版本的 Swap 方法,代码如下:
public static Tuple < int , int > Swap( int a, int b)
{
return new Tuple < int , int >(b,a);
}
注意这里返回的类型是 C#4.0 里新增加的 Tuple 类型,可以简单把它理解成一个数组类型。 另外之所以将该方法定义为静态的,是因为 F# Module 里的函数也会被编译成静态的。
5. 下面编写一个测试代码,来比较一下两个版本的 Swap 方法的速度,代码如下:
private void button1_Click( object sender, EventArgs e)
{
//F#
var start = DateTime .Now;
Tuple < int , int >result= null ;
for ( int i = 0; i < 1000 ; i++)
{
result= FSModule .Swap(1, 2);
}
var span = DateTime .Now - start;
this .listBox1.Items.Add( "F#" +span .TotalMilliseconds );
//C#
start = DateTime .Now;
result = null ;
for ( int i = 0; i < 1000 ; i++)
{
result = Swap(1, 2);
}
span = DateTime .Now - start;
this .listBox1.Items.Add( "C#" + span.TotalMilliseconds);
}
6. C# 以及 F# 的编译选项如下:
C# | F# |
|
|
7. 先分别调用 10000 次,然后增加循环次数,再进行比较,比较结果如下:
循环次数 | F# 时间( ms ) | C# 时间 (ms) | 说明 |
1000 | 0 .1 5 | 0 . 03 |
|
10000 | 0. 3 2 | 0. 38 | 多 次平均值 |
100000 | 2.1 9 | 2.08 | 多 次平均值 |
1000000 | 16. 60 | 17.26 | 多 次平均值 |
10000000 | 1 79.08 | 185.54 | 多 次平均值 |
8. 测试结论
经过测试发现, 虽然 因为语法结构的不同 ,但是最终都被编译成 IL 所以执行效率基本上差不多,其实 C#Swap 函数的编写,是根据 Reflector 反编译 F# DLL 之后得到的。
原帖:http://www.cnblogs.com/warensoft/archive/2010/03/10/1682387.html