[分享]网络编程中的小技巧,STL中map与hash_map的选择,该怎么解决

[分享]网络编程中的小技巧,STL中map与hash_map的选择
因为自己有份大华网络库的代码,这个库自己用的很熟,因为这个库进行过大量的测试.(千兆流量,连接数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
------解决方案--------------------
好贴,关注