【发布时间】:2017-02-01 06:56:53
【问题描述】:
问题很简单——检查函数的实际参数是否会导致性能损失?
导出的库函数通常倾向于检查用户代码传递的实际参数:
if (arg1 == NULL || arg2 == NULL)
return -EINVAL;
此检查是否会导致性能损失?我尝试通过从一些导出的函数中删除这些检查来优化一些库代码(依赖于我是一个表现良好的用户并且总是传递有效的参数),但我没有发现真正的改进。
我的第一个猜测是现代处理器上的分支预测将假设 if 分支没有被采用,并继续执行代码而没有真正的惩罚。如果这确实是原因 - 这种分支预测机制的限制是什么?是否存在消除这些检查会提高性能的任何情况?这在 C 等原生编译语言与 Python 和 Java 等解释或 VM 语言之间有何变化?
顺便说一句 - 我意识到检查运行时参数的重要性。我只对性能方面感兴趣。
【问题讨论】:
-
您需要对这类事情进行广泛的基准测试才能真正了解。没有什么可以明确回答这个问题。另外,请查看 Linux 内核的
__likely和__unlikely宏。 -
你可能会觉得this很有趣。
-
一个更好的问题是检查
NULL的参数是否有用。有 很多 非NULL指针不能传递给期望有效输入的函数。assert()可能更合理。
标签: python c performance parameter-passing branch-prediction