三元组或 if 语句是否更快?

0 c performance if-statement function conditional-operator

所以我有两个选择,两个函数都具有相同的类型:

(Entry->d_type == DT_DIR ? rmdirr : remove)(CurrentEntryPath);
Run Code Online (Sandbox Code Playgroud)

或者

if (Entry->d_type == DT_DIR) {
    rmdirr(CurrentEntryPath);
} else {
    remove(CurrentEntryPath);
}
Run Code Online (Sandbox Code Playgroud)

我已经确认三元是 %100% 安全的,因为这两个函数都是兼容的指针类型。哪个更快(即使可读性较差)?

Joh*_*ode 5

规则 #0 - 不要考虑原始速度;相反,请考虑“当有人报告错误时,我宁愿在 8 个月后修复哪个”。

规则#1 - 衡量,不要猜测,也不要让无法访问您的系统的人猜测。在目标系统上对两个版本进行编码并对其进行分析 - 检查生成的机器代码,并针对足够大的测试集运行每个版本以生成可用的统计数据并分析结果。考虑它是如何使用的——它是在一个紧密的循环中被调用数千次,还是在程序的生命周期内被调用一次?每个函数都涉及更新文件系统,与决定调用哪个函数相比,无论您使用哪种方法,都需要更多数量级的时间来执行。

规则#2 - 如果你的代码给出了错误的答案,或者做错了事情,或者将你的信用卡信息暴露给全世界,或者如果隔壁房间的人打喷嚏,那么你的代码有多快都无关紧要,或者如果没有人(包括您自己)可以修复或更新它。代码首先是为了正确性,然后是可读性和可维护性,然后是安全性和可靠性,然后是速度。大多数显着的速度提升来自使用正确的算法和数据结构,而不是您选择的流控制结构。

规则#3 - 不要使用三元运算符代替用于流量控制的if-else结构;那不是它的工作。虽然第一个版本有效,但它有点刺眼且难以一目了然,当您从现在起六个月后重新拿起它时,您会问自己为什么这样做。而且我实际上可以保证它不会比其他方法快或慢。

我并不是说速度无关紧要——我是说速度只是需要考虑的一件事,除非您在特定领域工作,否则这不是最重要的事情。