2016-09-23 72 views
1

问题很简单 - 检查给函数的实际参数是否会导致性能损失?实际参数检查性能影响

导出的库函数通常倾向于以检查用户代码传递的实际参数:

if (arg1 == NULL || arg2 == NULL) 
    return -EINVAL; 

这是否检查性能产生负面影响?我尝试通过从某些导出的函数中删除这些检查来优化某些库代码(依赖于我是一个行为良好的用户并始终传递有效参数),但我注意到没有真正的改进。

我的第一个猜测是现代处理器上的分支预测会假设if分支没有被采用,并且继续执行代码而没有真正的惩罚。如果这确实是原因 - 这种分支预测机制的局限性是什么?是否有消除这些检查会提高性能的情况?在C这样的本地编译语言和解释或VM语言(如Python和Java)之间如何变化?

顺便说一句 - 我意识到检查运行时参数的重要性。我只对性能方面感兴趣。

+0

您需要广泛地标定这种事情才能真正知道。没有明确的答案。另外,查看Linux内核的'__likely'和'__unlikely'宏。 –

+0

您可能会发现[this](http://stackoverflow.com/a/11227902/2681632)有趣。 –

+0

一个更好的问题是检查'NULL'的参数是否有用。有*丰富*非'NULL'指针,不能传递给期望有效输入的函数。一个'assert()'可能更合理。 – EOF

回答

1

如果参数检查与值比较一样简单,则删除此检查所带来的性能改进很小。如果任何检查比较复杂,比如检查一个数组的所有项或者调用其他函数来检查每个参数,那么你可能会看到性能有所改进。

在任何编写良好的库中,这种参数检查不应该浪费时间。如果您试图找到影响开发的瓶颈,您应该对代码的执行进行基准测试/剖析,以确定“哪一行代码/函数”需要更多时间来执行,并专注于改进它们。