gpt4 book ai didi

c++ - 函数大小与执行速度

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:09 25 4
gpt4 key购买 nike

我记得曾在某处听说过“大型函数可能有更长的执行时间”,因为代码大小、CPU 缓存或类似的东西。

如何判断函数大小是否对我的应用程序造成了性能影响?我该如何优化呢?我有一个 CPU 密集型计算,我已将其拆分为(与 CPU 内核一样多的线程)。主线程等待所有工作线程完成后再继续。

我碰巧在 Visual Studio 2010 上使用 C++,但我不确定这是否真的重要。

编辑:

我正在运行一个每像素发射大约 5,000 条光线的光线追踪器。我创建 (cores-1) 个线程(每个额外核心 1 个),将屏幕分成几行,并将每一行分配给一个 CPU 线程。我在每个线程上对每个像素运行 trace 函数大约 5,000 次。

我实际上正在寻找加快速度的方法。 我有可能通过重构减少主跟踪函数的大小,我想知道我是否应该期望看到性能提升。

很多人似乎在这里回答了错误的问题,我正在寻找这个特定问题的答案,即使您认为我可以通过优化函数,我想知道是否存在函数大小/性能关系。

最佳答案

它实际上不是函数的大小,而是运行时缓存的代码的总大小。您不会通过将代码拆分为更多的较小函数来加快速度,除非在您的关键代码路径中根本没有调用其中一些函数,因此不需要占用任何缓存。此外,如果编译器决定内联它们,您将代码拆分为多个函数的任何尝试都可能被编译器逆转。

因此,很难说您当前的代码是否“造成了性能损失”。与您可以以不同方式构建代码的众多方式中的哪一种相比,这是一个成功?而且您不能合理地期望这种变化会对性能产生任何特别的影响。

我想你正在寻找的是很少执行的指令(你的探查器会告诉你它们是什么),但位于经常执行的指令附近(因此需要在缓存中很多,并将拉入它们周围的缓存行)。如果您可以将经常执行的代码聚集​​在一起,您将从指令缓存中获得更多 yield 。

但实际上,这并不是一个很有成效的优化路线。你不太可能会有所作为。如果不出意外,您通常执行的代码可能已经非常小并且已经相邻,它会在某处出现少量紧密循环(您的探查器会告诉您在哪里)。最低级别的缓存行通常很小(大约 32 或 64 字节),因此您需要对代码进行一些非常精细的重新安排。 C++ 在您和目标代码之间放置了很多东西,阻碍了在内存中仔细放置指令。

perf 之类的工具可以为您提供有关缓存未命中的信息 - 其中大部分不会用于可执行代码,但在大多数系统上,您要避免哪些缓存未命中实际上并不重要:如果你能避免一些,那么你会加快你的代码。也许不是很多,除非有很多未命中,但有一些。

无论如何,您是在什么情况下听到的?我听到的最常见的一个想法是函数内联有时会适得其反,因为有时代码膨胀的开销大于避免的函数调用开销。我不确定,但是如果您的编译器支持的话,配置文件引导的优化可能会有所帮助。一个相当合理的配置文件引导优化是优先在执行次数较多的调用点内联,让较冷的代码更小,首先加载和修复的开销更少,并且(希望)对指令的破坏更少当它被拉入时缓存。比我更了解编译器的人会认真考虑这是否是一个好的配置文件引导优化,因此决定是否实现它。 p>

关于c++ - 函数大小与执行速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10999643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com