繁体   English   中英

在C语言中将单个文件拆分为多个文件 - 性能方面

[英]Spliting single file into multiple files in C - performance aspect

我在这个主题上发现了一篇类似的帖子,但是它解决了设计方面而不是性能问题所以我发布这篇文章是为了了解一个大的c文件如何影响编译和执行时间。

我有一个很大的utils文件(我们所有人都知道他们很快就会成长)。 我试图了解是否将文件拆分为基于模块的函数文件(cookies.c,memcacheutils.c,stringutils.c,search.c,sort.c,arrayutils.c等)会对编译和执行时间造成任何损失。

我的常识说它会增加一些惩罚,因为代码现在必须在远程获取位置而不是在同一个文件中找到指针。

我可能是错误的或部分正确的。 寻求所有大师的指导。 我当前的utils文件大约是150k,有80多个函数。

感谢您阅读该帖子。

通常将项目拆分为多个编译单元可以实现更好的项目管理和更快的部分编译。 编辑一个文件时,只需重新编译该编译单元并重新链接即可进行测试和调试。

根据您的编译器,虽然所有在一个文件中可能允许额外的内联和功能优化。 所有都是以编译时为代价的。

您应始终将源分段为逻辑单元。

这也有快速编译的好处,因为您不需要为每一次更改重新编译所有内容。 保持这样的来源最多也是可怕的,并且跟踪生产相关的变化也是有问题的。

如果函数驻留在不同的模块中,则没有性能增益/惩罚,并且在最坏的情况下,它将是单个额外的jmp指令。 如果您的代码确实依赖于机器周期,那么您应该首先考虑算法的设计。

当您拥有具有不同段的16位PC时,这通常很重要。 远(甚至更糟,“ 巨大 ”)指针带来了性能成本,因为你不得不开始使用段寄存器。

如今,32位寻址应该没有成本。 最后如果你担心性能,那么你开始考虑装配中的“ 跳转表 ”,它要求目标地址相对于当前指令的距离很短。

那么,在C中,你真的应该把你的代码放在不同的模块中(阅读软件“内聚”和“耦合”理论问题)。 执行时间应该没有区别。 就编译时而言,它“取决于” - 特别是如果你反复包含文件。 在具有多个文件的大型项目中,可以节省大量时间,因为您只能重新编译已更改的代码单元。 在一个小项目中,编译时间非常小,无法担心效率。

编译时间会改变。

(注意 - 任何可以进行增量构建的系统和项目都会变得更快。)

如果除了吐出文件之外没有对代码进行任何更改,那么最终结果将不会改变。

如果在代码中包含调试信息,那么最终的代码结果会随着更多文件而改变,但我不希望出现性能差异。


旁注,我认为没有一个程序员使用大型系统来告诉你不要拆分文件。 您只需要使大型系统可维护。 不能说你的系统是否还处于那个阶段,但早期这样做并没有什么害处。 拆分文件。

这不会增加任何性能损失。 即使它确实如此,也是一个不成熟的优化。 唯一重要的是开发时间。

如果你发现你已经确定所有的算法都具有最佳的复杂性,调整所有内部循环以获得最大性能,并且仍需要在运行时间之后减少几皮秒,那么你总是可以创建一个简单的源文件#include所有拆分源,将它们作为一个大块提供给编译器。

关于运行时性能,我会考虑运行一些性能测量,具体取决于您在性能损失方面的敏感程度。 到目前为止,答案的共识是,通过将文件拆分为更小的单位,运行时性能不会降低,但这取决于您对“性能”的定义。

如果你真的关心丝毫的性能损失,除非你有整个程序优化启用,这是有效的,有轻微的可能性,编译器会错过一些优化的机会,如果你的文件被分割(当然这取决于在代码的样式,全局变量的使用,内联的使用(请记住,在某些情况下,不内联可能会产生更好的结果),静态类/方法,如果你使用c ++等)。

我怀疑在某些边缘情况下,拥有单个源文件可以提高边际性能(在其他情况下,它可能会降低性能!)。 使用一些简单的场景(包括改变编译器的优化级别)之前和之后的测试将是一个非常有趣的实验。

我认为你不会发现任何严格的规则,例如“将大量相关函数拆分成两个源文件总是可以的”,但你可能会发现对于特定的编译器设置和源文件,分裂文件可能甚至会导致影响指令缓存性能的细微之处(取决于性能测试的精细程度)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM