<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Golang 使用 upx 減少可執(zhí)行文件的大小

          共 4432字,需瀏覽 9分鐘

           ·

          2024-07-20 21:33

          眾所周知,Golang 的編譯速度是非常之快的。在設(shè)計(jì) Go 時(shí),編譯速度是一個(gè)重要的考慮因素。但是,你是否關(guān)注過 Go 編譯代碼后生成的二進(jìn)制可執(zhí)行文件的大小?讓我們來看一個(gè)簡(jiǎn)單的 HTTP 服務(wù)的應(yīng)用示例:

          import (  
               "fmt"  
               "net/http"
           )  
           func main() {  
               // create a http server and create a handler hello, return hello world  
               http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {  
                   fmt.Fprintf(w, "Hello, World\n")  
               })  
               // listen to port 8080  
               err := http.ListenAndServe(":8080", nil)  
               if err != nil {  
                   return  
               }  
           }

          編譯后的大小為 6.5M。

          ?  binary-size git:(main) ? go build  -o server main.go                 
           ?  binary-size git:(main) ? ls -lh server 
           -rwxr-xr-x  1   staff   6.5M Jul  2 14:20 server

          現(xiàn)在,讓我們嘗試優(yōu)化上面應(yīng)用的大小。

          刪除調(diào)試信息

          默認(rèn)情況下,Go 編譯器會(huì)在編譯后的程序中包含符號(hào)表和調(diào)試信息。通常情況下,你可以在發(fā)布版本中移除這些調(diào)試信息,以減小二進(jìn)制文件的大小。

          ?  binary-size git:(main) ? go build -ldflags="-s -w" -o server main.go
           ?  binary-size git:(main) ? ls -lh server                              
           -rwxr-xr-x  1 hxzhouh  staff   4.5M Jul  2 14:30 server
          • -s:省略符號(hào)表和調(diào)試信息。
          • -w:省略 DWARFv3 調(diào)試信息。使用該選項(xiàng)時(shí),無法使用 gdb 進(jìn)行調(diào)試。大小從 6.5M 降至 4.5M,減少了約 30%。

          使用 UPX

          UPX[1] is an advanced executable file compressor. UPX will typically reduce the file size of programs and DLLs by around 50%-70%, thus reducing disk space, network load times, download times, and other distribution and storage costs.

          UPX 是一種先進(jìn)的可執(zhí)行文件壓縮器。UPX 通常能將程序和 DLL 文件的大小減少 50%-70%,從而減少磁盤空間、網(wǎng)絡(luò)加載時(shí)間、下載時(shí)間以及其他分發(fā)和存儲(chǔ)成本。

          在 Mac 上,你可以通過 brew 安裝 UPX。

          brew install upx

          僅使用 UPX 壓縮

          UPX 有很多參數(shù),其中最重要的是壓縮率,范圍從 1 到 13。讓我們看看僅使用 UPX 就能將二進(jìn)制文件大小縮小多少。

          ?  binary-size git:(main) ? go build -o server main.go && upx --brute server && ls -lh server 
           -rwxr-xr-x  1 hxzhouh  staff   3.9M Jul  2 14:38 server

          6.5M-> 3.9M 壓縮比約為 60%。

          UPX + 編譯器選項(xiàng)

          同時(shí)啟用 UPX 和 -ldflags="-s -w":

          ?  binary-size git:(main) ? go build -ldflags="-s -w"  -o server main.go && upx --brute server && ls -lh server 
           -rwxr-xr-x  1 hxzhouh  staff   1.4M Jul  2 14:40 server

          最后,我們得到的可執(zhí)行文件大小為 1.4M,而未經(jīng)壓縮的文件大小為 6.5M,節(jié)省了大約 80% 的空間。這對(duì)于大型應(yīng)用程序來說是相當(dāng)可觀的。

          How UPX Works

          壓縮后的程序與原始程序一樣,無需解壓縮即可正常運(yùn)行。這種壓縮方法稱為外殼壓縮,包括兩個(gè)部分:

          • 在程序開頭或其他適當(dāng)位置插入解壓縮代碼。
          • 壓縮程序的其余部分。

          執(zhí)行時(shí)還包括兩個(gè)部分:

          • 開始時(shí)插入的解壓縮代碼首先執(zhí)行,將原始程序解壓縮到內(nèi)存中。
          • 然后,執(zhí)行解壓縮后的程序。UPX 在執(zhí)行程序時(shí)引入了一個(gè)額外的解壓縮步驟,但這一時(shí)間幾乎可以忽略不計(jì)。

          如果對(duì)編譯大小沒有嚴(yán)格要求,可以選擇不使用 UPX 壓縮。一般來說,服務(wù)器端獨(dú)立后臺(tái)服務(wù)不需要壓縮大小。不過,如果是在 Raspberry Pi 等嵌入式設(shè)備上,還是值得一試。

          結(jié)論

          這個(gè)帖子[2] 有很多很有意思的答案:

          • 例如,在用 C 和 Go 實(shí)現(xiàn)相同功能時(shí),C 生成的可執(zhí)行文件大小是 Go 的 1/20(為什么?)

          • 使用 println 代替 fmt.Println,可以避免導(dǎo)入 fmt 軟件包,從而進(jìn)一步減小程序的大小。

          參考資料
          [1]

          UPX: https://upx.github.io/

          [2]

          how-to-reduce-go-compileed-file-size: https://stackoverflow.com/questions/3861634/how-to-reduce-go-compiled-file-size


          瀏覽 262
          1點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          1點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线免费视频亚洲 | 亚洲第一色 | 日本无码少妇内谢视频 | 内射蜜臀| 操逼超碰国产 |