warensoft 我是科学家

Warensoft 我是科学家

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

C#调用 F# 及简单性能对比

 

VS2010里已经集成了F#F#本身是函数型的编程语言,在数学运算方面具备天生的优越性,下面说明如何在C#中调用F#,并简单的从纯语法的角度来比较一下性能。

1.        建立一个F#

height=421

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#

height=94

height=118

 

7.        先分别调用10000次,然后增加循环次数,再进行比较,比较结果如下:

循环次数

F#时间(ms

C#时间(ms)

说明

1000

0.15

0.03

 

10000

0.32

0.38

次平均值

100000

2.19

2.08

次平均值

1000000

16.60

17.26

次平均值

10000000

179.08

185.54

次平均值

8.        测试结论

经过测试发现,虽然因为语法结构的不同,但是最终都被编译成IL所以执行效率基本上差不多,其实C#Swap函数的编写,是根据Reflector反编译F# DLL之后得到的。如何大家需要技术支援,请给我发Email:warensoft@foxmail.com


如何大家需要技术支援,请给我发Email:warensoft@foxmail.com

posted on 2010-03-10 12:31  王宇 warensoft  阅读(4892)  评论(2编辑  收藏  举报