色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

編譯器如何對代碼進行優化(下)

jf_78858299 ? 來源:看雪論壇 彼岸風 ? 作者:看雪論壇 彼岸風 ? 2023-02-01 16:25 ? 次閱讀

變量乘常量

  • 常量為2的冪

乘法將會被替換為執行周期更短的移位指令。

int fun(int n) {
    return n * 16;
}
// mov eax, n
// shl eax, 4
  • 常量為非2的冪

因為 thumb 和 x86 指令集的差異,安卓平臺上處理的更好一些。

我并不推薦你把自己當成編譯器,看到算式想著怎么轉成匯編,而是推薦記下這種算法,看到計算過程知道怎么轉成原式,當然也不追求100%還原,邏輯一致即可。

編譯器會對非2的冪進行拆解,例如:

  • n * 15 = n * 16 - n = n << 4 - n
  • n * 12 = n * 3 * 4 = (n << 1 + n) << 2
int value = n * 15;
// rsb.w r0, r1, r1, lsl #4

int value = n * 12;
// add.w r0, r1, r1, lsl #1

當然 windows 平臺也不是一無是處,某些乘法會通過 lea 將兩條指令合并成一條。

  • n * 4 + 5 = lea edx, [ecx * 4 + 5]
printf("%d", n * 4 + 5);
// mov ecx, n
// lea edx, [ecx * 4 + 5]
// push edx

至于值為不可拆分的素數,就改用 mul 指令。

變量乘變量

這一步沒有什么優化空間,因為都是未知的,只能老老實實用 mul 指令。

int fun(int n, int m) {
    return n * m;
}
// mov eax, n
// mov ecx, m
// imul ecx

除法

在看下面內容之前,不妨再問問自己,真的了解除法嗎?除法的本質是什么?

ok,現在是復習時間,簡單總結一下以下兩個問題。

  • 符號問題
    1. 兩個無符號整數相除,結果依然是無符號
    2. 兩個有符號整數相除,結果依然是有符號
    3. 混除,參數全被當成無符號計算,結果是無符號
  • 取整問題
    1. 向下取整 —— floor 函數 存在誤差 => ( - a / b ) + ( a / b ) != - ( a / b ) - ( a / b )
    2. 向上取整 —— ceil 函數 存在誤差 => ( - a / b ) != - ( a / b )
    3. 向零取整 —— 截斷除法(Truncate),可以理解為放棄小數部分,只取整數部分,可以在任何情況保持恒等,大部分語言用的都是截斷除法

除數為無符號數

  • 大數(負數)

在無符號中,負數的值是很大的,例如 -8 = 0xFFFFFFF8。

而除以這種大數,只能出現兩種情況,1或 0,換個思路來想就可以寫成這樣:[被除數] >= [除數] ? 1 : 0

我們來看看 thumb 下是怎么優化的?

UINT value = (UINT)n / -8;
// cmn.w r0, #9    ; cmp r0, -9
// it hi
// movhi r1, #1    ; n > -9 ? 1 : 0

他這里做了一個小小的變形:[被除數] > [除數 - 1] ? 1 : 0,邏輯上仍然成立。

  • 2的冪

簡單的移位

UINT value = (UINT)n / 4;
// lsrs r1, r0, #2
  • 非2的冪

接下來就要引入一個非常魔幻的設定,magic number。說來這個魔數,依稀記得早在幾年前的知乎上看到過一篇文章,講的是雷神之錘游戲引擎就使用了這么一個魔數,那時的cpu是非常低效的,而為了避免使用除法這種 cpu 周期偏長的指令,天才的程序員們想出了各種奇技淫巧,其中最為后人津津樂道的就是游戲中對平方根倒數的優化,將計算過程等價替換為加法和移位操作,損失少量的精度來換取絕對的性能。

我們這里的魔數稍有不同,它是用來優化除法的,而且邏輯上也相對容易理解一些,廢話不多說,進入正題。

對于普通除法,我們可以得到以下的換算:(x => 被除數變量,c => 除數常量,M => 魔數)

假設用 M 代替 2^n / c 這個 Magic 變量,于是有:

也就是說,除法將會被轉會成 (x * M) >> n 的邏輯進行運算,至于 M 和 n 值怎么來的,我們不關心,這是編譯器根據除數算出來的最優值,會盡力保證偏差達到最小,我們要做的是認出魔數和移了多少位,然后根據 m = 2^n/c 公式求得原本的除數 c = 2^n/m

公式來源于《C++反匯編與逆向分析技術揭秘》,真的是非常非常的細,書中整個推導過程很完整,很建議各位去仔細研讀一遍

以下代碼為例:

printf("%u", (unsigned)argc / 3);
// mov eax, 0xAAAAAAAB   ; M
// mul [argc]            ; edx:eax = argc * M
// shr edx, 1            ; edx = argc * M >> 32 >> 1
// push edx

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4807

    瀏覽量

    68787
  • 編譯器
    +關注

    關注

    1

    文章

    1637

    瀏覽量

    49191
  • Andorid
    +關注

    關注

    0

    文章

    7

    瀏覽量

    7000
收藏 人收藏

    評論

    相關推薦

    如何編寫有利于編譯器優化代碼

    對于嵌入式系統,最終代碼的體積和效率取決于由編譯器生成的可執行代碼,而非開發人員編寫的源代碼;但是源代碼
    發表于 11-09 10:31 ?1419次閱讀
    如何編寫有利于<b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>的<b class='flag-5'>代碼</b>

    SIMD計算機的優化編譯器設計

    利用處理的相關資源,提高編譯器優化性能和增強代碼可適應性是SIMD處理優化
    發表于 04-03 08:47 ?30次下載

    Keil C編譯器編程規則和代碼優化

    本內容介紹了Keil C編譯器編程規則和代碼優化,要實用好單片機就必須清楚它的內部結構組織結構,無論是在芯片的選擇還是代碼的編寫
    發表于 04-20 17:37 ?315次下載
    Keil C<b class='flag-5'>編譯器</b>編程規則和<b class='flag-5'>代碼</b><b class='flag-5'>優化</b>

    編譯器_keil的優化選項問題

    keil編譯器優化選項針對ARM,對STM32編譯的一些優化的問題
    發表于 02-25 14:18 ?3次下載

    C編譯器及其優化

    本章將幫助讀者在ARM處理上編寫高效的C代碼。本章涉及的一些技術不僅適用于ARM處理,也適用于其他RISC處理。本章首先從ARM編譯器
    發表于 10-17 17:22 ?2次下載

    如何使用編譯器進行定位優化信息

    在本次網絡研討會中,我們將向您展示如何使用編譯器選項來定位您正在尋找的確切優化信息以及如何使用此信息來加速你的申請。
    的頭像 發表于 11-01 06:50 ?2627次閱讀

    編譯器優化對函數的影響

    編譯器如gcc,可以指定不同的優化參數,在某些條件,有些函數可能會被優化掉。
    的頭像 發表于 06-22 14:58 ?2854次閱讀
    <b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>對函數的影響

    如何編寫有利于編譯器優化代碼

    對于嵌入式系統,最終代碼的體積和效率取決于由編譯器生成的可執行代碼,而非開發人員編寫的源代碼;但是源代碼
    的頭像 發表于 03-29 15:58 ?1502次閱讀
    如何編寫有利于<b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>的<b class='flag-5'>代碼</b>

    編譯器如何對代碼進行優化(上)

    在學習 Andorid 逆向的過程中,發現無論是哪種編譯器,生成哪個平臺的代碼,其優化思路在本質上如出一轍,在 Windwos 平臺所使用的技巧,在安卓平臺仍然適用,不外乎乘法除法計算的優化
    的頭像 發表于 02-01 16:25 ?930次閱讀

    編譯器優化選項

    這一點,需要了解編譯器的能力和限制;第三,要了解硬件的運行方式,針對硬件特性進行優化。本文著重展開第二點和第三點。 簡單認識編譯器 要寫出高性能的
    的頭像 發表于 11-24 15:37 ?931次閱讀
    <b class='flag-5'>編譯器</b>的<b class='flag-5'>優化</b>選項

    Keil編譯器優化方法

    我們都知道,代碼是可以通過編譯器優化的,有的時候,為了提高運行速度或者減少代碼尺寸,會開啟優化選項。
    的頭像 發表于 10-23 16:35 ?688次閱讀
    Keil<b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>方法

    Triton編譯器與其他編譯器的比較

    的GPU編程框架,使開發者能夠編寫出接近手工優化的高性能GPU內核。 其他編譯器 (如GCC、Clang、MSVC等): 定位:通用編譯器,支持多種編程語言,廣泛應用于各種軟件開發場景。 目標:提供穩定、高效的
    的頭像 發表于 12-24 17:25 ?408次閱讀

    Triton編譯器優化技巧

    在現代計算環境中,編譯器的性能對于軟件的運行效率至關重要。Triton 編譯器作為一個先進的編譯器框架,提供了一系列的優化技術,以確保生成的代碼
    的頭像 發表于 12-25 09:09 ?259次閱讀

    Triton編譯器如何提升編程效率

    開發者能夠更快地開發出更高效的軟件。 1. 代碼優化 1.1 編譯優化 Triton 編譯器編譯
    的頭像 發表于 12-25 09:12 ?264次閱讀

    Triton編譯器與GPU編程的結合應用

    Triton編譯器簡介 Triton編譯器是一種針對并行計算優化編譯器,它能夠自動將高級語言代碼轉換為針對特定硬件
    的頭像 發表于 12-25 09:13 ?271次閱讀
    主站蜘蛛池模板: 岛国在线永久免费视频| 国产精品女上位好爽在线短片| 在线观看免费视频a| 大中国免费视频大全在线观看| 国产精品久久久久影院嫩草| 久久综合久久伊人| 校园高h肉耽文| 99日影院在线播放| 久草在线新是免费视频| 日韩亚洲人成在线| 日本久久久免费高清| 亚洲中文字幕乱倫在线| 一区精品在线| 国产精品JK白丝AV网站| 暖暖视频大全免费观看| 日本精品久久久久中文字幕2| 伊人久久亚洲精品一区| 国产精品JK白丝AV网站| 强奸日本美女小游戏| 2023国产精品一卡2卡三卡4卡| 黑色丝袜美女被网站| 午夜免费啪视频观看视频| 菠萝蜜国际一区麻豆| 国产欧美精品一区二区色综合| 男人一进一出桶女人视频| 欲香欲色天天天综合和网| 国内国外精品影片无人区| 丝袜美女自摸| 一个人免费完整在线观看影院| 国产AV一区二区三区传媒| 秋霞电影院兔费理论84MB| freevideoshd| 漂亮的av女演员| jizz黑丝| 欧美双拳极限扩张| 97午夜精品| 男人团apk| www精品一区二区三区四区| 国产亚洲精品久久久无码狼牙套| 三级黄色视屏| 在线日本高清日本免费|