C 语言循环体内使用 if else 时,大概率执行的代码块是放在 if 中还是 else 中对执行效率的影响

之前听前辈说过,使用 if else 时,大概率执行的代码块位置是有所考究的。

今天编写对效率敏感的代码时又想起了这个,当时没有实际去验证这一说法,今天就趁机进行了一下验证。

示例代码如下:

#include "stdio.h"

int main(int argc, char **argv)
{
	int i;
	int a = 1;
	int b = 0;
	
	if(a > b){
		i = 1;
	}else{
		i = 0;
	}
	
	printf("%d",i);
    return 0;
}

使用 VC 编译并提取编译后的部分汇编代码如下:

9:        if(a > b)
0040D7C6   mov         eax,dword ptr [ebp-8]
0040D7C9   cmp         eax,dword ptr [ebp-0Ch]
0040D7CC   jle         main+37h (0040d7d7)
10:       {
11:           i = 1;
0040D7CE   mov         dword ptr [ebp-4],1
12:       }else{
0040D7D5   jmp         main+3Eh (0040d7de) //进入 if,会多执行 jmp 指令
13:           i = 0;
0040D7D7   mov         dword ptr [ebp-4],0
14:       }
15:
16:       printf("%d",i);
0040D7DE   mov         ecx,dword ptr [ebp-4]
0040D7E1   push        ecx
0040D7E2   push        offset string "%d" (0042201c)
0040D7E7   call        printf (00401110)
0040D7EC   add         esp,8
17:       return 0;
0040D7EF   xor         eax,eax

使用 gcc -S 编译源文件并提取汇编文件的部分代码如下:

	subl	$32, %esp
	movl	$1, 24(%esp)
	movl	$0, 28(%esp)
	movl	24(%esp), %eax
	cmpl	28(%esp), %eax
	jle	.L2
	movl	$1, 20(%esp)
	jmp	.L3  //进入 if,会多执行 jmp 指令
.L2:
	movl	$0, 20(%esp)
.L3:
	movl	$.LC0, %eax
	movl	20(%esp), %edx
	movl	%edx, 4(%esp)
	movl	%eax, (%esp)
	call	printf


以上都是在没有经过编译器优化的情况下进行编译的,如果使用优化选项,编译的汇编代码会直接使用判断的结果来执行后续代码的。

总结:
通过以上验证过程可以得知,在频繁大量的使用 if else 的时候,按照如下方式来进行处理,会相应提高运行速度:

if(条件)
{
    //放置执行次数少的执行体
}else{
    //放置执行次数多的执行体
}

即 else 中放置条件满足次数多的执行体,这样可以减少跳转指令的调用次数
一次判断,影响可以忽略不计,但多次重复调用,累积的结果还是会有一定影响,特别是在一些性能不强的硬件平台上使用的时候,应该尽量在软件上进行优化,提高运行效率。

在性能强大的硬件平台上,这点影响几乎可以忽略不计,因为 cpu 内部会有大量的结构来优化代码的执行效率,比如流水线结构等等····本人能力有限,在这里只能浅显的表述一下。

实用场景如下,函数被外部重复调用的前提下

void vFunc(void)
{
	static int i = 1000;
	
    if(0 == i){
	    //执行其他需要的操作
    }else{
		i--;
	}
}

以上执行就比下面的执行效率高一些

void vFunc(void)
{
	static int i = 1000;
	
    if(i>0){
	    i--; //此处每次都会比上面的执行多一条跳转指令
    }else{
		//执行其他需要的操作
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: I'm sorry, but your message seems to be incomplete. Could you please provide more context or information so I can better understand what you are trying to ask or say? ### 回答2: if (unlikely 是一个计算机编程术语,通常用于条件判断语句。 在编程,我们经常需要根据特定的条件去执行不同的代码段。而 if 语句就是一种常用的条件判断语句,用于根据条件的真假决定是否执行某段代码。 如果在 if 语句使用了 unlikely 这个关键字,它的作用是提示编译器该条件的成立概率较低,帮助编译器进行代码优化。 在编程序,我们通常会选择将出现概率高的条件放在 if 语句的 true 分支,而将出现概率较低的条件放在 false 分支。这样可以提高代码的执行效率,加快程序的运行速度。 然而,有些情况下我们无法确定条件的成立概率,或者条件的成立与否难以确定。在这种情况下,使用 unlikely 可能没有明显的性能提升,甚至可能造成代码的可读性下降。 因此,在编代码,我们需要权衡是否使用 unlikely。如果条件的成立概率较低,并且确定使用 unlikely 可以提高代码的性能,那么我们可以考虑使用该关键字。但如果条件的成立概率不确定或者 unlikely 对性能没有显著影响,我们可以选择不使用 unlikely,以提高代码的可读性和维护性。 总之,if (unlikely 是一种用于条件判断语句的关键字,用于提示编译器条件的成立概率较低,以帮助进行代码优化。在编代码,我们需要根据条件的成立概率和代码的可读性、性能进行权衡,决定是否使用这个关键字。 ### 回答3: if (unlikely) 是一个编程语言的条件判断语句,意思是"如果不太可能发生"。在编程,我们经常使用这个条件来判断一些不太可能出现的情况,通常是用于处理一些边界情况或异常情况。 在处理边界情况,我们需要特别注意一些可能引起错误或异常的情况。例如,当我们从一个列表获取元素,我们可能会遇到索引超出范围的情况。在这种情况下,我们可以使用 if (unlikely) 条件来处理这个异常情况,例如: ```python if (unlikely(index >= len(my_list))): handle_out_of_range_error() else: handle_normal_case() ``` 这样,当索引超出范围,我们可以在 if (unlikely) 条件处理该异常,并执行一些自定义的错误处理操作,而不是程序崩溃或导致其他不可预测的错误。 在处理异常情况,我们也可以使用 if (unlikely) 条件来提前判断和处理异常。例如,当我们打开一个文件,可能会遇到文件不存在的异常情况。在这种情况下,我们可以使用 if (unlikely) 条件来判断文件是否存在,若不存在则进行相应的错误处理: ```python if (unlikely(not os.path.exists(file_path))): handle_file_not_found_error() else: handle_normal_case() ``` 总之,if (unlikely) 条件语句在编程经常用于处理一些不太可能发生的情况,用来处理边界情况或异常情况。它可以帮助我们提前判断和处理一些可能引起错误或异常的情况,从而使程序更加健壮和可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值