当前位置: 首页 > 知识库问答 >
问题:

什么样的GHC优化负责复制大小写表达式?

轩辕越泽
2023-03-14

给定以下代码:

{-# OPTIONS_GHC -funbox-strict-fields #-}
module Test where

data X = X !Int !Int

test (X a b) (X c d) = X (max a c) (max b d)

GHC在使用优化进行编译时生成此核心(重命名以便于阅读):

test
test =
  \ u v ->
    case u of x { X y z ->
    case v of c { X d e ->
    case tagToEnum# (<=# y d) of _ {
      False ->
        case tagToEnum# (<=# z e) of _ {
          False -> x;
          True -> X y e
        };
      True ->
        case tagToEnum# (<=# z e) of _ {
          False -> X d z;
          True -> c
        }
    }
    }
    }

请注意GHC如何总共生成4个不同的代码路径。通常,代码路径的数量随着条件的数量呈指数增长。

什么样的GHC优化导致了这种行为?是否有控制此优化的标志?在我的例子中,这会产生巨大的代码膨胀,并且由于深度嵌套的case表达式,使得核心转储非常难以读取。

共有1个答案

董奇思
2023-03-14

经过一些研究,我发现负责这一点的优化是所谓的“案例”转换,GHC可能在简化器中进行转换,因此它不能被停用(因为这对于GHC所做的很多事情都是必要的,而简化器是GHC优化管道的一个组成部分)。

以下链接解释了案例如何导致重复:http://lambda.jstolarek.com/2013/01/taking-magic-out-of-ghc-or-tracing-compilation-by-transformation/

特别是,在case的情况下:

case ( 
  case C of 
      B1 -> F1
      B2 -> F2
 ) of
    A1 -> E1
    A2 -> E2

具体如下:

case C of    
    B1 -> case F1 of
              A1 -> E1
              A2 -> E2
    B2 -> case F2 of
              A1 -> E1
              A2 -> E2

外部外壳被复制并推入分支。

 类似资料:
  • 问题内容: 我正在比较两个字符串列表,以查找可能的匹配项。例: 基本上,对于每个字符串,我都想查看其中是否包含全部或部分包含的字符串。以上代码的输出应为: 但是,在实际情况下,我在测试中有大约225K字符串,而在test2中有大约5K字符串。此比较花费的时间太长,希望查看是否有可能优化比较。分析test2中的前1.5K项大约需要10分钟。因此,至少需要30到40分钟才能完成比较。 提前致谢 问题答

  • 问题内容: 在课堂上,我们现在学习如何构建Spring应用程序,即使没有直接涉及spring,我们也学习了如何为DAO和服务层对象创建接口。 如果我错了,请纠正我:DAO层是非常抽象的:它仅包含CRUD操作,并进一步用于读取数据(即:获取所有对象,获取特定对象等) 服务层:包含用于创建事物和删除事物的服务,这是业务逻辑应该存在的地方。 现在,所有这些对于服务层来说都是有意义的。除了“更新”对象。你

  • 我们在Debian8上使用Percona MySQL5.6作为电子商务聚合器。为此,有一个主后端服务器执行整个ETL(处理来自合作伙伴的产品提要),还有一个由前端web服务器使用的从MySQL服务器。它是一个包含约600GB数据的单一产品数据库。 这两台机器都带有RAID10和datacenter系列固态硬盘。主MySQL是128GB内存的双至强E5,从MySQL是64GB内存的单至强E5。我们的

  • 这是一种方法: 我对lambda表达式的理解很差,“expression”部分必须返回一个值,在这种情况下,它必须是字符串 So<代码>()- 既然如此,为什么要用lambda表达式呢? 为什么不直接列出。“已读”?

  • 什么是拷贝删减?什么是(命名的)返回值优化?它们暗示了什么? 在什么情况下它们会发生?限制是什么? 如果您被引用到此问题,您可能正在查找介绍。 有关技术概述,请参阅标准参考。 请参阅此处的常见情况。

  • 本文向大家介绍Java实现在正则表达式中控制大小写的方法,包括了Java实现在正则表达式中控制大小写的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现在正则表达式中控制大小写的方法。分享给大家供大家参考,具体如下: 默认是:区分大小写的; 传递标志参数:Pattern.CASE_INSENSITIVE,以说明匹配时忽略大小写; 如果你的代码运行在不同的地区那么你应该再添加一