2010-02-03 22 views
3

我有一段程序,其中包含大量的数学与一些相当长的方程。它漫长而难看,我希望用功能替代它。然而,在我的代码中,大量的代码被使用了很多次,并且还需要很多变量才能被初始化。我应该在被称为极端次数的情况下使用函数吗?

如果我担心速度,是调用该函数和初始化变量可以忽略不计的成本,否则我应该坚持直接编码它每次都在?

感谢,

-Faken

+0

为什么不使用'内联'? – 2010-02-03 04:55:30

+0

因为'inline'是有史以来最无用的关键字?大多数现代C++编译器将内联任何通过候选测试的函数,并且忽略不包含那些没有的函数的内联提示。完全呈现关键字100%并且完全无用。 – 2010-02-03 04:58:59

+1

@Chris:曾经听说过翻译单位?几乎没有用处的关键字。 – GManNickG 2010-02-03 06:06:05

回答

12

大多数编译器是聪明合理的内联小函数避免函数调用的开销。对于足够大的函数,编译器不会内联它们,调用的开销可能只是总执行时间的一小部分。

检查您的编译器文档以了解它的具体方法。一些较老的编译器需要或可能受益于提示函数是内联的候选者。

无论哪种方式,坚持功能,并保持您的代码清洁。

+0

好的,谢谢。我从现在开始做这件事。 – Faken 2010-02-03 04:10:12

+3

永远不会忘记。简介简介简介!你永远无法准确猜测瓶颈是从哪里来的,并且可能会浪费时间在你认为很慢但不是真的地方。 – 2010-02-03 04:15:12

+1

您可以通过使用内联指令(而不是“提示”...)进一步增加内联调用的机会,以及一些可能阻止或鼓励某些性能选项的命令行选项。请记住,无论内联提示和/或命令行选项如何,编译器可能仍然决定不服从该提示,并且记住,我们对分析问题的洞察力最好是不稳定的,直到我们精确地测量;幸运的是,大多数现代编译器相当擅长他们的工作。 – mjv 2010-02-03 04:16:04

3

你问你是否应该过早优化?

代码它在一个维护方式第一;如果你发现这部分是整个程序的瓶颈,那么就担心在那个时候调整它。

0

现代C++编译器通常内联小函数以避免函数调用开销。就变量初始化的成本而言,内联的好处之一是它允许编译器在呼叫站点执行额外的优化。执行内联之后,如果编译器可以证明您不需要这些额外的变量,则复制​​可能会被消除。 (我假设我们正在谈论的原语,而不是事情的拷贝构造函数)。

0

回答这个问题的唯一方法是对其进行测试。在不了解更多关于所提议的功能的情况下,没有人能真正地说出编译器是否可以/将内联该代码。这可能会/也将取决于您使用的编译器和编译器标志。根据编译器的不同,如果您发现确实存在问题,那么您可以使用不同的标志,附注等来强制内联生成它,即使它不在其他位置。

不知道该函数将多大,和/它会采取要不了多久来执行,这是不可能的猜测如何在速度太大的影响,它会具有如果没有联生成它。

随着这两个是未知的,我们没有人能真正猜测多大效果的代码移动到一个函数怎么会有。可能没有,或者很少或很大。

2

在分析代码之前,您不知道自己的瓶颈在哪里。你可以假设你的代码热点可能是错误的。我记得有一次我想优化一些计算代码。我运行了一个分析器,结果发现,70%的运行时间花在清零阵列上。没有人会通过查看代码来猜测它。

所以,第一个代码干净,然后运行一个分析器,然后优化起争执。不早。如果它仍然很慢,请更改算法。

相关问题