C_and_CPP 板


LINE

由於工作性質的關係 我的程式會需要就是在不同函數間傳遞資料 但是這個資料是模擬封包傳遞,一個 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
23F:→ loveme00835: https://youtu.be/JfmTagWcqoE 10/28 22:32
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
29F:推 enthos: https://www.udemy.com/course/linuxrpc/ 今年8月買的課程 10/28 22:53
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
42F:→ nh60211as: https://wandbox.org/permlink/EMfu7QYm2KaIVzLW 10/29 18:25
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







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP