日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

3天內(nèi)不再提示

只改變一個字符使Go程序提速42%

馬哥Linux運維 ? 來源:量子位 ? 作者:量子位 ? 2022-11-24 15:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Go語言本來就以輕量快速著稱,一位GitHub員工卻偶然發(fā)現(xiàn):

只改變一個字符的位置,能把一段代碼運行速度提高足足42%。

e60973ee-6b35-11ed-8abf-dac502259ad0.png

簡直就像是……

e61cb9cc-6b35-11ed-8abf-dac502259ad0.png

這個簡單有效的技巧一經(jīng)發(fā)布,就引來眾多程序員圍觀。

原作者自己也調(diào)侃,一般這種情況都是事先犯了個愚蠢的錯誤,后面才能提升這么大。

不過順著這個思路發(fā)現(xiàn)有人發(fā)現(xiàn),就連Go開發(fā)團隊的核心人物Russ Cox都在標準庫中犯過同樣的錯誤。

e62da426-6b35-11ed-8abf-dac502259ad0.png

什么樣的錯誤?

發(fā)現(xiàn)這個問題的Harry在大型程序員交友平臺GitHub工作。

他在開發(fā)一個把GitHub倉庫中每個文件的所有者列出來的小工具。

功能很簡單,就是根據(jù)CODEOWNERS文件中定義的規(guī)則匹配,寫在越下面的規(guī)則優(yōu)先級越高。

e6596aac-6b35-11ed-8abf-dac502259ad0.png

原理也很簡單,就是從后往前一條一條處理,匹配到了就停止。

e66c4546-6b35-11ed-8abf-dac502259ad0.png

但就是這樣一個簡單的程序卻出現(xiàn)了性能問題,處理中等大小的倉庫就很慢了。

e6894498-6b35-11ed-8abf-dac502259ad0.png

他打印出火焰圖,發(fā)現(xiàn)大部分時間都花在了Go語言的正則表達式引擎中。

另外在內(nèi)存動態(tài)分配malloc和垃圾回收gc上面的花費也值得注意。

e69a928e-6b35-11ed-8abf-dac502259ad0.png

要減少malloc的時間,就需要用到Go語言的逃逸分析(Escape Analysis)了。

簡單來說,就是盡量把變量分配到棧上,讓編譯器自動管理內(nèi)存的釋放。

只有在“逃逸”也就是變量的作用域超出所在的棧時,才把變量分配到堆上,減輕運行時GC的壓力。

在這次的程序中,Harry確定了逃逸的變量是rule這個結(jié)構(gòu)體(struct)。

e6ad0fcc-6b35-11ed-8abf-dac502259ad0.png

但問題是,rule存儲在RuleSet這個切片(slice)里,按Go語言的規(guī)則可以確信他已經(jīng)在堆中了。

再分析一下代碼,發(fā)現(xiàn)在給rule賦值的時候?qū)嶋H上是做了一次不必要的拷貝,后面用“&”取地址時候創(chuàng)建了一個逃逸的指針指向它的副本。

e6c1220a-6b35-11ed-8abf-dac502259ad0.png

最后解決辦法也很容易想出,只需要把&移動到上面。

e6d2be98-6b35-11ed-8abf-dac502259ad0.png

這樣就引用了切片中的結(jié)構(gòu)體,避免了拷貝。

如何徹底避免?

在熱議中,有網(wǎng)友分享了自己是怎么避免出現(xiàn)這個問題的。

對于每個結(jié)構(gòu)體,把它看作純值或純指針,壓根就不去使用&這種取地址的操作,避免隱式的內(nèi)存分配。

e6f17946-6b35-11ed-8abf-dac502259ad0.png

如果你想要深入理解這個問題,也有人貼心的給出了需要提前了解的一些背景知識。

e705e700-6b35-11ed-8abf-dac502259ad0.png

最后有人指出,Rust語言為避免這個問題,直接規(guī)定必須顯式操作才能拷貝一個數(shù)據(jù)結(jié)構(gòu)。

e719c388-6b35-11ed-8abf-dac502259ad0.png

當你不習慣的時候這規(guī)定煩得要命,但是總的來看還是值得。

方便or規(guī)范,你更傾向于哪種做法?

審核編輯 :李倩

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

    關(guān)注

    30

    文章

    4977

    瀏覽量

    74426
  • go語言
    +關(guān)注

    關(guān)注

    1

    文章

    161

    瀏覽量

    9856

原文標題:只改變一個字符使 Go 程序提速 42%

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    MIMXRT1189奇數(shù)長度UDP數(shù)據(jù)包的最后一個字節(jié)出現(xiàn)問題,為什么?如何解決?

    我遇到了問題,即奇數(shù)長度 UDP 數(shù)據(jù)包的最后一個字節(jié)無法通過線路正確發(fā)送。最后一個字節(jié)似乎是未初始化或過時的數(shù)據(jù)。如果我將 UDP 數(shù)據(jù)包填充到偶數(shù)長度(2 字節(jié)綁定),則數(shù)據(jù)始
    發(fā)表于 04-17 07:47

    求助 LabVIEW 字符串比較

    請教大神 ,用一個字符串和多個字符串比較程序應(yīng)該怎么做。 比如:A字符串和B字符串組(B組字符
    發(fā)表于 03-02 17:24

    keil定義fputc函數(shù)

    中統(tǒng)調(diào)用。 // 設(shè)備文件寫入一個字符 static int fputc_dev(int c,FILE * stream) { const libc_device_file *dev
    發(fā)表于 01-22 08:25

    單片機中的串口通訊串行同步通信與串行異步通信

    就保證了起始位開始處定會有下跳沿,由此就可以標志一個字符傳輸?shù)钠鹗?。而根?jù)起始位和停止位也就很容易的實現(xiàn)了字符的界定和同步。 顯然
    發(fā)表于 01-15 08:06

    串口超時中斷的原理與特點

    超時中斷 (Timeout Interrupt - RTO, Receiver Timeout) 觸發(fā)條件: 當最后次成功接收到一個字符后(RXNE 事件后),在預(yù)設(shè)的超時時間內(nèi)沒有接收
    發(fā)表于 11-17 07:42

    飛凌嵌入式ElfBoard-標準IO接口之格式化輸入

    字符,格式說明符除外(%):任何不是空格字符(空白、換行符或制表符)或格式說明符(以%字符開頭)的字符都會導致函數(shù)從流中讀取下一個字符,將其
    發(fā)表于 11-12 08:35

    C語言的printf基本用法介紹

    十進制形式輸出整數(shù)。除了 %d,printf 支持更多的格式控制,例如: %c:輸出一個字符。c 是 character 的簡寫。 %s:輸出一個字符串。s 是 string 的
    發(fā)表于 11-12 07:04

    原廠 FZH173是點陣式液晶顯示驅(qū)動電路 LCD驅(qū)動

    驅(qū)動且需要低功耗的便攜式產(chǎn)品。FZH173LCD驅(qū)動器由17公共信號驅(qū)動器和80段信號驅(qū)動器組成。最大顯示RAM大小可以是1行中的80個字符,在雙行顯示中為40個字符。單個最多可以
    發(fā)表于 10-31 14:42

    RISC-V的工具鏈GCC內(nèi)聯(lián)匯編

    ;;\"作為分隔符,沒有添加分隔符的兩個字符串會被合并成為一個字符串?!皡R編指令列表”的編寫語法和普通的匯編程編寫是樣的。 4.\"輸入操作數(shù)\",用來指定當前內(nèi)聯(lián)匯編程序的輸入
    發(fā)表于 10-30 06:59

    E203串口中斷使用總結(jié)

    () 開始重組數(shù)據(jù)。在這里,筆者假設(shè)通信不會丟包或者數(shù)據(jù)出錯,因此不設(shè)置通信協(xié)議,規(guī)定了數(shù)據(jù)包的大小。main() 中的代碼如下圖: 當上位機用串口傳數(shù)據(jù)時,會先從低位開始一個一個字符地傳,因此在接受
    發(fā)表于 10-22 07:34

    電子加工企業(yè)必看!AI 視覺檢測讓馬達保護器良率飆升,成本驟降!

    在電子加工行業(yè),馬達保護器是設(shè)備安全的 “守門人”—— 表面哪怕藏著毫米級臟污、少一個字符,都可能導致終端產(chǎn)品故障,輕則返工賠錢,重則丟客戶、壞口碑。但現(xiàn)在,90% 的企業(yè)還在靠人工檢測:質(zhì)檢員盯著
    的頭像 發(fā)表于 10-16 14:23 ?434次閱讀

    rt thread 按照官方視頻一個字一個字敲都不行,連main函數(shù)都無法進入,為什么?

    編譯工具鏈) 需求很簡單,使led燈500ms閃爍。在不用rt thread的前提下是可以用到,目前為止例子都沒跑出來,但是是對照官方視頻敲都代碼,官方不是也說了支持armgcc的嗎? 看
    發(fā)表于 09-28 07:43

    文讀懂:CWDM和DWDM的核心差異

    光纖通信里的“兩兄弟”CWDM和DWDM,名字只差一個字母,差別可大了去!今天文講透核心差異,小易幫你快速分清~
    的頭像 發(fā)表于 09-17 18:19 ?1467次閱讀
    <b class='flag-5'>一</b>文讀懂:CWDM和DWDM的核心差異

    求助,關(guān)于STM32F030的iic主收問題求解

    我現(xiàn)在用stm32f030,在IIC的主模式下,想在收到一個字節(jié)數(shù)據(jù)后就回NACK和stop,但是現(xiàn)在實際情況是,我在接收到一個字節(jié)后進入接收中斷再使能STOP,看波形是收到這個字節(jié)后
    發(fā)表于 06-24 07:54

    常用通信接口(串口、RS232、RS485、USB、TYPE-C原理與區(qū)別)

    、什么是串口通信?常見的串口通信般是指異步串行通信。與串行通信相對的是并行通信。數(shù)據(jù)傳輸般都是以字節(jié)傳輸?shù)模?b class='flag-5'>一個字節(jié)8位。拿
    的頭像 發(fā)表于 05-29 15:44 ?4538次閱讀
    常用通信接口<b class='flag-5'>一</b>(串口、RS232、RS485、USB、TYPE-C原理與區(qū)別)
    肇东市| 东莞市| 连州市| 津南区| 阿鲁科尔沁旗| 来安县| 板桥市| 阜新| 桑日县| 宜兰县| 闽侯县| 临汾市| 台东县| 弋阳县| 雷州市| 靖边县| 沙洋县| 康定县| 蒲江县| 苏州市| 夏河县| 张家界市| 南和县| 康保县| 江达县| 都昌县| 望城县| 肥乡县| 惠来县| 绥滨县| 航空| 县级市| 盐津县| 西藏| 阳曲县| 克拉玛依市| 上蔡县| 进贤县| 开阳县| 鹤山市| 陵川县|