F#在为C#程序编写数学函数时会表现良好吗?

F#在为C#程序编写数学函数时会表现良好吗?,c#,performance,f#,C#,Performance,F#,有人知道F#与C#相比,F#在性能方面的衡量有多好吗。我有一个C#光线跟踪器,有很多向量操作、光线碰撞算法等,我认为它们可能更容易用F#表示。我不是问F#在表达数学问题方面有多出色,这已经得到了回答,而是问我是否应该期待更好或更差的表现?由于光线跟踪的性能非常高,即使是性能较差的小案例,在错误的位置也可能会出现问题 编辑: 10^7 iterations using Sigmoid1() took 3899,1979 ms 10^7 iterations using Sigmoid2() too

有人知道F#与C#相比,F#在性能方面的衡量有多好吗。我有一个C#光线跟踪器,有很多向量操作、光线碰撞算法等,我认为它们可能更容易用F#表示。我不是问F#在表达数学问题方面有多出色,这已经得到了回答,而是问我是否应该期待更好或更差的表现?由于光线跟踪的性能非常高,即使是性能较差的小案例,在错误的位置也可能会出现问题

编辑:

10^7 iterations using Sigmoid1() took 3899,1979 ms
10^7 iterations using Sigmoid2() took 411,4441 ms
10^7 iterations using sigmoid1: 628 ms
10^7 iterations using sigmoid2: 157 ms
10^7 iterations using sigmoid1: 588.843700 ms
10^7 iterations using sigmoid2: 156.626700 ms
似乎已经有很多关于这个主题的问题我找不到了(如果你真的搜索任何带有“F”这个词的东西,都不会有结果)。一个很好的答案是:

F#提供了一些与性能相关的 可以带来不同的功能

第一,实施 NET上的代理目前相当活跃 效率低下,因此F#使用 它自己的FastFunc类型 高性能一流 功能

其次,F#使用.NET元数据 传递内联函数,以便 可以跨API导出,当然 当然,这可以大大改善 在某些情况下的表现

最后,可以进行模式匹配 用C语言表达起来非常费劲# 因为语言缺乏模式 但这几乎是不可能的 维护优化的C#代码 相当于许多非平凡模式 比赛。相反,F#编译器 积极优化模式匹配 在汇编期间

相反,C#编译器更好 在使用IEnumerables优化循环时 而且更擅长优化 对值类型的计算(例如。 复杂算法)

干杯,乔恩·哈洛普

F#在计算中的行为与C#相同(因为它只是IL)。只需确保将向量表示为一个结构,因为您将构造许多寿命很短的对象


度量单位对性能没有影响,事实上在编译时度量单位信息被完全删除。因此,你实际上无法判断你的F#代码上是否有度量单位。

事实上,理论上,x86机器只能执行命令性质的x86汇编,因此,理论上有可能强制实现函数式语言的性能。因此,您可以编写与F程序相同或更好的C程序。这里的关键词是can。这并不意味着所有的C程序都比F程序或类似的程序好。一般来说,F#性能在大多数问题中都是可以接受的。在某些情况下,F#性能远远落后于C#,但一般来说,对于大多数应用程序来说,这是可以的。然而,如果您想对代码的实际功能进行细粒度控制,函数式语言就不适合您。C语言比F语言有更多的优化机会。顺便说一句,我所说的F#并不是指编写命令式代码,而是指正常的函数式方法(如果您想强制编写代码,我认为F#没有多大意义)。

我最初的反应是,由于C#和F#都输出MSIL,性能将是相同的。但是您使用的结构可能会产生不同的IL。该主题已在链接中详细讨论。

F#的性能与C#的性能大致相同,它们都被编译为IL,这是一个重要因素(与IronPython和IronRuby不同,IronPython和IronRuby被解释,因此速度要慢得多)。一个算法的性能更多地取决于它的实现,而不是F或C的选择,因为F有助于在几行代码中实现它。相比C,在F中发现优化的机会要大得多

此外,本文对性能问题也有类似的看法:
也许你已经知道了,但也许不知道

谷歌以“Luke Hoban”的名字命名,他用C#3.0制作了一个光线跟踪器,现在在微软的F#团队工作

另见:和

他应该知道

F#更适合于并行编程。因此,它可以像C#(在多核/cpu上)一样更快

但是,同样,您可以优化C以使用它,但这将需要更多的工作。

是的,F将表现得更好。

以下是用不同语言实现的单线程算法的一些性能结果(神经网络的基准激活函数方法):

C#:

10^7 iterations using Sigmoid1() took 3899,1979 ms
10^7 iterations using Sigmoid2() took 411,4441 ms
10^7 iterations using sigmoid1: 628 ms
10^7 iterations using sigmoid2: 157 ms
10^7 iterations using sigmoid1: 588.843700 ms
10^7 iterations using sigmoid2: 156.626700 ms
纯C:

10^7 iterations using Sigmoid1() took 3899,1979 ms
10^7 iterations using Sigmoid2() took 411,4441 ms
10^7 iterations using sigmoid1: 628 ms
10^7 iterations using sigmoid2: 157 ms
10^7 iterations using sigmoid1: 588.843700 ms
10^7 iterations using sigmoid2: 156.626700 ms
F#:

10^7 iterations using Sigmoid1() took 3899,1979 ms
10^7 iterations using Sigmoid2() took 411,4441 ms
10^7 iterations using sigmoid1: 628 ms
10^7 iterations using sigmoid2: 157 ms
10^7 iterations using sigmoid1: 588.843700 ms
10^7 iterations using sigmoid2: 156.626700 ms

他承认光线跟踪器效率不高,他似乎更多的是作为一种练习而不是创造一个好的光线跟踪器。也许你可以给他发邮件问你的问题?是的,光线跟踪器效率不高,但这对Linq来说是一个很好的实验。理论上你是对的,实际上,F#比C#有更好的性能,因为更积极的优化,F#只是输出更好的IL,有时甚至更好。实际上,结果在很大程度上取决于您所写的内容。在这两种情况下,F#更好,而在这两种情况下,F#远远落后。顺便说一下,我的比较更多的是关于“函数F”和“C”。有些问题不能有效地表示为函数的组合。“如果您想对代码的实际功能进行细粒度控制,函数式语言不适合您”。你是说纯洁。F#是不纯净的。F#提供了相当细粒度的控制,当然可以与C#相媲美。令人惊讶的是:)F#比纯C更快。非常好的发现!我知道F#通常比C#快,但比C快简直太神奇了……是的,我也很惊讶。但是,我没有使用最新的C编译器,因此它可能会比F#稍好一点)