登录
首页 >  Golang >  Go问答

go编译器会“压缩”函数吗?

来源:stackoverflow

时间:2024-04-16 15:36:34 455浏览 收藏

本篇文章给大家分享《go编译器会“压缩”函数吗?》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我对我工作的公司的一位工程师问我的问题很感兴趣,关于是否有一个遍历数组并测试两个条件的单个函数更好,或者有两个函数,用一个函数更好每个条件。

我来这里就是想问问大家我的理由是否错误。

代码大约是这样的:

response := listobjectsfroms3(bucket)

var filteredemptyobjectsarray = utils.filteremptyobjects(response)
var filterednonjson = utils.filternonjson(filteredemptyobjectsarray)

每个功能是:

func filteremptyobjects(arraytofilter []*object) []*object {
    var filteredarray []*object
    for _, object := range arraytofilter {
        if *object.size > 0 {
            filteredarray = append(filteredarray, object)
        }
    }

    return filteredarray
}

func filternonjson(arraytofilter []*object) []*object {
    var filteredarray []*object
    for _, object := range arraytofilter {
        if strings.hassuffix(*object.key, ".json") {
            filteredarray = append(filteredarray, object)
        }
    }
    return filteredarray
}

请原谅上面代码中的重复。它只是一个玩具示例。

我不知道 go 到底是如何优化这段代码的,但我想它可能会将这两个函数“压缩”成这样的东西 - 当然,不是在 go 代码中,但生成的机器代码将相当于这样:

func filtersquashed(arraytofilter []*object) []*object {
    var filteredarray []*object
    for _, object := range arraytofilter {
        if strings.hassuffix(*object.key, ".json") && *object.size > 0 {
            filteredarray = append(filteredarray, object)
        }
    }
    return filteredarray
}

响应的代码 - 也不是真正的 go 代码,但编译器会生成相当于这样的机器代码:

response := utils.FilterSquashed(ListObjectsFromS3(bucket))

重点是,当我对优化代码和非优化代码进行 objdump 时,两者的函数都是分开的,并且每个函数都有一个 call 。因此,我试图了解当前可能的优化深度或 go 编译器决定坚持的优化深度。

让我知道你的想法


解决方案


您显示的“压缩”代码并不等同于原始代码。代码优化的基本规则是优化和未优化代码的效果必须相同,但在您的示例中,您有两个应用不同逻辑来过滤列表的函数,以及应用第三种逻辑的第三个函数在这种特殊情况下,逻辑将给出两个原始函数的组合,但在一般情况下则不然。简而言之:在这种情况下,没有编译器会执行您所要求的操作,因为语义不同。

在某些情况下,内联某些函数时编译器可能会发现更多优化,但我不知道您的示例如何从内联中受益。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>