未执行代码的性能

Performance with non executed code

本文关键字:性能 代码 执行      更新时间:2023-10-16

也许,我的问题很愚蠢,但我没有找到任何答案,我真的很想知道。当我们的程序中有一些函数没有被调用时(例如,它们只为未来的实现做准备),我认为编译器也会读取这些行(最小函数声明)。这没问题,但在更大的项目中表现如何?有什么我们应该避免的(例如一些分配/包含文件)会产生更大的影响吗?

例如:

//never called/used
class abc{
...
}
//never called/used
float function_A(float x, int y){
...}
int main(){
...
}

这只是一个简短的例子,但我想每个人都知道我的意思。非常感谢!

编译器的当前实现不会为某些类型的函数生成代码,正如您可以在这里阅读的那样。未使用的代码通常不会影响性能,尤其是在声明而未定义函数的情况下。只有包含大量指令的函数才会影响性能,但因此我建议您阅读有关指令缓存的内容。

在较大的库中,您应该关心include文件。如果智能地使用和(更重要的是)包含它们,则可以在编译时获得性能。I.e在头文件中使用前向声明,并在cpp文件中包含头。另一件事是,如果您拆分为几个头文件,编译器可以在链接时跳过整个.o文件(编译器在编译过程中创建),如果不使用它们的话。希望这对你有所帮助

如果您的意思是应用程序性能,那么保留未使用的代码不会产生任何影响。编译器执行死代码消除。但是,由于必须处理更多的代码,编译器会稍微放慢速度,因此您将不得不等待更长的时间来编译程序。不包括未使用的头文件是个好主意,因为一个头文件可以引入几十个或数百个其他头文件。(但预编译的头文件也有帮助。)

如果未删除的死代码降低了整个程序的局部性,那么指令缓存可能仍然是一个问题。

想象两个函数A和B,其中B从A被反复调用。如果A和B位于同一个缓存行,从A调用B不太可能产生缓存未命中。但是,如果链接器将第三个函数放在两个函数之间,使A和B不再位于同一缓存行,则调用B时发生缓存未命中的可能性会更大,从而降低总体执行速度。

虽然效果可能无法很好地测量,并且取决于许多其他因素,但减少死代码通常是个好主意。

如果编译器能够检测到它是死代码,它将完全删除它,并可能打印警告。否则,它将增加对象代码的大小。使用静态链接,链接器将删除未使用的函数。