推斷某個值是否在某個範圍彙編優化

2021-09-08 12:51:27 字數 3415 閱讀 1818

推斷某個值是否在某個範圍是否在某個區間範圍的**是經經常使用到的,處理是否超出某個邊界範圍的時候。 我畫素點設定為零。 否僅僅做點別的

在這個過程中, 我們可能要進行一次飽和處理, 於是乎寫以下的**:

if (val > 0 && val < 256)

else

於是乎我就寫了以下這樣乙個函式來討論我們的問題

int32_t israngat1(int32_t val, int32_t min, int32_t max)

return 0;

}

這個函式非常easy, 就是推斷乙個value是否是在(min, max) 這個範圍內,若果在返回1,否則0。 這裡是用的是開區間  

當然這裡我沒有考慮min < max 的容錯處理;

這種**好不好呢, 我們有沒有別的實現方式呢, 當然有, 至少我們能夠把if語句換成條件語句。例如以下:

int32_t israngat2(int32_t val, int32_t min, int32_t max)

當然我覺得是第二個實現比叫好(從反彙編的生成的指令看)。 可是可讀性可能就差一些, 我們 還有第二種實現
int32_t israngat3(int32_t val, int32_t min, int32_t max)

以上三種實現功能上都是乙個樣的。 可是可讀性遞減, 效率應該是遞增,  

特別是第三種。 用了比較和異或運算實現的, 這樣就消除了if語句的跳轉, 從而提高效率

int32_t israngat4(int32_t val, int32_t min, int32_t max)

這也是彙編裡面優化的一種策略, 當然這樣的方法我開始我也想到能這麼做。 我是通過放會變出來看出來的

.section	".toc","aw"

.section ".text"

.align 2

.globl israngat1

.section ".opd","aw"

.align 2

israngat1:

.long .israngat1,.toc.@tocbase32

.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,.toc.@tocbase32

.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

.align 2

.globl israngat3

.section ".opd","aw"

.align 2

israngat3:

.long .israngat3,.toc.@tocbase32

.size israngat3,.-israngat3

.previous

.type .israngat3,@function

.globl .israngat3

.israngat3:

.lfb13:

cmpw 7,3,4

li 9,1

li 0,1

cmpw 6,3,5

bgt 7,.l17

li 0,0

.l17:

bgt 6,.l18

li 9,0

.l18:

xor 3,0,9

extsw 3,3

blr.lfe13:

.size .israngat3,.-.israngat3

.align 2

.globl israngat4

.section ".opd","aw"

.align 2

israngat4:

.long .israngat4,.toc.@tocbase32

.size israngat4,.-israngat4

.previous

.type .israngat4,@function

.globl .israngat4

.israngat4:

.lfb14:

subf 5,5,3

subf 3,4,3

xor 5,5,3

srwi 5,5,31

extsw 3,5

blr.lfe14:

.size .israngat4,.-.israngat4

.ident "gcc: (gnu) 4.1.1 (sdk420, $rev: 3547 $)"

比較一下大家會發現。前面三種實現差點兒沒有一樣, 當然這裡我想說的一下。 這個彙編是我用gcc -o3出來的結果,大家都知道跳轉語句比較耗時。 所以有時候我們要提高效率, 我們能夠減少**的可讀性, 消除分支跳轉, 跳過效率, 非常多時候。 編譯器的一些優化策略是值得我們學習的。

這些彙編指令是powerpc ppu 的, 不了解的不要緊, 看看他們的生成的指令啥的即可。 了解了解。

感覺好的話就頂乙個, 感覺不錯的話就踩乙個。

時間範圍比較,判斷某個時間是否在某個時間段內工具類

時間格式化 判斷某個時間是否在某個時間段內 param date 待比較的時間 param format 時間格式,eg hh mm param starttimestr 時間範圍的開始時間,eg 06 00 param endtimestr 時間範圍的結束時間,eg 22 00 public st...

判斷陣列是否存在某個值。

檢查陣列是否包含某個值的方法 使用list public static boolean uselist string arr,string targetvalue 使用set public static boolean useset string arr,string targetvalue 使用迴...

在C 中判斷某個類是否實現了某個介面

有時我們需要判斷某個類是否實現了某個介面 inte ce 比如在使用反射機制 reflection 來查詢特定型別的時候。簡單來說,可以使用type.isassignablefrom方法 1 2 typeof ifoo isassignablefrom bar.gettype typeof ifoo...