[分享]网络编程中的小技巧,STL中map与hash_map的选择,该怎么解决
[分享]网络编程中的小技巧,STL中map与hash_map的选择
因为自己有份大华网络库的代码,这个库自己用的很熟,因为这个库进行过大量的测试.(千兆流量,连接数3000左右,多年的产品运营)。
现在换了个公司,比较空闲,一直想自己做个网络库,从底层开始,所以想到了对这个库的优化和精简。
这个库的目标是:只是所有平台,WINDOW,LINUX,UCLINUX,所以选择的是SELECT模型。
简单发下服务的接口
这个网络库是采取heartbeat()驱动的方式,也就是这个库,底层没有涉及到任何的线程。上层应用通过自己开辟线程,然后调用这个对象的heartbeat就能够使得整个网络运转起来,所以如果你的服务器越好,线程支持多核越好,这个库工作能力也越强。
heartbeat()涉及到两个map,一个是连接管理map,另外一个是连接数据 hash_map<int, Queue_List*>
做了以下几件事:
1.检测是否有新连接,如果有,将连接加入连接管理map。
2.遍历map中已经连接的socket,看是否有读事件。如果有则找到对应has_map中的数据队列然后追加数据。
3.检测是否有写事件,有,则进行发送。
这里的两个map用的比较不错,由于heartbeat是驱动线程,在多核情况下,为了支撑起千兆流量,在短时间内,这个接口被调用上万次是十分正常的。 采用hash_map是针对服务器在内存富裕的情况下,充分的提高性能。
所以个人的观点时,在长跑线程中选择好容器是十分重要的。
可能许多人都知道map和hash_map的特点,但是具体用时可能会忽略,提一下,高手可以略过。
------解决方案--------------------
vc自带的hash_map效率低的要死,甚至不如map,只能和CMAP相当
------解决方案--------------------
没用过hash_map,没碰到过需要那么多连接的情况
------解决方案--------------------
如果不考虑map的有顺性, 那么建议使用boost.unorder_map, 效率自然不用说, 试试就知道.
------解决方案--------------------
够难 不会啊
------解决方案--------------------
stl 的hash_map,综合效率 不如map
------解决方案--------------------
支持~~
------解决方案--------------------
可否分享下大华网络库?
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
gold_water@163.com
------解决方案--------------------
342991688@qq.com
------解决方案--------------------
好贴,关注
因为自己有份大华网络库的代码,这个库自己用的很熟,因为这个库进行过大量的测试.(千兆流量,连接数3000左右,多年的产品运营)。
现在换了个公司,比较空闲,一直想自己做个网络库,从底层开始,所以想到了对这个库的优化和精简。
这个库的目标是:只是所有平台,WINDOW,LINUX,UCLINUX,所以选择的是SELECT模型。
简单发下服务的接口
- C/C++ code
class TPTCPServer : public ITPObject { public: TPTCPServer(ITPListener* tcpserverapp, int engineId = 0); TPTCPServer(int engineId, ITPListener* listener, CNewMutex* mutex); virtual ~TPTCPServer(); public: virtual int CloseClient(int id); virtual int Close(); virtual int Listen(char* ip, int port); virtual int Send(int id, char *pBuf, unsigned int iBufLen); //注意这个接口。 virtual int Heartbeat(); virtual Queue_List* GetSendQueue(int connId); virtual int SetMaxDataQueueLength(int maxDataQueueLength); protected: int sendInside(int id, char* pBuf, unsigned int iBufLen); int closeInside(); virtual int clearSendBuffer(); virtual int fillFds(int& maxfd, fd_set& readfds, fd_set& writefds); virtual int dealFDResult(int& fds,fd_set& readfds, fd_set& writefds,bool& fdsChange); protected: int _maxDataQueueLength; protected: void addPendingCloseClient(int id); int dealPendingCloseClients(); void pendingCloseClient(int id); std::deque<int> _pendingCloseClients; AX_Thread_Mutex _pendingCloseClientsMutex; };
这个网络库是采取heartbeat()驱动的方式,也就是这个库,底层没有涉及到任何的线程。上层应用通过自己开辟线程,然后调用这个对象的heartbeat就能够使得整个网络运转起来,所以如果你的服务器越好,线程支持多核越好,这个库工作能力也越强。
heartbeat()涉及到两个map,一个是连接管理map,另外一个是连接数据 hash_map<int, Queue_List*>
做了以下几件事:
1.检测是否有新连接,如果有,将连接加入连接管理map。
2.遍历map中已经连接的socket,看是否有读事件。如果有则找到对应has_map中的数据队列然后追加数据。
3.检测是否有写事件,有,则进行发送。
这里的两个map用的比较不错,由于heartbeat是驱动线程,在多核情况下,为了支撑起千兆流量,在短时间内,这个接口被调用上万次是十分正常的。 采用hash_map是针对服务器在内存富裕的情况下,充分的提高性能。
所以个人的观点时,在长跑线程中选择好容器是十分重要的。
可能许多人都知道map和hash_map的特点,但是具体用时可能会忽略,提一下,高手可以略过。
------解决方案--------------------
vc自带的hash_map效率低的要死,甚至不如map,只能和CMAP相当
------解决方案--------------------
没用过hash_map,没碰到过需要那么多连接的情况
------解决方案--------------------
如果不考虑map的有顺性, 那么建议使用boost.unorder_map, 效率自然不用说, 试试就知道.
------解决方案--------------------
够难 不会啊
------解决方案--------------------
stl 的hash_map,综合效率 不如map
------解决方案--------------------
支持~~
------解决方案--------------------
可否分享下大华网络库?
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
gold_water@163.com
------解决方案--------------------
342991688@qq.com
------解决方案--------------------
好贴,关注