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

时间:2013-07-04 11:15:07

标签: c performance

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

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

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

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

感谢您阅读该帖子。

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

您应始终将资源划分为逻辑单位。

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

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

答案 2 :(得分:2)

当您拥有具有不同细分的16位PC时,这很常见。远(更糟糕的是," huge")指针带来了性能成本,因为你不得不开始使用段寄存器。

现在有了32位寻址,应该没有成本。最终,如果你担心表现,那么你就开始考虑" jump tables"在汇编中,要求目标地址相对于当前指令在短距离内。

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

答案 3 :(得分:1)

编译时间会改变。

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

如果除了随地吐痰之外没有对代码进行任何更改,那么最终结果也不会改变。

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


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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

如果你真的担心最轻微的性能损失,除非你启用了whole program optimization,并且它是有效的,否则会有轻微的可能性,编译器会错过一些优化机会如果您的文件被拆分(当然取决于代码的样式,使用全局变量,使用内联(请记住,在某些情况下,不内联可能会产生更好的结果),静态类/方法,如果您使用c ++等等。)

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

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