成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

性能優(yōu)化-放開那片內(nèi)存,讓我來!

存儲 存儲軟件
當(dāng)你的程序中存在大量的內(nèi)存分配(例如C++頻繁使用string),那么可以考慮使用性能更好的內(nèi)存分配庫了。關(guān)于tcmalloc,jemalloc等內(nèi)存分配庫的對比有很多,這里有興趣的可自行了解。

[[358893]]

本文轉(zhuǎn)載自微信公眾號「編程珠璣」,作者守望先生。轉(zhuǎn)載本文請聯(lián)系編程珠璣公眾號。  

性能優(yōu)化是一個(gè)常有的事情,通常來說

  • 不要過早優(yōu)化-當(dāng)你沒有性能問題時(shí),不需要過早考慮優(yōu)化,當(dāng)然對于一些代價(jià)很小,收益卻很大的手段可以考慮做進(jìn)來,例如最常見的就是根據(jù)業(yè)務(wù)需求選擇合適的數(shù)據(jù)結(jié)構(gòu)。
  • 不要過度優(yōu)化。優(yōu)化都是有目標(biāo)的,比如你需要達(dá)到多少TPS,那么你按照這個(gè)目標(biāo)去優(yōu)化即可,有些優(yōu)化雖然能否提升性能,但可能對代碼的可維護(hù)性造成破壞。

本人對此沒有過多涉獵,僅分享工作中接觸到的一些內(nèi)存。

內(nèi)存性能問題

有很多方面會造成性能問題,例如:

  • 業(yè)務(wù)流程設(shè)計(jì)不合理,導(dǎo)致很多沒有必要的計(jì)算
  • 數(shù)據(jù)結(jié)構(gòu)選擇不合適
  • 緩存使用不當(dāng)

示例

假設(shè)你已經(jīng)通過《perf:一個(gè)命令發(fā)現(xiàn)性能問題》中的方法或者使用profiler分析,已經(jīng)發(fā)現(xiàn)內(nèi)存分配是性能瓶頸:

  1. // 來源:公眾號【編程珠璣】 
  2. // 作者:守望先生 
  3. // malloc.cc 
  4. #include <thread> 
  5. #include <vector> 
  6. #include <stdlib.h> 
  7. #include <string.h> 
  8. void GetMemory(){ 
  9.   for(int i = 0;i < 100000000; i++){ 
  10.     void *p = malloc(1024); 
  11.     if(NULL != p){ 
  12.       free(p); 
  13.       p = NULL
  14.     } 
  15.   } 
  16. int main(){ 
  17.   std::vector<std::thread> th; 
  18.   int nr_threads = 10; 
  19.   for (int i = 0; i < nr_threads; ++i) { 
  20.     th.push_back(std::thread(GetMemory)); 
  21.   } 
  22.   for(auto &t : th){ 
  23.     t.join(); 
  24.   } 
  25.   return 0; 

代碼非常簡單,僅僅是不斷分配內(nèi)存而已。

編譯并嘗試分配十億次:

  1. $ g++ -g -o malloc malloc.cc -lpthread 
  2. time ./malloc  
  3. real    0m8.677s 
  4. user    0m29.409s 
  5. sys    0m0.029s 

分配十億次內(nèi)存,使用時(shí)間大概17s左右。另外一個(gè)終端使用perf查看情況:

  1. $ perf top -p `pidof malloc` 
  2.   52.92%  libc-2.27.so  [.] cfree@GLIBC_2.2.5 
  3.   31.94%  libc-2.27.so  [.] malloc 
  4.    8.82%  malloc        [.] GetMemory 
  5.    3.45%  malloc        [.] free@plt 
  6.    2.51%  malloc        [.] malloc@plt 
  7.    0.03%  [kernel]      [k] prepare_exit_to_usermode 
  8.    0.01%  [kernel]      [k] psi_task_change 
  9.    0.01%  [kernel]      [k] native_irq_return_iret 
  10.    0.01%  [kernel]      [k] __update_load_avg_cfs_rq 
  11.    0.01%  [kernel]      [k] __update_load_avg_se 
  12.    0.01%  [kernel]      [k] update_curr 
  13.    0.01%  [kernel]      [k] native_write_msr 
  14.    0.01%  [kernel]      [k] __schedule 
  15.    0.01%  [kernel]      [k] native_read_msr 
  16.    0.01%  [kernel]      [k] read_tsc 
  17.    0.01%  [kernel]      [k] interrupt_entry 
  18.    0.01%  [kernel]      [k] update_load_avg 
  19.    0.01%  [kernel]      [k] swapgs_restore_regs_and_return_to_usermode 
  20.    0.01%  [kernel]      [k] reweight_entity 
  21.    0.01%  [kernel]      [k] switch_fpu_return 
  22.    0.01%  [kernel]      [k] perf_event_task_tick 

從結(jié)果可以看到,大部分CPU耗費(fèi)在了內(nèi)存的申請和釋放。

怎么辦呢?第一要考慮的做法不是如何提升它,而是它能否避免?比如內(nèi)存復(fù)用?而非反復(fù)申請?

比如使用內(nèi)存池?但是要自己寫一個(gè)穩(wěn)定的內(nèi)存池又需要耗費(fèi)很大的精力了。怎么辦呢?

性能更好的庫

實(shí)際上這就引出了性能優(yōu)化的一種常見方法-使用性能更好的庫。那么在內(nèi)存分配方面,有更好的庫嗎?自己又不能寫出一個(gè)比libc還厲害的庫,就只能用用開源的庫,才能維持得了寫代碼的生活。

目前常見的性能比較好的內(nèi)存分配庫有

  • tcmalloc-谷歌開發(fā)的內(nèi)存分配庫
  • jemalloc

在自己編譯使用redis的時(shí)候,其實(shí)你能看到它們的身影:

  1. # Backwards compatibility for selecting an allocator 
  2. ifeq ($(USE_TCMALLOC),yes) 
  3.     MALLOC=tcmalloc 
  4. endif 
  5.  
  6. ifeq ($(USE_TCMALLOC_MINIMAL),yes) 
  7.     MALLOC=tcmalloc_minimal 
  8. endif 
  9.  
  10. ifeq ($(USE_JEMALLOC),yes) 
  11.     MALLOC=jemalloc 
  12. endif 
  13.  
  14. ifeq ($(USE_JEMALLOC),no
  15.     MALLOC=libc 
  16. endif 

如何使用

這里以tcmalloc為例,看一下如何使用該庫替換libc中的malloc。tcmalloc使用了thread cache,小塊的內(nèi)存分配都可以從cache中分配。多線程分配內(nèi)存的情況下,可以減少鎖競爭。

獲取

你可以通過源碼編譯獲取,github地址:https://github.com/google/tcmalloc.git

不過它需要使用bazel進(jìn)行構(gòu)建編譯,有興趣的可以自行嘗試。

也可以直接安裝:

  1. $ apt-get install -y libtcmalloc-minimal4 

安裝位置查看:

  1. $ ldconfig -p | grep tcmalloc 
  2.     libtcmalloc_minimal_debug.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libtcmalloc_minimal_debug.so.4 
  3.     libtcmalloc_minimal.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4 
  4.     libtcmalloc_debug.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libtcmalloc_debug.so.4 
  5.     libtcmalloc_and_profiler.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libtcmalloc_and_profiler.so.4 
  6.     libtcmalloc.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4 

LD_PRELOAD

這種方式在自己測試的時(shí)候非常方便,只需要:

  1. $ export LD_PRELOAD=/path/to/tcmalloc.so 

導(dǎo)入環(huán)境變量,指定庫路徑即可。注意這里的/path/to更換成你的tcmalloc實(shí)際的路徑。運(yùn)行的時(shí)候,tcmalloc庫就會被首先被使用了。

直接鏈接

這種方法就和普通庫的使用沒有什么區(qū)別了,鏈接使用就完事了。相關(guān)文章《靜態(tài)庫的制作與使用》

效果

我們使用新的庫,再進(jìn)行10億次的內(nèi)存分配試試:

  1. time ./malloc 
  2. real    0m7.152s 
  3. user    0m27.997s 
  4. sys    0m0.032s 

可以看到要使用的時(shí)間少了些。當(dāng)然,這里的對比嚴(yán)格來說不是很嚴(yán)謹(jǐn),甚至可以說起不到對比的作用。首先這里內(nèi)存分配大小比較單一,并且僅有內(nèi)存分配,而沒有其他處理,真正是否有效果,還是要根據(jù)實(shí)際業(yè)務(wù)程序的情況來判斷。當(dāng)然,整體來說,tcmalloc的效果要比libc的malloc分配內(nèi)存要高效。

總結(jié)

當(dāng)你的程序中存在大量的內(nèi)存分配(例如C++頻繁使用string),那么可以考慮使用性能更好的內(nèi)存分配庫了。關(guān)于tcmalloc,jemalloc等內(nèi)存分配庫的對比有很多,這里有興趣的可自行了解。

作者:守望,linux應(yīng)用開發(fā)者,目前在公眾號【編程珠璣】?分享Linux/C/C++/數(shù)據(jù)結(jié)構(gòu)與算法/工具等原創(chuàng)技術(shù)文章和學(xué)習(xí)資源。

 

責(zé)任編輯:武曉燕 來源: 編程珠璣
相關(guān)推薦

2022-10-30 13:21:58

谷歌Chrome瀏覽器

2021-11-17 08:16:03

內(nèi)存控制Go

2011-05-11 17:26:17

Minify

2024-03-15 08:54:59

Linux內(nèi)核NUMA

2016-08-12 10:23:28

javascriptChrome前端

2019-03-14 15:38:19

ReactJavascript前端

2021-08-03 16:35:04

AndroidANR內(nèi)存

2015-09-16 15:21:23

Android性能優(yōu)化內(nèi)存

2016-12-22 17:21:11

Android性能優(yōu)化內(nèi)存泄漏

2017-12-14 14:32:30

.Net內(nèi)存代碼

2019-07-04 15:57:16

內(nèi)存頻率DDR4

2022-04-29 08:00:36

web3區(qū)塊鏈比特幣

2017-03-14 18:48:06

Android性能優(yōu)化內(nèi)存優(yōu)化

2023-03-27 07:39:07

內(nèi)存溢出優(yōu)化

2023-05-14 22:25:33

內(nèi)存CPU

2019-03-06 10:25:30

Web圖片優(yōu)化命令

2023-03-30 07:34:10

Linux性能數(shù)據(jù)結(jié)構(gòu)

2022-11-11 08:16:02

java性能技術(shù)

2017-11-27 14:58:01

MySQL高并發(fā)優(yōu)化性能調(diào)優(yōu)

2022-04-11 09:58:07

數(shù)據(jù)庫SQL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产午夜在线观看 | 美国黄色一级片 | 99re免费 | 欧美日韩一区二区三区视频 | 男女午夜激情视频 | 日本在线免费观看 | 中文字幕乱码一区二区三区 | 国产一区二区三区免费 | 亚洲精品久久久久久一区二区 | 国产精品极品美女在线观看免费 | 中国一级特黄视频 | 少妇无套高潮一二三区 | 欧美色性 | 日韩精品免费视频 | 亚洲国产一区二区视频 | 99视频在线 | 日本久久久一区二区三区 | 国产精品久久久久久久久动漫 | 久久不卡 | 欧美videosex性极品hd | 国产高清一区二区 | 日日爱视频 | 亚洲免费在线视频 | 91福利网| 国产精品久久久久久妇女6080 | 亚洲成人一区二区 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 国产在线精品一区二区三区 | 日韩在线一区二区三区 | 久久久美女| 久久久国产精品 | 四虎av电影 | 成人免费观看视频 | 久久久久亚洲精品国产 | 久久久av中文字幕 | 久久亚洲高清 | 午夜精品久久久久久久星辰影院 | 日本精品视频在线 | 免费美女网站 | 欧美综合久久 | 亚洲美乳中文字幕 |