.Net函数调用(C# F#) VS C++的性能

2023-11-23

由于 F# 2.0 已成为 VS2010 的一部分,我对 F# 产生了兴趣。我想知道使用它有什么意义。我读了一点,并制定了一个基准来衡量函数调用。 我用过阿克曼函数:)

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." << "\n\n";
 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));
  }
}

An then
C# = 510 毫秒
C++ = 130毫秒
F# = 185 毫秒
Java = Stackoverflow :)

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

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


我相信在这种情况下,C# 和 F# 之间的差异归功于尾部调用优化。

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

在你的实施中ackermann,其中两个调用是尾调用,只有一个不是(结果作为参数传递给另一个调用)ackermann称呼)。这意味着 F# 版本实际上调用“call”指令的频率(少得多?)更少。

一般来说,性能概况与 C# 的性能概况大致相同。这里有很多与 F# 与 C# 性能相关的帖子:

  • F# 在数学方面真的比 C# 更好吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net函数调用(C# F#) VS C++的性能 的相关文章

  • 从 .Net 将简单数据插入 Excel 文件的最简单方法

    我有一个 Excel 文件 大约有 10 列和 1 20 行 我需要插入 1 20 行包含各种数据元素 我想知道是否有一种方法可以将一些标签放入 Excel 文件中 以便可以找到并替换它们 将列标记为 名称 的东西 这样我就可以在代码中说
  • 何时对向量进行归一化?

    我正在学习 XNA 并且在几乎所有的教育套件中都可以找到http creators xna com en US http creators xna com en US 我总是看到向量上对 Normalize 的调用 我知道归一化基本上将向量
  • C++ - 模板专业化和部分专业化

    我一直在互联网和 stackoverflow 上寻找具体的答案 但我似乎找不到 我必须创建一个通用类 然后实现特定的功能 我的具体说明是 您需要使用模板表达式参数以及模板类专业化和部分专业化 我有一个模板类 template
  • WPF - 按多列排序时使用自定义比较器

    我有一个 ListView GridView 我想按 2 列排序 因此如果第 1 列中有 2 个以上的项目具有相同的值 它将按第 2 列排序 非常简单 但是在对 A Z 进行排序时 空字符串会出现在顶部 我想把它们移到底部 我制作了一个比较
  • 浏览器收集哪些值作为回发数据?

    当页面被发送回服务器时 浏览器收集每个控件的当前值并将其粘贴到一个字符串中 然后 该回发数据通过 HTTP POST 发送回服务器 Q1 除了控件的 Text 属性和 SelectedIndexchanged 因此除了用户输入数据 之外 控
  • TypeAccessException:尝试通过方法...访问类型...失败

    完整的异常详细信息是 System TypeAccessException occurred Message Attempt by method DynamicClass System Text StringBuilder System O
  • Windows 程序如何临时更改其时区?

    我写了一个函数来返回time t与给定日期的午夜相对应的值 当给定日期没有午夜时 它返回最早可用的时间 例如 当埃及进入夏令时时 这种情况就可能发生 今年 时间更改于 4 月 29 日晚上午夜生效 因此时钟直接从 23 59 转到 01 0
  • 使用正则表达式匹配以“Id”结尾的单词?

    如何组合一个正则表达式来匹配以 Id 结尾的单词并进行区分大小写的匹配 试试这个正则表达式 w Id b w 允许前面的单词字符Id和 b确保Id位于单词末尾 b是字边界断言
  • 我们应该使用 Eval 还是 Databind 事件?

    当使用 Asp Net 并使用 ListView 等控件创建网站时 使用 Eval 命令是一个好习惯吗 还是应该在 databind 事件中填充文字和数据 取决于您是否想在更新事件上写回数据 在这种情况下数据绑定 如果您只想读取该数据 可以
  • 使用 Microsoft Graph 创建用户

    如何使用 Microsoft graph 创建用户 因为我在保存过程中遇到了权限失败的问题 我确实有几个问题 在图中调用创建用户 API 将在哪里创建用户 是在 Azure AD 还是其他地方 我尝试通过传递 json 和必需的标头来调用创
  • ASP MVC 5 - 403 customError 不起作用

    我正在尝试为我的应用程序创建自定义错误页面 它在大部分情况下都有效 但不适用于403 errors 我的网络配置
  • 从 ef core 的子集合中删除一些项目

    我有一个父表和子表 其中父表与子表具有一对多关系 我想删除一些子项 并且希望父项的子集合反映该更改 如果我使用删除选定的子项RemoveRange 那么子集合不会更新 如果我使用Remove从子集合中删除子集合然后 显然 它不如使用效率高R
  • 使用 cudamalloc()。为什么是双指针?

    我目前正在浏览有关的教程示例http code google com p stanford cs193g sp2010 http code google com p stanford cs193g sp2010 学习CUDA 演示的代码 g
  • 从存储过程返回 int 值并在 ASP.NET 代码中检查它以验证登录表单

    当我多次尝试但没有得到有效结果时 使此代码运行的真实顺序是什么 SQL存储过程的代码 set ANSI NULLS ON set QUOTED IDENTIFIER ON GO ALTER PROC dbo login proc usern
  • 语义问题 Qt Creator:命名空间“std”中没有名为“cout”的成员

    我开始使用 Qt Creator 编写代码 对于 C 文件 我遇到很多语义问题 99 是 命名空间 yyy 中没有名为 xxx 的成员cpp文件构建 编译和输出没有问题 如果我点击例如cout 我已链接到 iostream 我是否需要在 Q
  • 为什么从绑定返回的对象会忽略额外的参数?

    假设我有一个带有两个参数的函数 void f int x int y 我想绑定其中之一 我可以用std bind如下 auto partiallyBoundF std bind f 10 1 partiallyBoundF仅需要一个参数 但
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • C 中的静态和动态绑定(严格来说是 C,而不是 C++)是什么?

    我最初对发布这个问题感到担忧 以免它重复 但即使在谷歌搜索了许多关键字之后 我在 StackOverflow 上找不到任何解释 C 的静态和动态绑定的链接 尽管有 C 的问题和答案 但是都涉及classes以及显然不适合 C 的东西 Sta
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函
  • 如何获取通过网络驱动器访问的文件的 UNC 路径?

    我正在 VC 中开发一个应用程序 其中网络驱动器用于访问文件 驱动器由用户手动分配 然后在应用程序中选择驱动器 这会导致驱动器并不总是映射到相同的服务器 我该如何获取此类文件的 UNC 路径 这主要是为了识别目的 这是我用来将普通路径转换为

随机推荐

  • 使用 python 3.3.4 和 RotatingFileHandler 时出现 PermissionError

    我正在尝试为我使用 python 3 3 4 和 PyQt4 编写的 GUI 应用程序获取旋转日志文件 我的主脚本中有以下代码片段 import logging import resources logger logging getLogg
  • Angular - 构建模块的最佳实践

    我是角度新手 所以请耐心等待 前几天我正在阅读一篇文章 文档 其中强调了在应用程序中构建模块的最佳方法 但只能粗略地记住它 App controllers App services angular module App App contro
  • QTableView:更改双精度值的精度

    如果模型返回双精度值作为 EditRole 则 假设 QDoubleSpinBox 被 QTableView 用作编辑器 如何改变该控制的精度 解释了 QTableView 中 QDoubleSpinBox 的精度行为here 所以要解决这
  • JavaScript 字体规格

    给定 1 字体系列和 2 unicode 字符代码 是否可以在 JavaScript 中生成如下所示的图像 http www freetype org freetype2 docs tutorial metrics png 基本上 我想 显
  • 连接拒绝 MongoDB errno 111

    我有一个运行 Ubuntu 12 04 LTS 和 MongoDB 实例的 Linode 服务器 服务正在运行并且可以在本地连接 但我无法从外部源连接到该服务器 我已将这两条规则添加到我的 IP 表中 其中 是我想要连接的服务器 如本节中所
  • 在 POM 的 Maven 存储库条目中,默认情况下是否启用快照?

    A Maven POM可以定义一个 存储库 例如
  • 无法获取 BatchBridge,请确保您的捆绑包正确打包

    我正在尝试运行我创建的反应本机应用程序 当我最初在手机中运行它时 我看到以下屏幕 我尝试运行 react native start 当我运行它时 我得到以下输出 当它停止在 初始化包管理器 时 我在另一个终端中运行了 react nativ
  • 让 ffmpeg 与 Heroku 一起工作

    我尝试为我的 Heroku Rails 应用程序安装 ffmpeg 但现在我的应用程序崩溃了 我使用以下命令添加了一个构建包 heroku config add BUILDPACK URL https github com shunjiko
  • 从 .NET Windows 服务启动进程

    我正在尝试从 NET Windows 服务启动控制台应用程序 该服务在 Windows 2008 服务器上运行 我使用 Process Start 运行控制台应用程序并且它运行 我可以在任务管理器中看到它 但我从未取回进程 ID 并且对 P
  • R 中的 function(x):在不定义函数的情况下编写“函数”?

    我已经多次遇到这个概念 但不知道它的名称 因此无法通过谷歌搜索来了解更多信息 基本上 当查看其他人编写的函数甚至简单命令时 我经常会看到类似的内容 apply dataset 1 2 function x 10 x 在这种情况下 我能够以某
  • Bash 中的并行迭代 IP 地址

    我正在处理一个大型私有 8 网络 需要枚举正在侦听端口 443 并在其 HTTP HEADER 响应中声明特定版本的所有 Web 服务器 一开始我想跑nmap使用 connect 扫描并通过输出文件 grep 自己 但这会引发许多误报nma
  • python - subprocess.Popen().pid 返回父脚本的pid

    我正在尝试从另一个Python脚本运行一个Python脚本 并获取它的pid这样我就可以稍后杀掉它 I tried subprocess Popen 有论点shell True but thepidattribute returns the
  • 是否可以启用 source.organizeImports 而不删除未使用的导入?

    这就是我的用户中的内容settings json editor codeActionsOnSave source organizeImports true 喜欢这种排序 但不喜欢 Visual Studio Code 删除未使用的导入而不是
  • 如何在 Android 中创建滑块屏幕(如 Tweetdeck 中)?

    我们想要创建一个应该具有不同列表视图的屏幕 并且用户可以滑动 向左或向右 查看另一个列表视图 就像在 TweetDeck 和某些 Android 操作系统版本的主屏幕中一样 还有一个点列表 用于标识有多少列表视图 Please refer
  • SQL查询按时间戳的月份部分分组

    我真的不擅长 SQL 查询 但我正在学习 所以请原谅这个问题 这是我当前的查询 SELECT TIMESTAMP SUM electricity AS electricity siteID FROM table WHERE MONTH Ti
  • 重新生成会话 ID

    我正在考虑在每个页面上使用此代码以减少会话劫持的可能性 通过在每个请求上更新 session id if empty session session start 实现这一目标的另一种方法是这样做 if empty session sessi
  • window.requestFileSystem 不工作

    我正在 Firefox IE 9 Chrome 和 Opera 上尝试下面的代码 但是 onInitFs fs 函数没有被调用 如果我将 添加到 window requestFileSystem window PERSISTENT 1024
  • conda install -c anaconda gcc_linux-64 未使用

    我想在没有 root 访问权限的服务器上安装 gcc 的更新版本 我试过conda install c creditx gcc 7这不起作用 然后我发现conda install c anaconda gcc linux 64实际上安装了g
  • 来自 FBO 的 glReadPixels 因多重采样而失败

    我有一个带有颜色和深度附件的 FBO 对象 我渲染它然后使用它读取glReadPixels 我正在尝试添加多重采样支持 代替glRenderbufferStorage 我正在打电话glRenderbufferStorageMultisamp
  • .Net函数调用(C# F#) VS C++的性能

    由于 F 2 0 已成为 VS2010 的一部分 我对 F 产生了兴趣 我想知道使用它有什么意义 我读了一点 并制定了一个基准来衡量函数调用 我用过阿克曼函数 C sealed class Program public static int