代码之家  ›  专栏  ›  技术社区  ›  Morten Christiansen

在为C程序编写数学函数时,F会表现得很好吗?

  •  7
  • Morten Christiansen  · 技术社区  · 17 年前

    是否有人知道F与C相比,F衡量绩效的好坏?我有一个c光线跟踪器,它有很多向量操作、光线碰撞算法等,我认为它们可能更容易用f表示。我不是在问F在表达数学问题上有多好,这已经得到了解答。 here 但是,如果我应该期望更好或更差的性能呢?由于光线跟踪的性能非常密集,即使是性能不佳的小情况,在错误的地方也可能是一个问题。

    编辑:

    似乎已经有很多关于这个主题的问题我找不到(如果你真的用“f”这个词搜索任何东西,就没有结果)。一个好的观点 here 是否有以下答案:

    f提供一些与性能相关的 可以产生影响的功能。

    第一,实施 .NET上的委托当前相当 效率低下,因此F使用 它自己的fastfunc类型 高性能一流 功能。

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

    最后,模式匹配可以 用C语言表达非常困难# 因为语言缺乏模式 匹配,但几乎不可能 保持优化的C代码 等价于多个非平凡模式 比赛。相反,F编译器 积极优化模式匹配 在编译期间。

    相反,C编译器更好 在使用IEnumerable优化循环时 更擅长优化 计算值类型(例如 复杂算术)。

    干杯,乔恩·哈洛普。

    7 回复  |  直到 14 年前
        1
  •  7
  •   Rinat Abdullin    17 年前

    是的,F会表现得更好。

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

    C:

    10^7 iterations using Sigmoid1() took 3899,1979 ms
    10^7 iterations using Sigmoid2() took 411,4441 ms
    

    纯C:

    10^7 iterations using sigmoid1: 628 ms
    10^7 iterations using sigmoid2: 157 ms
    

    F:

    10^7 iterations using sigmoid1: 588.843700 ms
    10^7 iterations using sigmoid2: 156.626700 ms
    

    More details

        2
  •  2
  •   Chris Smith    17 年前

    f在计算中的行为与c相同(因为它只是il)。只需确保将向量表示为一个结构,因为您将构建许多寿命较短的对象。

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

        3
  •  1
  •   Robert    17 年前

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

    此外,本文对性能问题也有类似的看法: http://diditwith.net/2008/04/03/ApplesAndOranges.aspx

        4
  •  1
  •   tuinstoel    17 年前

    也许你已经知道了,但也许不知道。

    Google的名字是“Luke Hoban”,他已经用C 3.0制作了一个光线跟踪器,现在在微软F团队工作。

    参见: http://blogs.msdn.com/lukeh/ http://blogs.msdn.com/lukeh/archive/2007/04/03/a-ray-tracer-in-c-3-0.aspx .

    他应该知道。

        5
  •  0
  •   Mehrdad Afshari    17 年前

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

        6
  •  0
  •   Community Mohan Dere    8 年前

    我最初的反应是,由于c和f输出msil,性能将相同。但是你使用的结构可能会产生不同的IL。该主题已在链接中详细讨论。 here on SO .

        7
  •  0
  •   GvS    17 年前

    f更适合并行编程。因此,开箱即用(在多核/CPU上)它可以更快。

    但是,同样,您可以优化c_以将其用作WEL,但这将是一项更大的工作。