Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 如何提高生成文件的速度? 我在Fortran中用两个文件构建C++和CUDA中的多个二进制文件。我发现了一个类似的问题。最近,一位用户要求我重新构建一个三年前版本的存储库(在我们执行大规模迁移和重命名之前),我震惊地看到它构建得如此之快。要准确确定该版本和现在之间的哪些更改导致构建耗时如此之长,这将是不可能的/难以置信的耗时_Makefile_Performance - Fatal编程技术网

Makefile 如何提高生成文件的速度? 我在Fortran中用两个文件构建C++和CUDA中的多个二进制文件。我发现了一个类似的问题。最近,一位用户要求我重新构建一个三年前版本的存储库(在我们执行大规模迁移和重命名之前),我震惊地看到它构建得如此之快。要准确确定该版本和现在之间的哪些更改导致构建耗时如此之长,这将是不可能的/难以置信的耗时

Makefile 如何提高生成文件的速度? 我在Fortran中用两个文件构建C++和CUDA中的多个二进制文件。我发现了一个类似的问题。最近,一位用户要求我重新构建一个三年前版本的存储库(在我们执行大规模迁移和重命名之前),我震惊地看到它构建得如此之快。要准确确定该版本和现在之间的哪些更改导致构建耗时如此之长,这将是不可能的/难以置信的耗时,makefile,performance,Makefile,Performance,然而,我在回答上述问题时注意到: 特别是,请记住使用:=而不是=,因为:=进行扩展 立即,这节省了时间杰克·凯利3月23日22:38 还有其他我应该知道的建议吗 注: 我使用“include”范例,其中我要构建的每个目录都有一个module.mk文件,该文件直接包含在唯一的Makefile中 我确实使用了以下几种功能: (降价…) 更新2:根据@Beta的建议,我能够完成依赖项生成,生成文件的时间大约占总编译时间的14.2%。所以我将集中精力在我的C++代码中最小化头包含。谢谢你们两位的建议

然而,我在回答上述问题时注意到:

特别是,请记住使用:=而不是=,因为:=进行扩展 立即,这节省了时间杰克·凯利3月23日22:38

还有其他我应该知道的建议吗

注:

  • 我使用“include”范例,其中我要构建的每个目录都有一个
    module.mk
    文件,该文件直接包含在唯一的Makefile中
  • 我确实使用了以下几种功能:
(降价…)


更新2:根据@Beta的建议,我能够完成依赖项生成,生成文件的时间大约占总编译时间的14.2%。所以我将集中精力在我的C++代码中最小化头包含。谢谢你们两位的建议

我真的怀疑make的变量赋值(immediate with:=或recursive=)是否会对速度产生显著影响。当它产生严重影响时,一个具体而明显的情况是shell命令:

VAR := $(shell ...)
可能还有其他不明显的隐藏消费过程。例如,在我们的环境中,标准的临时windows目录位于网络驱动器上。因此,当在该驱动器上创建存储/更新的文件时(即使使用1G LAN),速度非常慢。您需要的是调试makefile


根据上面提到的文档,您可以以$(警告将要执行bla bla bla bla)的形式放置调试打印,然后观察进程最冻结的位置。

我真的怀疑make的变量赋值(立即使用:=或递归=)是否会对总体速度产生重大影响。当它产生严重影响时,一个具体而明显的情况是shell命令:

VAR := $(shell ...)
可能还有其他不明显的隐藏消费过程。例如,在我们的环境中,标准的临时windows目录位于网络驱动器上。因此,当在该驱动器上创建存储/更新的文件时(即使使用1G LAN),速度非常慢。您需要的是调试makefile

根据上面提到的文档,您可以将调试打印以$(警告将执行bla-bla-bla)的形式放置,然后观察流程冻结的最主要位置

  • 确定哪些变化减缓了一切应该不会那么困难。你有过去三年的所有版本(我希望如此),你说差异是巨大的。所以试试两年前的版本。如果花费的时间太长,请执行二进制搜索。您甚至可以将这个过程自动化,让它在一夜之间运行,并在早上给您一个图表,在过去36个月内每月对构建时间进行采样。
  • 如果您使用的是GNUMake(我希望如此),'make-n'将打印出它将执行的命令,而不实际执行它们。这将为您提供所有的制造时间,而无需编译时间。
  • 不必要的构建时间(甚至比你不使用的递归还要大)的最大来源之一是不必要的重建、重新编译/重新链接/当你真的不需要的时候。这可能是因为你的MaForm文件不能正确处理依赖关系,或者因为C++文件'''包括鲁莽的标题,或者一些我不知道的CUDA或FORTRAN。连续运行Make两次,看看它在第二次传递时是否有任何作用。在makefile中查找可疑的庞大先决条件列表。让熟练的程序员查看一些源文件,尤其是较新的源文件,并检查不必要的依赖关系。
  • 确定哪些变化减缓了一切应该不会那么困难。你有过去三年的所有版本(我希望如此),你说差异是巨大的。所以试试两年前的版本。如果花费的时间太长,请执行二进制搜索。您甚至可以将这个过程自动化,让它在一夜之间运行,并在早上给您一个图表,在过去36个月内每月对构建时间进行采样。
  • 如果您使用的是GNUMake(我希望如此),'make-n'将打印出它将执行的命令,而不实际执行它们。这将为您提供所有的制造时间,而无需编译时间。
  • 不必要的构建时间(甚至比你不使用的递归还要大)的最大来源之一是不必要的重建、重新编译/重新链接/当你真的不需要的时候。这可能是因为你的MaForm文件不能正确处理依赖关系,或者因为C++文件'''包括鲁莽的标题,或者一些我不知道的CUDA或FORTRAN。连续运行Make两次,看看它在第二次传递时是否有任何作用。在makefile中查找可疑的庞大先决条件列表。让熟练的程序员查看一些源文件,尤其是较新的源文件,并检查不必要的依赖关系。 ElectricMake(emake)是gmake的一个替代品,它使回答这样的问题变得非常非常容易。emake可以生成一个带注释的构建日志,其中包含构建中每个作业的详细计时信息,然后您可以将其加载到ElectricInsight中,以生成例如“按类型划分的作业时间”报告:

    如果你想尝试一下,你可以

    (免责声明:我是ElectricMake和ElectricInsight的架构师和首席开发人员!)

    ElectricMake(emake)是gmake的替代品,它让回答这样的问题变得非常非常简单。emake可以生成带注释的bui
    VAR := $(shell ...)