有什么理由不对函数使用 INLINABLE pragma 吗?

2024-07-04

The 文档 http://www.haskell.org/ghc/docs/latest/html/users_guide/pragmas.html states:

函数 f 上的 {-# INLINABLE f #-} 编译指示具有以下行为:

  • INLINE 表示“请内联我”,而 INLINABLE 则表示“随意内联我;请自行决定”。换句话说,选择权留给了 GHC,它使用与无编译指示函数相同的规则。与 INLINE 不同,该决定是在调用站点做出的,因此会受到内联阈值、优化级别等的影响。

  • 与 INLINE 一样,INLINABLE 编译指示保留原始 RHS 的副本以用于内联目的,并将其保留在接口文件中,无论 RHS 的大小如何。

  • 使用 INLINABLE 的一种方法是与特殊函数 inline 结合使用(第 7.18 节“特殊内置函数”)。调用 inline f 非常努力地尝试内联 f。为了确保 f 可以内联,最好将 f 的定义标记为 INLINABLE,这样 GHC 就能保证暴露展开,无论它有多大。此外,通过将 f 注释为 INLINABLE,您可以确保 f 的原始 RHS 是内联的,而不是 f GHC 优化器生成的任何随机优化版本。

  • INLINABLE pragma 也可以与 SPECIALISE 一起使用:如果将函数 f 标记为 INLINABLE,那么您随后可以在另一个模块中进行 SPECIALIZE(请参见第 7.16.8 节“SPECIALIZE pragma”)。

  • 与 INLINE 不同,可以在递归函数上使用 INLINABLE 编译指示。这样做的主要原因是为了以后可以使用 SPECIALIZE

它有什么缺点呢?

它会使界面文件变得非常非常大吗?它会使编译速度变慢吗?

我有什么理由不应该在我编写的每个导出函数上放置 INLINABLE pragma 吗? GHC 是否有任何原因不在我编写的每个导出函数上添加 INLINABLE pragma?


使用 INLINABLE 和根本不使用编译指示之间存在三个区别:

  • 如果没有 INLINABLE,接口文件中的定义就是代码after优化,而对于 INLINABLE,它是您编写的代码(或多或少)。特别是,如果没有 INLINABLE,GHC 可能会将其他函数内联到函数的定义中。

  • 如果没有 INLINABLE,如果接口文件太大,GHC 将忽略该定义。如果其他一些函数内联到右侧,则很容易超出限制。

  • INLINABLE 还开启了一些巧妙的机制,可以自动专门化使用重载函数的地方,并与其他模块共享专门化版本,这些模块可传递导入创建专门化版本的模块。

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

有什么理由不对函数使用 INLINABLE pragma 吗? 的相关文章

随机推荐

  • 为什么异步 XMLHttpRequest 优于同步请求? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是否可以暂停流以便可以通过 RPC 调用恢复它?

    我正在尝试在 Corda 中实现以下用例 FlowA 已通过 PartyA 调用startFlowDynamic FlowA 创建部分签名的交易并通过 PartyB 调用 FlowBsendAndReceive 人类用户现在应审查并手动批准
  • 在 PHP 中组合数组

    尝试学习 PHP 中的数组 为简洁起见 发布了片段 HTML 表单在这里 p What are your favorite type of cookies p
  • 如何在 Titanium 中向 TableView 部分追加一行?

    我正在使用 Titanium 开发 iPhone 应用程序 并且需要将一行附加到特定的表格视图部分 https developer appcelerator com apidoc mobile 1 0 Titanium UI TableVi
  • 如何让标签来回滚动一个单词?

    我想出了让标签将单词滚动到一侧的想法 然后更改单词并滚动回另一侧 如下所示 ping ping ping ping ping ping ping ping ping ping ping ping pong pong pong
  • Heroku 的静态 IP 地址(不是 Proximo)

    有没有一种方法可以为 Heroku 服务器获取一个静态 IP 地址 我正在尝试集成各种需要 IP 地址的 API 由于 Heroku 的服务器设置 您永远不会拥有一台具有静态 IP 的服务器 相反 您的 IP 是动态的 我研究过像 Prox
  • 为什么Map有loadFactor而List没有呢?

    当用 Java 创建 Map 或 List 时 它们的默认初始容量都是 10 它们的容量会随着新元素的增加而增长 但是 List 仅在添加第 11 个元素时才会增长 而 Map 在添加第 8 个元素时已经增长 发生这种情况是因为 Map 有
  • WorkManager 的 doWork() 为 OneTimeWorkRequest 多次调用

    我才刚刚开始探索WorkManager在我的应用程序中 我的应用程序大部分都是离线的 因此所有数据都使用 room db 存储在本地 一旦设备连接到网络 我想将本地数据同步到服务器 然后获取最新数据并再次同步本地数据库 这是我的doWork
  • 从 Spring 服务器请求获取字符串主体

    我试图从请求正文中获取简单的字符串 但不断收到错误 Handler RestController public class GreetingHandler public Mono
  • h264无损编码

    h264 是否可以进行完全无损编码 所谓无损 我的意思是 如果我向它提供一系列帧并对它们进行编码 然后如果我从编码视频中提取所有帧 我将获得与输入中完全相同的帧 逐像素 逐帧 这实际上可能吗 举个例子 我生成一堆帧 然后将图像序列编码为未压
  • 在 Java Swing 应用程序中读取和写入属性文件

    我有一个任务是创建一个 java Swing 应用程序来使用 mysql 数据库做一些事情 我计划在 properties 文件中设置数据库连接属性 在该应用程序中 用户应该能够通过应用程序更改数据库属性 我遇到的问题是如何通过 swing
  • 移动表格位置 matplotlib python

    我创建了一个figure显示形状和table using matplotlib 问题是它是如何产生的 它们相互重叠 形状是按比例绘制的 所以我不想改变它 我想知道如何改变绘图的整体大小或移动表格的位置 import matplotlib p
  • Visual Studio 2012:远程调试监视器 (MSVSMON.EXE) 似乎未在远程计算机上运行

    I ve Visual Studio 2012 Ultimate on Windows 7 x64 machine Today when I tried to run my WPF application I got this error
  • HEAD 的 git 别名:refs/for/master

    我正在配置Gerrit我想避免写 git push gerrit HEAD refs for master 我想写 git push review 我确信可以修改 git config但我无法让它发挥作用 我设置了两种不同的推送类型 rev
  • 使用二阶二次曲线平滑小数据集

    我正在做一些特定的信号分析 我需要一种方法来平滑给定的钟形分布曲线 运行平均方法不会产生我想要的结果 我想保持拟合曲线的最小 最大和总体形状完整 但解决采样中的不一致问题 简而言之 如果给定一组模拟简单二次曲线的数据 您会推荐哪种统计平滑方
  • ASP 文本框调用 javascript 函数

    我在 asp 中有一个搜索文本框 我希望它在每次文本更改时向服务器发送请求 我有一个 javascript 函数 它发送请求 但每次我在文本框中输入内容时 它都不会被调用 如何从 ASP 文本框调用 javascript 函数 那是我的文本
  • 将 Haskell GHCi 输出重定向到文本文件 [重复]

    这个问题在这里已经有答案了 可能的重复 将 Haskell GHCi 命令结果输出到 txt 文件 https stackoverflow com questions 14595934 outputting haskell ghci com
  • SQL Server 更改数据捕获 - 捕获进行更改的用户

    关于SQL Server 更改数据捕获 https msdn microsoft com en us library bb933994 v sql 120 aspx 你能追踪到User谁对行 列数据进行了更改 或者是否有办法扩展 CDC 以
  • 如何处理单个 Activity 的多个 Fragment

    我最近开始考虑为我的 Android 设备开发应用程序 我产生这种兴趣的原因是我在玩几个arduinos时想到了一个好主意 让它们与我的手机进行通信 就像我在arduino本身上测量的任何值的接口一样 现在 我可以采取简单的方法并使用公共资
  • 有什么理由不对函数使用 INLINABLE pragma 吗?

    The 文档 http www haskell org ghc docs latest html users guide pragmas html states 函数 f 上的 INLINABLE f 编译指示具有以下行为 INLINE 表