為什麼有很多出名開源的C C 方面的高效能網路庫,比如libevent,boost asio,有些企業還要自己寫?

時間 2021-05-06 18:37:23

1樓:wenmingc

不用這些庫,但是會用到其他的開源,我的感受是不要自己寫,第一是測試的問題,開發人員很難做到覆蓋面很大的測試,質量是很難保證的,很多的優化,其實是去掉了錯誤處理的部分,後期的維護成本非常高,自己寫有的時候是因為沒有弄清楚庫本身的真實用法,其實大多數業務場景主流的庫已經覆蓋了,要改的時候需要先考慮是不是實現不合理,公司喜歡自己造輪子有時候是開發人員主導的,都用別人的東西顯得自己沒價值,業務層面上可替代性更強,開發人員希望自己被重視,決策層很多也不知道是否有必要重寫

2樓:ithewei

自己造的輪子更加靈活,易於維護,當然穩定性是需要長期沉澱下來的,比如我們公司就是自己造的網路庫輪子,比libevent介面更加簡單好用,而且提供了完善的http功能模組,現在開源https://

3樓:Irons Du

我不知道以前asio如何。但就現在來看,用asio吧。我覺得是目前開源裡做得最棒的了。

優點嘛1. 跨平台(有人說跨平台是偽需求,真的麼?我不認為,至少使用者有選擇的餘地)

2. 你見過還有哪個開源庫支援了co_await的?

4樓:Nov 23

這種開源網路庫要考慮到通用性等問題,有些地方沒法進行封裝,還有些多餘的功能,不能完全匹配自己的業務做到100%效能的發揮。

1.網路庫做到了資料接收,但是無法封裝協議的解析,因為不同的組織可能用不同的協議格式。但是我們到了某個公司某個部門,我們已經有了規定的協議格式,或者說多種協議格式需要我們的庫去支援,這個東西叫做編譯碼,我們可以把編譯碼也封裝起來放到自己的網路庫裡面,方便使用。

2.資料解析完成後,其實還有很多任務作,比如乙個完整的資料報封裝成乙個task給執行緒池或者協程去處理,這個過程也是網路庫沒有的功能,公司可以根據自己的業務去確定用多執行緒池模型還是協程處理,把這部分進行封裝,讓寫業務的人透明的使用。等等

5樓:皮皮關

簡單來說,有幾方面原因:

1、首先是需求問題,這些庫解決不了那些企業的實際需求,或者庫功能太多增加心智負擔;

2、在專案預研的時候沒有發現這些網路庫,然後自己的網路庫已經一步一步做出來了,更換代價很大;

3、有些企業的技術負責人認為自己寫的才具有可控性,其他的不好調優,而且重構麻煩,所以還不如自己擼一套出來。

實際專案中不採用已有庫的情況並不少見,相反很常見——

不成熟的庫就不說了,有缺陷的庫不如自己重寫。

成熟的庫往往特別大,學習成本賊高;而且好不容易會用了,還可能在使用時踩坑。

特別是題主提到的這些網路庫,已經不僅僅是網路庫了,而是對於整個伺服器架構提出了較為完整的解決方案,這時很多人就會覺得「這個設計不如自己的意」,而不想去學習、使用了。

以上說明中除了有一些客觀的道理,可能也包含了主觀上「別人整出來的複雜東西,不想學」這種心態。說實話,技術選型肯定會包含人的偏好因素,而且有時候自己到底怎麼想的,自己也不清楚 :)

6樓:unknownuser

有人想引起關注、出名。有人認為自己比絕大多數人聰明NB。有人沒有敬畏之心,不知道水有多深。有人就是有時間閒得難受。有的人不懂得如何協作。

7樓:小周周的爸爸

結論:可以使用。

這個使用區分不同場景,不同公司。

通常以下兩個指標來衡量

通用性,效能。

一般來說開源專案

通用性:99分

效能:90分

自主研發

通用性:80分

效能:95分

這樣,大廠在大業務的場景下,因為海量請求和資料處理,為節約成本會逐漸過渡到自主研發。其中節約4%的成本已經是遠遠大於研發成本!

而中小廠,或者大廠的非流量大的業務基本就採用開源。

這種選擇,是基於成本的核算。

8樓:

最近幾年爆出了很多安全漏洞,比如「心臟出血」「幽靈熔斷」等等等

乙個庫(產品),使用的人多,那麼就會有人去專門研究,那麼,問題就會暴露出來並修復

自己寫庫,最大的問題就是裡面埋著的bug,這些bug可能永遠也暴不出來,但是,哪一天一旦暴露出來,那就,哈哈了

真的需要那麼高的效率? 我看,未必……

但是,無論是哪個專案,都需要極高的穩定性以及安全性

值得注意的是,不要迷信沒有bug,就算基礎庫,編譯器,虛擬機器裡面有bug也不是什麼新鮮事了(老手估計都碰上好幾次了吧,哈哈)。至於說自己寫庫容易改bug?改bug最重要的是發現bug,自己寫的庫能有幾個審核?

所以,我是極端反感效率優先的,因為根據我的工作經驗,效率優先往往會造成功能受限並隱藏很多高階bug。世界上最賺錢的軟體專案以及使用最廣泛的軟體專案,其實效率都不是最優的……以上

9樓:

跟公司或者團隊實力有關,有實力有精力或者有歷史包袱的公司或團隊用自己或者寫自己的庫無可厚非,再通用的庫也有不適用的場合,小團隊或者個人開發,或者時間要求緊的專案用開源庫也非常正確,技術始終是為業務需求服務的,脫離需求,純玩技術早晚把自己玩死。水平根本不行,但嘴上牛的不得了的人到處都是。用開源庫省下時間給更關鍵的開發才是明智的選擇。

10樓:原子筆

客戶端可用。服務端用起來就有點麻煩。

最關鍵的是,你得嵌入別人的訊息迴圈,或者把別人的訊息迴圈納入自己的訊息迴圈。這2個工作都很容易讓人很毛躁。。忍不住自己擼一把就搞定了:

畢竟就是個網路庫而已(但是確實得熟手才能繞開各種坑)。

11樓:雪球

libevent的層次很低,封裝了select、poll、epoll等很底層的API,所以可想而知用libevent實際開發時還有不少額外的工作要做,所以一般公司選擇再封裝一層或者完全自己寫。

12樓:ggffss

網路庫的話短小精悍

比如做遊戲就只要TCP or UDP。

能夠多執行緒+非同步+有協程支援就最好了。

其他的一堆功能都不需要啊。。。。http http2 什麼的都不需要。。。。。

同理要做WebServer 什麼的就需要 tcp,http,http2,websocket,SSL 支援等等

總之大而全不如小而精。

13樓:側衛槍騎兵

乙個支援TCP、UDP、ICMP等網路協議,還有串列埠IO、UNIX Domain Sockets……的網路庫,而且還跨平台,在實現上就是完成這些目標的基礎上盡量提高效能,這和從設計目標就是最大化效能的網路庫從取捨上就有本質不同。當然是否真的優於asio和libevent需要測試反饋證明。更重要的是可維護性,如果沒有完全吃透就用在專案中,出了問題Hold不住是不行的。

14樓:

乙個通用庫的效能很大程度上取決於這個庫有多通用。越是通用的設計,需要兼顧的特性就越多,效能就會越差。

舉個例子:同樣是分配記憶體,OS提供的malloc肯定比不過自己寫的物件管理器。這不是因為寫OS的程式設計師水平差,而是自己寫的管理器可以額外規定:

不支援多執行緒,每個物件佔一樣大的空間,可以根據伺服器記憶體預分配,可以要求物件大小四位元組對齊。。。這些約定通用的malloc乙個都不能有

15樓:冒泡

簡單說,原因就是這些庫還不夠滿足需求

我覺得能被樓主提名的庫,的確很著名,然而著名不代表「強」,而是代表「適用範圍廣」,為了適應各種場景,乙個專案可能往兩方面走,要麼做得很精簡,很單一,讓別人拿去拼裝,這樣做出的東西不見得就好用,要麼就是把很多功能都整合起來,做得比較全,但要想兼顧各方面,效能等方面就得付出點代價了,就像其它答案提到這,要說這些庫有名開源沒錯,但高效能可不見得,大體上講「好用」也還過得去,但「很好用」也真不見得

舉個現在我周邊的例子吧,我是做雲儲存的,目前專案主攻redis,就是屬於樓主說的很著名的軟體一類,然而redis也有很多蛋疼的地方,比如全記憶體的成本問題,比如運維擴充套件性的問題,比如私有記憶體會因程式崩潰而丟資料的危險性,比如落地方式和全量同步的粗暴,比如aof資訊的原始。。。綜合看來自己做一套反而是成本最低的辦法了

如果你自己拿個工具做小東西可能是感覺不到的,不妨也做一些開源的元件或框架來推薦給同事或好友使用,讓他們給你提意見,對這方面的問題估計就能有很深的了解了

16樓:毛自豪

對於用過enet,udt,zmq,libevent,以及自己研究過一點點基於udp穩定傳輸的我來說,其實用什麼庫不重要,重要的是自己的需求和面臨的網路環境。

17樓:徐波

C++的樂趣和精粹就在於高可定製性

需求都是不一樣的, C++能滿足你定製的要求

第三方網路庫確實好, 但那是通用網路庫, 對於某些特有領域的優化未必做的有自己好

18樓:白起

有人熟悉這些庫的使用,就會引進來用。

有人不熟悉,而且自己會寫,就自己寫。

所以,答題者明顯分成了兩派。

像我這種既不熟悉這些開源庫、又不會自己寫的,你讓我用什麼?

19樓:Name5566

不同的環境有不同的需求,一些開源網路庫在某些情況下使用很好,但是有些情況下就沒有那麼理想。像libevent,其為乙個跨平台網路庫,其bufferevent介面封裝很嚴實,使用起來很簡單,但一旦你有更多的需求,它就顯得不太方便,且很難做到高效。如果你拋棄bufferevent介面來用更底層的event和event base介面也是可以的,但這意味著windows上執行效率低,當然你可以做一系列工作來解決問題,但是這不一定比你從系統api上做來的更舒服和高效。

20樓:鄒佳慶

Libevent 這種庫的穩定性是經過千錘百鍊出來的,不是實力問題,比如 Google Chrome 就使用了 Libevent,難道 Google 沒有能力自己封裝乙個網路庫嗎?這是通用性解決方案,穩定可靠是最重要。

比如效能你很看重,100是滿分,那麼 libevent 可能是 93 分,自己優化的可能性能達到了 95 的高分。

但是從穩定上來說 libevent 的穩定性打分是 98 分,你自己寫的東西可能只有不到 80 分。

我推薦使用 libevent / libev / boost::asio 等成熟的網路庫,無後顧之憂才是最好的。

21樓:徐辰

我的觀點是,用開源第三方的庫,唯一的原因只能是成本,而不能是能力問題。

我自己的經歷證明,除掉一些特例(比如Linux核心之類),只要你在專案中使用了你自己沒能力寫出來的庫,出問題只是早晚的事。

反觀成本,乙個像libevent或者Boost.ASIO這樣規模的庫,從無到有整個實現一遍未必比你從頭到尾去完整理解它們更麻煩。

為什麼今年lolita很多出打歌服的,有什麼原因嗎?

語言默 為了能在市場活下去 有些是新店家上來就是打歌服多半是衝著賺錢 但是有些老店是因為今年市場不景氣打歌服這麼火也是一根救命稻草我認為沒有必要指責不好看就不買 而且今年下半年情況明顯好轉 lo的水平大大提高 站務無碼 今年格裙好賣,應該有聽說過溫柔一刀賣幾萬條上熱搜這種事吧,lo圈今年太涼,需要蹭...

為什麼有很多大品牌那麼出名還要打廣告?

策劃鼠 回答這個問題,我們回到廣告根源來看,廣告的本質是傳播,傳播的本質是宣傳,宣傳重重複,唯有重複,才能形成認知,唯有重複才能形成品牌資產,唯有重複才能形成自動條件反射。比如中午12點時,肚子自然而然咕咕叫 看到紅綠燈不自覺停下來 聽到小蘋果歌曲,莫名其妙哼起來,這些都是重複的結果。腦白金創始人史...

為什麼現在很多出了有一段時間的遊戲寧願花大量的活動來吸引新玩家也不願意去花功夫來留住或者喚回老玩家?

SiriusMiller 只要是遊戲就不可避免的要面臨玩家流失的問題。大部分你感覺有不錯玩家基礎的遊戲,都還在他自己的生命的前期,使用者以新進使用者為主。你覺得這遊戲不行了,玩家已經流失的差不多了那種,才是以老玩家為核心的。業內標準月留存都是個位數的百分比。也就是說,乙個月之後留存的玩家,不足新進人...