.Net 函数调用的性能 (C# F#) VS C++ [英] Performance of .Net function calling (C# F#) VS C++

查看:19
本文介绍了.Net 函数调用的性能 (C# F#) VS C++的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

自从 F# 2.0 成为 VS2010 的一部分后,我对 F# 产生了兴趣.我想知道使用它有什么意义.我读了一点,我做了一个基准来衡量函数调用.我用过阿克曼的函数 :)

Since F# 2.0 has become a part of VS2010 I take an interest in F#. I wondered what's the point of using it. I'd read a bit and I made a benchmark to measure functions calling. I have used Ackermann's function :)

C#

sealed class Program
{
    public static int ackermann(int m, int n)
    {
        if (m == 0)
            return n + 1;
        if (m > 0 && n == 0)
        {
            return ackermann(m - 1, 1);
        }
        if (m > 0 && n > 0)
        {
            return ackermann(m - 1, ackermann(m, n - 1));
        }
        return 0;
    }

    static void Main(string[] args)
    {

        Stopwatch stopWatch = new Stopwatch();

        stopWatch.Start();
        Console.WriteLine("C# ackermann(3,10) = " + Program.ackermann(3, 10));
        stopWatch.Stop();

        Console.WriteLine("Time required for execution: " + stopWatch.ElapsedMilliseconds + "ms");
        Console.ReadLine();
    }
}

C++

class Program{
public:
static inline int ackermann(int m, int n)
{
  if(m == 0)
       return n + 1;
  if (m > 0 && n == 0)
  {
      return ackermann(m - 1, 1);
  }
  if (m > 0 && n > 0)
  {
      return ackermann(m - 1, ackermann(m, n - 1));
  }
  return 0;
 }
};

int _tmain(int argc, _TCHAR* argv[])
{
 clock_t start, end;

  start = clock();
 std::cout << "CPP: ackermann(3,10) = " << Program::ackermann(3, 10) << std::endl;
 end = clock();
 std::cout << "Time required for execution: " << (end-start) << " ms." << "

";
 int i;
 std::cin >> i;
 return 0;
}

F#

// Ackermann
let rec ackermann m n  =
  if m = 0 then n + 1
  elif m > 0 && n = 0 then ackermann (m - 1) 1
  elif m > 0 && n > 0 then ackermann (m - 1)  (ackermann m (n - 1))
  else 0

open System.Diagnostics;
let stopWatch = Stopwatch.StartNew()
let x = ackermann 3 10 
stopWatch.Stop();

printfn "F# ackermann(3,10) = %d"  x
printfn "Time required for execution: %f"  stopWatch.Elapsed.TotalMilliseconds

Java

public class Main 
{
 public static int ackermann(int m, int n)
 {
 if (m==0) 
   return n + 1;
if (m>0 && n==0)
{
 return ackermann(m - 1,1);
}
if (m>0 && n>0)
{
  return ackermann(m - 1,ackermann(m,n - 1));
 }
 return 0;
}

  public static void main(String[] args)
  { 
   System.out.println(Main.ackermann(3,10));
  }
}

然后
C# = 510 毫秒
C++ = 130 毫秒
F# = 185 毫秒
Java = Stackoverflow :)

An then
C# = 510ms
c++ = 130ms
F# = 185ms
Java = Stackoverflow :)

是否是 F# 的强大功能(除了少量代码)如果我们想使用 .Net 并获得更快的执行速度?我可以优化这些代码中的任何一个吗(尤其是 F#)?

Is it the power of F# (except small amount of code) If we want to use .Net and gain a bit faster execution? Can I optimalize any of these codes (especially F#) ?

更新.我摆脱了 Console.WriteLine 并在没有调试器的情况下运行 C# 代码:C# = 400ms

UPDATE. I got rid off Console.WriteLine and run the C# code without the debugger: C# = 400ms

推荐答案

我相信在这种情况下,C# 和 F# 之间的区别要归功于尾调用优化.

I believe that in this case, the difference between C# and F# is thanks to tail-call optimization.

尾调用是指在函数中作为最后一件事"完成的递归调用.在这种情况下,F#实际上并没有生成调用指令,而是将代码编译成一个循环(因为调用是最后一件事",我们可以重用当前堆栈帧,直接跳转到方法的开头).

A tail-call is when you have a recursive call that is done as "the last thing" in a function. In this case, F# doesn't actually generate a call instruction, but instead compiles the code into a loop (because the call is the "last thing", we can reuse the current stack frame and just jump to the beginning of the method).

在您的 ackermann 实现中,有两个调用是尾调用,只有一个不是(结果作为参数传递给另一个 ackermann代码>调用).这意味着 F# 版本实际上更少调用调用"指令(很多?).

In your implementation of ackermann, two of the calls are tail-calls and only one of them is not (the one where the result is passed as an argument to another ackermann call). This means that the F# version actually invokes a "call" instruction (much?) less often.

总的来说,性能配置文件与 C# 的性能配置文件大致相同.这里有很多与 F# 与 C# 性能相关的帖子:

In generall, the performance profile is roughly the same as performance profile of C#. There are quite a few posts related to F# vs. C# performance here:

这篇关于.Net 函数调用的性能 (C# F#) VS C++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆