参数检查与功能调用开销

时间:2009-06-21 09:27:44

标签: c validation parameters function

我有一个公共函数,需要检查一些参数的有效性,但是这个函数也在内部用于其他几个我知道给定参数有效的地方。因此,我想知道,这是更昂贵的:1)在每个公共函数中保留有效性检查,或2)在公共函数中执行有效性检查,但创建不执行该检查的私有/内部函数(使用public函数作为内部函数的包装器。)

函数调用的开销是否超出了不必执行冗余检查的好处?

基本上,我目前的代码将遵循以下几行:

boolean foo(int* a, int* b, int* c)
{
   if (!a || !b || !c) {
       return FALSE;
   }
   <do the whatever foo does here>
}

boolean bar(int* a, int* b, int* c)
{
    if (!a || !b || !c) {
        return FALSE;
    }
    <do the whatever bar does here>
    foo(a, b, c);
 }

因此,bar()会对a,b和c进行检查,因为它是一个公开/公共函数,但是foo会重复相同的检查。允许这种情况发生会更有效吗?或者按照以下方式创建内部函数:

static boolean foo_internal(int* a, int* b, int* c)
{
    <do the whatever foo does here>
}

boolean foo(int* a, int* b, int* c)
{
   if (!a || !b || !c) {
       return FALSE;
   }
   foo_internal();
}

boolean bar(int* a, int* b, int* c)
{
    if (!a || !b || !c) {
        return FALSE;
    }
    <do the whatever bar does here>
    foo_internal(a, b, c);
 }

我主要关心的是C代码的效率,但是其他语言的一般答案/答案也很有用。

谢谢!

6 个答案:

答案 0 :(得分:2)

在性能方面,除非有可衡量的数据证明使用性能分析存在性能问题,否则重点应放在可读和可维护的代码上。

在这种情况下,除非参数检查真的贵,否则我认为它很好。该代码显示,意图是在执行foobar函数之前应该进行参数检查。

如果foobar是预期独立调用的独立函数,那么多次运行检查可能不是一个大问题。当然,如果参数检查成本太高,并且通过分析显示检查确实占用了大部分时间。

答案 1 :(得分:2)

我通常建议使用很多ASSERTS.I.e。在调试模式下,你可以检查一切更好 在发布模式下的错误处理我将只在我真的能找到问题时才会这样做。例如,我不会在释放模式下检查缓冲区指针是否为空(Null是一个非常小的无效指针示例),但如果我的缓冲区有限,我会检查缓冲区的大小。

答案 2 :(得分:1)

如果检查符合您的描述,在您真正看到它是性能问题之前,我什么都不做。这项检查可能会在纳秒内完成,如果不是微微......

答案 3 :(得分:0)

如果您真的关心速度,可以随时将公共功能内联。但我真的会检查它确实是一个问题。函数调用在C中非常快,除非你在紧密循环中调用函数,否则它不太可能成为问题。

这与python之类的语言非常不同,其中函数调用非常昂贵(至少在cPython上) - 在这种情况下,如果速度是一个问题,你应该考虑到这一点,你应该考虑到这一点

答案 4 :(得分:0)

每个函数调用都有一个开销:存储寄存器,将参数放在堆栈上,只要有结果返回它也应该被复制到返回寄存器,可能还有更多我忘记的细节。因此,您需要考虑拆分函数,因为您只想在参数检查非常非常非常昂贵的情况下避免双参数检查。使用C语言,您可以考虑使用宏来提高可读性。

答案 5 :(得分:0)

将参数检查保留在foo()中并开心。在调用之前删除所有冗余检查。完成后,您可以更快乐地重构代码:)