当前位置: 首页 > 面试题库 >

`go build`不必要地重建

韦宏朗
2023-03-14
问题内容

在我拥有的一个小程序(尤其是cgo调用)上,go build和go
run非常慢。我想缓存二进制文件,以便仅在源文件较新时才重建。我会使用带有%规则的简单Makefile,但是语言设计人员声称go的构建支持不需要Makefile。

我还有其他选择吗?go社区是否愿意使用另一个构建系统(可能是基于哈希的构建系统)来缓存和重用构建产品?


问题答案:

我写了一个工具来解决这个问题。go build单独不会检查其生成的可执行文件是否已经更新。go install这样做,并且如果您对其进行了调整以将其安装到您选择的位置,那么您将获得所需的结果,类似于go build

您可以通过执行以下操作来查看描述的行为:

$ go get -d github.com/anacrolix/missinggo/cmd/nop
$ time go run "$GOPATH"/src/github.com/anacrolix/missinggo/cmd/nop/*.go

real    0m0.176s
user    0m0.142s
sys     0m0.048s

那是一个温暖的运行。go run会像每次调用一样在每次调用时链接go build。请注意,github.com/anacrolix/missinggo/cmd/nop该程序绝对不执行任何操作。

这里使用我的工具godo调用相同的软件包:

$ time godo github.com/anacrolix/missinggo/cmd/nop

real    0m0.073s
user    0m0.029s
sys     0m0.033s

对于较大的程序,差异应该更明显。

因此,总而言之,您的标准工具选项是使用go install或类似godo的替代方法。



 类似资料:
  • gobuild.io 是一个提供 golang 在线编译的网站。目前已重新上线 有很多很多优秀的工具是用 golang 写出来的。不过最大的开源网站 github.com 只提供代码的托管,并不提供二进制文件的下载。该网站将代码的编译与二进制的分享结合了起来,给无数人带来了便利。 比如一个项目的地址是 github.com/beego/bee,而二进制文件的下载直接前往 gobuild.io/be

  • 问题内容: 我有一个BaseActivity,其他所有活动都可以对其进行扩展。关键是,每当用户离开活动时,我都会将音乐静音。我也停止听电话。 问题是,只要用户在活动之间进行切换,就会被调用,这意味着该应用程序不必要地静音和停止,即使仅当用户离开该应用程序时该静音也应该停止。 现在说我在和之间切换。即使我只想 在用户离开应用程序时* 被调用,此开关也 不必要 执行。我该怎么办? * 感谢您的专家意见

  • 问题内容: 似乎有人认为,在64位体系结构上不需要使用“拆分堆栈”运行时模型。我说的似乎是,因为我还没有看到任何人真的这么说,只在它周围跳舞: 由于每个线程不需要最坏情况的堆栈大小,因此典型的多线程程序的内存使用量可能会大大减少。在32位地址空间中运行数百万个线程(完整的NPTL线程或协程序)成为可能。- 伊恩·兰斯·泰勒(Ian Lance Taylor) …暗示一个64位地址空间已经可以处理它

  • 我试图解决一个具有时间窗约束的车辆路径问题,如果没有找到可行的解决方案,则允许解算器删除节点。然而,我发现在添加析取之后,即使施加了很大的惩罚,也会不必要地删除节点。 下面是一个简单的示例程序,以说明该问题。解算器将删除节点1并返回0的解- 我是不是走错了方向?任何帮助都将不胜感激。

  • 我正在使用Spring Data JPA,以违反直觉的行为运行以下测试结果 进一步研究Hibernate的代码库,它出现在一个新线程上,persistentContext被清除干净。因此,就而言,我的实体变成了分离状态...创建了一系列决策,这些决策莫名其妙地导致生成一个新ID 我引用的特定代码位于:https://github.com/hibernate/hibernate-orm/blob/m

  • 我目前正在创建一个重试机制,用于使用故障保护库执行请求。 问题是:我定义的RetryPolicy包含几个与超时相关的异常,但是当我使用failsafe库(