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