在c:内部状态提高速度吗?

时间:2014-08-27 01:32:52

标签: c performance function parameters state

假设我有一个带有两个重复调用的参数的函数。当你有带参数的函数时,它会增加内存使用量吗?

为每个重复的情况生成函数会更快,并且在没有参数的情况下调用该函数吗?

我认为这有时会被视为“内部状态”,但我的问题是这两个选项中的哪一个会表现得更快?

编辑>>>>>>>> 你的答案都很有启发性,请允许我立刻澄清一切。

似乎合乎逻辑

x = x + 10

会比以下更快:

x = x + y

我不是在谈论定义和初始化y所花费的时间,我只是谈论操作本身。从逻辑上讲,在第二种情况下,必须有一些额外的步骤,在执行操作之前CPU必须找到Y.当你用函数放大它然后反复乘以它时,我会认为这会产生显着的差异。

是的,在我的情况下,它适用于物理学,并且可能会感受到速度。

PS我对编译器功能和辩论学习汇编程序非常感兴趣。

3 个答案:

答案 0 :(得分:1)

参数通常在堆栈上传递,因此它们不会占用更多内存。 参数可能会“明显地”变慢,因为值可能会被复制到堆栈中(取决于编译器在优化时的优势)。

编译器比你更聪明,所以不要试图超越编译器。编写清晰的代码,让编译器担心性能。

re:你的编辑

“这取决于”

  • 您的处理器是否有不同的指令要将10添加到变量?
  • 它支持哪种寻址模式?

无论上述答案如何,编译器是否都会利用所有处理器的功能,这些功能可能会挤出每一滴性能。 例如 - 好的旧68000芯片有一个“INC”操作码将寄存器递增1.它比其他方法快得多。如果您手动滚动装配,x = x + 10最快的方法可能是召开INC 10次......

我使用时间受限的实时嵌入式应用程序,从不必担心这种级别的优化。如果成为问题,我会编写代码并担心性能。

答案 1 :(得分:0)

Does it increase the memory usage when you have functions with arguments?
不,函数参数在堆栈上传递(或者在寄存器中传递x64调用约定)。

Would it be faster to generate a function for each repetitive case, and call that function with no parameters?
不,您的编译器应该为您优化它,不需要使您的代码不那么可读

答案 2 :(得分:0)

  • 是否使用编译时参数进行重复调用,然后通过为给定的编译时参数集“实例化”相同函数的特殊版本,确实可以提高性能。在这种情况下,该功能甚至不具有“状态”:参数值将基本上嵌入到功能代码中。一些编译器可以隐式地执行它。

    改善的程度取决于功能的性质。在函数的每个给定版本中,整个代码块可能很容易被识别为无法访问并完全消除。也可以说功能内联本质上涉及相同类型的优化。

    显然,不加思索地使用这种优化可能很容易导致同一功能的不同版本(即代码膨胀)数量的组合爆炸,因此应谨慎使用。

    (顺便说一句,这与具有非类型模板参数的C ++函数模板非常相似。)

  • 如果使用运行时参数进行重复调用,则在运行时状态中预先保存它们可能无法实现任何显着改进。从某个“状态”中检索参数值不一定比从“常规”函数参数中检索它们更有效。

    当然,有一些经典的技术,如将多个函数参数打包到struct对象中,并将这样的struct对象传递给函数(而不是传递大量的独立参数)。如果参数在多次调用之间保持不变,则可以通过节省参数准备时间来提高整体性能。但是,是否将这样的结构对象称为“状态”是一个不同的问题。它绝对是一种手动技术,不是由编译器完成并涉及任何“内部状态”。