判断某个值是否在某个范围汇编优化

判断某个值是否在某个范围是否在某个区间范围的代码是经常用到的,处理图片是否超出某个边界范围的时候, 我像素点设置为零, 否只做点别的

在这个过程中, 我们可能要进行一次饱和处理, 于是乎写下面的代码:

if (val > 0 && val < 256)
{
     // do something
}
else
{
    // do something
}

于是乎我就写了下面这样一个函数来讨论我们的问题

bool isRangAt1(int val, int min, int max)
{
    if (val > min && val < max)
    {
        return true;
    }
    return false;
}

这个函数很简单, 就是判断一个value是否是在(min, max) 这个范围内,

当然这里我没有考虑min < max 的容错处理;

这样的代码好不好呢, 我们有没有别的实现方式呢, 当然有, 至少我们可以把if语句换成条件语句,如下:

bool isRangAt2(int val, int min, int max)
{
    return val <= min ? false : val < max ? true : false;
}

当然我认为是第二个实现比叫好(从反汇编的生成的指令看), 但是可读性可能就差一些, 我们 还有另外一种实现

bool isRangAt3(int val, int min, int max)
{
    return (val > min) ^ (val > max);
}

以上三种实现功能上都是一个样的, 但是可读性递减, 效率应该是递增,

特别是第三种, 用了比较和异或运算实现的, 这样就消除了if语句的跳转, 从而提高效率,

这也是汇编里面优化的一种策略, 当然这种方法我开始我也想到能这么做, 我是通过放会变出来看出来的

这是前面两种方法的汇编(大家可以在ubutnu装一个交差编译工具, 这个汇编是powerpc 的), 大家可以比较一下:

	.file	"range.cpp"
	.section	".toc","aw"
	.section	".text"
	.align 2
	.globl isRangAt1
	.section	".opd","aw"
	.align 2
isRangAt1:
	.long	.isRangAt1,[email protected]
	.size	isRangAt1,.-isRangAt1
	.previous
	.type	.isRangAt1,@function
	.globl	.isRangAt1
.isRangAt1:
.LFB11:
	cmpw 7,3,4
	li 9,1
	li 0,0
	cmpw 6,3,5
	ble 7,.L4
	bge 6,.L8
.L5:
	mr 0,9
.L4:
	extsw 3,0
	blr
.L8:
	li 9,0
	b .L5
.LFE11:
	.size	.isRangAt1,.-.isRangAt1
	.globl __gxx_personality_v0
	.align 2
	.globl isRangAt2
	.section	".opd","aw"
	.align 2
isRangAt2:
	.long	.isRangAt2,[email protected]
	.size	isRangAt2,.-isRangAt2
	.previous
	.type	.isRangAt2,@function
	.globl	.isRangAt2
.isRangAt2:
.LFB12:
	cmpw 7,3,4
	li 9,1
	li 0,0
	cmpw 6,3,5
	ble 7,.L12
	ble 6,.L15
.L13:
	mr 0,9
.L12:
	extsw 3,0
	blr
.L15:
	li 9,0
	b .L13
.LFE12:
	.size	.isRangAt2,.-.isRangAt2
	.ident	"GCC: (GNU) 4.1.1 (SDK420, $Rev: 3547 $)"

比较一下大家会发现, 方法1和方法二几乎没有一样, 当然这里我想说的一下, 这个汇编是我用gcc -O3出来的结果, 有些没有的指令可能已经被删除了, 所以一样,

但是很多时候我还是觉得第二种比第一种简洁, 对于第三中方法实现的汇编, 我暂时不给出汇编, 读者可以自己反汇编出来看看, 记得-O3哦。

有错欢迎指出, 分享请标明出处, 谢谢!

时间: 2024-12-25 19:08:35

判断某个值是否在某个范围汇编优化的相关文章

JavaScript 的in 操作符 (“如何判断某值是否数组中的元素”?)

在编写JavaScript时,遇到一个常见的问题"如何判断某值是否数组中的元素"?这让我想起了PHP中的in_array()函数和Python中in 操作符.但JavaScript似乎没有内置类似的函数,而其in 操作符的作用也有点不同.通过查询相关的资料,我发现JavaScript的in 操作符还是挺有用的. 一.问题让我想到in 操作符,正是因为这样一个问题:"如何判断某值是否数组中的元素"?在PHP中,您可能会这样来处理: $os = array("

判断的值是否为空

/** * @projectname 项目名称: minxinloan * @packageclass 包及类名: com.minxinloan.loanaudit.web.controller.LoanauditCtrl.java * @description 功能描述: 判断的值是否为空 * @param 参 数: @param val * @param 参 数: @return * @return 返回类型: boolean * @createdate 建立日期: 2014-8-1下午4:

switch 判断单个值是否匹配,elseif 判断范围

1 <?php 2 3 $week=date("D"); 4 $week=1; 5 6 //switch (变量)//变量只用整行和字符串 7 //如果变量没有匹配的值则执行default中的区域,需要可以加上,不需要可以不加. 8 //break 是退出 9 //可以同时匹配多个条件,用来执行同一段代码. 10 //switch 判断单个值是否匹配,elseif 判断范围; 11 switch($week){ 12 13 case 1: 14 case 11: 15 case

jq select change下拉框选项变化判断选中值,添加(attr)或移除(removeAttr)一个或多个属性

select change下拉框选项变化判断选中值,添加(attr)或移除(removeAttr)一个或多个属性 $("#IsRecommend").change(function () { var isCheck = $(this).children('option:selected').val(); if (isCheck == "true") { $("#CategoryId").css("display", "

汇编优化工具

/* 汇编优化工具 使汇编代码更具可读性,并提高汇编速度 优化15000行大约需要30秒 */ import rfile.h main { name=getsl s=rfile.read_all_n(name) s=s.replace('\n','\r\n') s=s.replace('dword esp','esp') s=s.replace('dword ebp','ebp') s=s.replace('dword edi','edi') s=s.replace('dword esi','e

【VBA研究】如何在if中判断一个值为null的变量

作者:iamlaosong 做一个工具要求用户先在列表框中选择,然后再做相应的操作,如果未做选择,要给出提示,调试中发现,取列表框的值,假如未做选择,此时值为null(空),对其进行常规的判断是不行的,例如下面语句: StationName = ListBox2.Value If StationName=vbNullString Then 调试发现,上述if条件中无论用"="还是用"<>"都不成立,用len(StationName)=0也不成立,因为此时

MySQL判断字段值来确定是否插入新记录

今天正好有个新需求,要求在一张表中,保证不插入重复的记录. 即,保证每条记录中的某个字段的值不重复. 下面是我给出的SQL语句: // 判断表中现有字段3的值是否与新插入记录的字段3的值相同,如果不同则插入新数据. INSERT INTO 表名称 (字段1, 字段2, 字段3) SELECT 插入值1, 插入值2, 插入值3 FROM DUAL WHERE NOT EXISTS ( SELECT * FROM 表名称 WHERE 表名称.字段3 = 插入值3) 如果 "表.校验字段"

判断Integer值相等最好不用==(未整理)

今天在开发中判断两个Integer值相等, Integer a = 3; Duixiang duixiang = new Duixiang(); duixiang = DAO.getDuixiang(); Integer b = duixiang.getB(); System.out.print(a == b);System.out.print(a.equals(b)); 发现a==b时,为false,a.equals(b)为true. 后来发现因为我b的值是从数据中拿出的一个对象的值.a和b的

hdoj 3435 A new Graph Game 【无向图判断权值最小哈密顿环】【KM算法】

A new Graph Game Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1934    Accepted Submission(s): 827 Problem Description An undirected graph is a graph in which the nodes are connected by undir