作者johnjohnlin ()
看板C_and_CPP
標題[分享] C++ shared pointer 的速度
時間Wed Oct 28 20:59:37 2020
由於工作性質的關係
我的程式會需要就是在不同函數間傳遞資料
但是這個資料是模擬封包傳遞,一個 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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1603889982.A.9D4.html
1F:→ Lipraxde: 這個...應該是 object pool 吧...? 10/28 21:15
2F:→ firejox: 封包實際在傳也不會傳指標阿 10/28 21:20
3F:→ loveme00835: 你知道 shared_ptr 是在 share 什麼東西嗎? 很明顯就 10/28 21:21
4F:→ loveme00835: 是理解錯才會這樣寫 10/28 21:21
5F:→ nh60211as: 我都不new,改用placement new,寫起來跟C有九成像 10/28 21:23
6F:→ loveme00835: shared_ptr 是在 share ownership, 使用 shared_ptr 10/28 21:33
7F:→ loveme00835: 即是把這個概念給寫進程式碼裡, 依照你的描述, 物件 10/28 21:33
8F:→ loveme00835: 的 owner 應該是 pool 而不是 my_shared_ptr, 你程式 10/28 21:33
9F:→ loveme00835: 碼這樣寫就是設計錯誤. 用 raw pointer 就能 share d 10/28 21:33
10F:→ loveme00835: ata 才不需要什麼 smart pointer. 只要有人跟你說 sh 10/28 21:33
11F:→ loveme00835: ared_ptr 是用來 share data 那就是在亂寫 10/28 21:33
12F:→ johnjohnlin: 等等,我想一下 10/28 22:11
13F:→ johnjohnlin: pool應該要own那些沒被my_shared_ptr own的object 10/28 22:20
14F:→ johnjohnlin: 但是如果用raw pointer,我要怎麼知道shared_ptr 10/28 22:21
15F:→ johnjohnlin: 不會再使用這個資料了? 10/28 22:21
16F:→ johnjohnlin: 如果沒有額外包一層的話,我就必須每次都allocate 10/28 22:22
17F:→ johnjohnlin: 新的資料,這是我想避免的事情 10/28 22:23
18F:→ loveme00835: 這就是你在設計的時候應該要考慮的問題, 而不是便宜 10/28 22:24
19F:→ loveme00835: 行事用 shared_ptr 然後才覺得慢想去改進它 10/28 22:24
20F:→ loveme00835: 不清楚實際使用情境, 所以我沒辦法幫你解答這個問題 10/28 22:25
21F:→ johnjohnlin: 對啊,所以我才在這邊看看有沒有人遇過類似的情境的 10/28 22:27
22F:→ johnjohnlin: 不然以我目前想到的方法,shared就是個堪用的解法 10/28 22:27
24F:→ loveme00835: 可以先看完這個影片再思考如何設計比較恰當 10/28 22:32
25F:→ loveme00835: 就像我前面打的, 你實際使用上是怎麼樣? my_shared_p 10/28 22:41
26F:→ loveme00835: tr 會被什麼類別 own? 這些類別的關係是怎樣? my_sha 10/28 22:41
27F:→ loveme00835: red_ptr 會在多少個執行緒裏使用? 沒寫清楚要怎麼給 10/28 22:41
28F:→ loveme00835: 你建議? 10/28 22:41
30F:推 ucrxzero: 推推推 10/28 22:59
31F:推 ucrxzero: 問一下樓上你覺得先上課了解RPC原理還是直接看thrift g 10/28 23:37
32F:→ ucrxzero: RPC那些手冊動手做比較有用呢 10/28 23:37
33F:→ ucrxzero: 我現在是前者 我抱持的心態就是反正我只要在意摳你的哪 10/28 23:39
34F:→ ucrxzero: 個函式名稱要對上名字而已,這樣還要花錢嗎 10/28 23:39
35F:→ ucrxzero: 更正 我是後者 10/28 23:39
36F:推 ucrxzero: 這樣對我未來職涯走大型主從式架構設計有幫助嗎? 10/29 00:16
37F:推 ucrxzero: 因為....thrift的手冊非常難啃... 10/29 00:24
38F:→ Killercat: 其實這滿奇怪的,因為據我所知目前的shared_ptr他有 10/29 14:39
39F:→ Killercat: 用replacement new/delete用類似memory pool的方式操作 10/29 14:39
40F:→ Killercat: 除非我記錯了... 晚點看看C++17 STL實作先 10/29 14:40
41F:→ Killercat: 因為這個要做pool太簡單了 大小是固定的.... 10/29 14:41
43F:→ nh60211as: move(unique_ptr)之後存取unique_ptr好像是未定義行為 10/29 18:26
44F:→ nh60211as: 阿抱歉當我沒說 10/29 18:27
45F:→ sarafciel: 你文章在解的問題其實跟smart pointer沒什麼關係啦XD 10/29 21:22
46F:→ sarafciel: 而且二樓的f大提到重點 你要做的是模擬封包傳遞的話 10/29 21:26
47F:→ sarafciel: 丟指標其實是一個完全失真的做法 10/29 21:26
48F:→ F04E: 拜託去弄一本Effective Modern C++來看 10/30 15:06
49F:推 ucrxzero: 我讀過啦 還不是被嗆爆 10/30 15:08
50F:→ F04E: 幹 讀過跟讀懂是兩回事 10/30 16:06
51F:推 ucrxzero: 抱歉 10/30 18:48
52F:→ johnjohnlin: 我也讀過啊 XD 10/31 11:53
53F:→ johnjohnlin: 請問傳pointer會造成失真的理由是什麼呢,是執行速 10/31 11:54
54F:→ johnjohnlin: 度嗎 10/31 11:54
55F:推 LPH66: 打個比方: 你想模擬寄包裹, 但這模擬卻只寄了掛號號碼過去 10/31 12:57
56F:→ sarafciel: 對 你在做的事相當於 告訴對方你的東西放你家的哪裡 10/31 15:40
57F:→ sarafciel: 然後期待對方在他家裡的同一個地方找到一模一樣的東西 10/31 15:41
58F:→ sarafciel: 你現在可以work只是因為 這兩人其實是住在同一間屋子 10/31 15:45
59F:→ sarafciel: 用CS的話來講 就是thread間的memory space有一致性 10/31 15:47
60F:→ sarafciel: 而這個一致性其實是一個很強的條件 不用到兩台機器 10/31 15:50
61F:→ sarafciel: 光同一台機器兩個不同process就不會有這個條件了 10/31 15:51
62F:→ sarafciel: 另外 十萬台法拉利跟十萬顆螺絲的運送成本很明顯不同 10/31 15:53
63F:→ sarafciel: 但是因為你這邊都改用小紙條(指標)在傳遞了 10/31 15:55
64F:→ sarafciel: 這兩個case的傳輸成本就會從差很大變成相當接近 10/31 15:56
65F:推 CoNsTaR: 建議可以讀個 Linear logic (Linear types)? 11/01 04:43
66F:→ CoNsTaR: 把你要做的事情都探討完了 11/01 04:43