[分享] C++ shared pointer 的速度

看板C_and_CPP作者時間3年前 (2020/10/28 20:59), 編輯推噓9(9057)
留言66則, 12人參與, 3年前最新討論串1/1
由於工作性質的關係 我的程式會需要就是在不同函數間傳遞資料 但是這個資料是模擬封包傳遞,一個 struct 可能有 100~1000 KB 像是 Producer 會一直產生固定大小的 struct 然後讓 Consumer 去消化 -- 一開始,為了快速開發,就直接 pass by value 之後程式正確再改成 shared_ptr 沒想到一改 shared_ptr 之後整個程式執行時間直接變 1.5~2 倍 經過了一段嘗試後來才發現 原來因為用 shared_ptr 會導致一直 new/delete 其 overhead 遠大於直接複製 100 bytes 以上的資料 解決的方法是自己管理記憶體,也就是說要用 memory pool 於是就試著自己實做一個 shared_ptr + memory pool 才把執行時間壓到原本的 0.7 倍 -- 因為覺得這個過程還蠻有趣的 所以就把他寫成一篇文章紀錄下來了 也希望能出現願意討論的網友,看看有沒有可能出現更快、更簡單的作法 這邊是文章連結,裡面的內容有 1. 各種不同記憶體管理方法速度比較 2. 自己實做 shared_ptr+memory pool 3. 發現 2. 其實沒有比較快,直接把 std::shared_ptr 包裝起來就夠快了 https://ys-hayashi.me/series/smart-pointer-%E9%80%9F%E5%BA%A6/ // 嗯對,我就是想來增加網誌流量的,應該沒違反什麼版規吧(笑 // 裡面沒有廣告,反正放了也賺不了什麼錢(笑 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.160.48.93 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1603889982.A.9D4.html

10/28 21:15, 3年前 , 1F
這個...應該是 object pool 吧...?
10/28 21:15, 1F

10/28 21:20, 3年前 , 2F
封包實際在傳也不會傳指標阿
10/28 21:20, 2F

10/28 21:21, 3年前 , 3F
你知道 shared_ptr 是在 share 什麼東西嗎? 很明顯就
10/28 21:21, 3F

10/28 21:21, 3年前 , 4F
是理解錯才會這樣寫
10/28 21:21, 4F

10/28 21:23, 3年前 , 5F
我都不new,改用placement new,寫起來跟C有九成像
10/28 21:23, 5F

10/28 21:33, 3年前 , 6F
shared_ptr 是在 share ownership, 使用 shared_ptr
10/28 21:33, 6F

10/28 21:33, 3年前 , 7F
即是把這個概念給寫進程式碼裡, 依照你的描述, 物件
10/28 21:33, 7F

10/28 21:33, 3年前 , 8F
的 owner 應該是 pool 而不是 my_shared_ptr, 你程式
10/28 21:33, 8F

10/28 21:33, 3年前 , 9F
碼這樣寫就是設計錯誤. 用 raw pointer 就能 share d
10/28 21:33, 9F

10/28 21:33, 3年前 , 10F
ata 才不需要什麼 smart pointer. 只要有人跟你說 sh
10/28 21:33, 10F

10/28 21:33, 3年前 , 11F
ared_ptr 是用來 share data 那就是在亂寫
10/28 21:33, 11F

10/28 22:11, 3年前 , 12F
等等,我想一下
10/28 22:11, 12F

10/28 22:20, 3年前 , 13F
pool應該要own那些沒被my_shared_ptr own的object
10/28 22:20, 13F

10/28 22:21, 3年前 , 14F
但是如果用raw pointer,我要怎麼知道shared_ptr
10/28 22:21, 14F

10/28 22:21, 3年前 , 15F
不會再使用這個資料了?
10/28 22:21, 15F

10/28 22:22, 3年前 , 16F
如果沒有額外包一層的話,我就必須每次都allocate
10/28 22:22, 16F

10/28 22:23, 3年前 , 17F
新的資料,這是我想避免的事情
10/28 22:23, 17F

10/28 22:24, 3年前 , 18F
這就是你在設計的時候應該要考慮的問題, 而不是便宜
10/28 22:24, 18F

10/28 22:24, 3年前 , 19F
行事用 shared_ptr 然後才覺得慢想去改進它
10/28 22:24, 19F

10/28 22:25, 3年前 , 20F
不清楚實際使用情境, 所以我沒辦法幫你解答這個問題
10/28 22:25, 20F

10/28 22:27, 3年前 , 21F
對啊,所以我才在這邊看看有沒有人遇過類似的情境的
10/28 22:27, 21F

10/28 22:27, 3年前 , 22F
不然以我目前想到的方法,shared就是個堪用的解法
10/28 22:27, 22F

10/28 22:32, 3年前 , 23F

10/28 22:32, 3年前 , 24F
可以先看完這個影片再思考如何設計比較恰當
10/28 22:32, 24F

10/28 22:41, 3年前 , 25F
就像我前面打的, 你實際使用上是怎麼樣? my_shared_p
10/28 22:41, 25F

10/28 22:41, 3年前 , 26F
tr 會被什麼類別 own? 這些類別的關係是怎樣? my_sha
10/28 22:41, 26F

10/28 22:41, 3年前 , 27F
red_ptr 會在多少個執行緒裏使用? 沒寫清楚要怎麼給
10/28 22:41, 27F

10/28 22:41, 3年前 , 28F
你建議?
10/28 22:41, 28F

10/28 22:53, 3年前 , 29F
10/28 22:53, 29F

10/28 22:59, 3年前 , 30F
推推推
10/28 22:59, 30F

10/28 23:37, 3年前 , 31F
問一下樓上你覺得先上課了解RPC原理還是直接看thrift g
10/28 23:37, 31F

10/28 23:37, 3年前 , 32F
RPC那些手冊動手做比較有用呢
10/28 23:37, 32F

10/28 23:39, 3年前 , 33F
我現在是前者 我抱持的心態就是反正我只要在意摳你的哪
10/28 23:39, 33F

10/28 23:39, 3年前 , 34F
個函式名稱要對上名字而已,這樣還要花錢嗎
10/28 23:39, 34F

10/28 23:39, 3年前 , 35F
更正 我是後者
10/28 23:39, 35F

10/29 00:16, 3年前 , 36F
這樣對我未來職涯走大型主從式架構設計有幫助嗎?
10/29 00:16, 36F

10/29 00:24, 3年前 , 37F
因為....thrift的手冊非常難啃...
10/29 00:24, 37F

10/29 14:39, 3年前 , 38F
其實這滿奇怪的,因為據我所知目前的shared_ptr他有
10/29 14:39, 38F

10/29 14:39, 3年前 , 39F
用replacement new/delete用類似memory pool的方式操作
10/29 14:39, 39F

10/29 14:40, 3年前 , 40F
除非我記錯了... 晚點看看C++17 STL實作先
10/29 14:40, 40F

10/29 14:41, 3年前 , 41F
因為這個要做pool太簡單了 大小是固定的....
10/29 14:41, 41F

10/29 18:25, 3年前 , 42F

10/29 18:26, 3年前 , 43F
move(unique_ptr)之後存取unique_ptr好像是未定義行為
10/29 18:26, 43F

10/29 18:27, 3年前 , 44F
阿抱歉當我沒說
10/29 18:27, 44F

10/29 21:22, 3年前 , 45F
你文章在解的問題其實跟smart pointer沒什麼關係啦XD
10/29 21:22, 45F

10/29 21:26, 3年前 , 46F
而且二樓的f大提到重點 你要做的是模擬封包傳遞的話
10/29 21:26, 46F

10/29 21:26, 3年前 , 47F
丟指標其實是一個完全失真的做法
10/29 21:26, 47F

10/30 15:06, 3年前 , 48F
拜託去弄一本Effective Modern C++來看
10/30 15:06, 48F

10/30 15:08, 3年前 , 49F
我讀過啦 還不是被嗆爆
10/30 15:08, 49F

10/30 16:06, 3年前 , 50F
幹 讀過跟讀懂是兩回事
10/30 16:06, 50F

10/30 18:48, 3年前 , 51F
抱歉
10/30 18:48, 51F

10/31 11:53, 3年前 , 52F
我也讀過啊 XD
10/31 11:53, 52F

10/31 11:54, 3年前 , 53F
請問傳pointer會造成失真的理由是什麼呢,是執行速
10/31 11:54, 53F

10/31 11:54, 3年前 , 54F
度嗎
10/31 11:54, 54F

10/31 12:57, 3年前 , 55F
打個比方: 你想模擬寄包裹, 但這模擬卻只寄了掛號號碼過去
10/31 12:57, 55F

10/31 15:40, 3年前 , 56F
對 你在做的事相當於 告訴對方你的東西放你家的哪裡
10/31 15:40, 56F

10/31 15:41, 3年前 , 57F
然後期待對方在他家裡的同一個地方找到一模一樣的東西
10/31 15:41, 57F

10/31 15:45, 3年前 , 58F
你現在可以work只是因為 這兩人其實是住在同一間屋子
10/31 15:45, 58F

10/31 15:47, 3年前 , 59F
用CS的話來講 就是thread間的memory space有一致性
10/31 15:47, 59F

10/31 15:50, 3年前 , 60F
而這個一致性其實是一個很強的條件 不用到兩台機器
10/31 15:50, 60F

10/31 15:51, 3年前 , 61F
光同一台機器兩個不同process就不會有這個條件了
10/31 15:51, 61F

10/31 15:53, 3年前 , 62F
另外 十萬台法拉利跟十萬顆螺絲的運送成本很明顯不同
10/31 15:53, 62F

10/31 15:55, 3年前 , 63F
但是因為你這邊都改用小紙條(指標)在傳遞了
10/31 15:55, 63F

10/31 15:56, 3年前 , 64F
這兩個case的傳輸成本就會從差很大變成相當接近
10/31 15:56, 64F

11/01 04:43, 3年前 , 65F
建議可以讀個 Linear logic (Linear types)?
11/01 04:43, 65F

11/01 04:43, 3年前 , 66F
把你要做的事情都探討完了
11/01 04:43, 66F
文章代碼(AID): #1VcMi-dK (C_and_CPP)