C ++:通过tcp / ip在发送字节中使用向量的最佳方法

时间:2015-03-19 03:00:13

标签: c++ vector tcp

我有通过tcp / ip传输大数据的问题。要传输的字节向量的大小总是大约500000。 我有2个解决方案来解决这个问题,但我不知道什么是更好或有另一个解决方案。

对于2解决方案,我有2个类来存储数据。每个类有2个方法是:

  1. push(std::vector<BYTE_T& data>);
  2. vector<BYTE_T >pop();
  3. #define BYTE_T unsigned char

    方式1:使用vector<BYTE_T>

        class buffDdata1 {
          vector<BYTE_T> listData;
          vector<BYTE_T> listDataTmp;
    public:      
         buffDdata1 () {
            listData.reserver(500000);
            listDataTmp.reserver(500000);
         }
    void push(vector<BYTE_T>& data) {
         lock();
         listData.insert(listData.end(), data.begin(), data.end());
         unlock();
    }
    
    vector<BYTE_T>& pop() {
              lock();
              listDataTmp.clear();
              listDataTmp.swap(listData);
              unlock();
              return listDataTmp;
    }
    };
    

    方式2:使用vector

    vector
    class buffData2 {
    
          vector<vector <BYTE_T> > listData;
          int nCount;
    public:
          buffData2() {
               listData.reserver(200000);
          }
          void push(vector <BYTE_T>& data) {
               lock();
               listData.push_back(data);nCount++;
               unlock();
          }
          vector <BYTE_T> pop() {
               vector <BYTE_T> listRet;
               lock();
               for(int i=0; i< nCount; ++i) {
                    listRet.insert(listRet.end(), listData[i].begin(), listData[i].end());
               }
               unlock();
               return listRet;
          }
    };
    

1 个答案:

答案 0 :(得分:0)

方式1推送线程在保持锁定时附加数据(因此推送的字节数为O(N)),而方式2有O(1)推送但稍后更多的工作用于弹出线程(和整个锁定。)

哪个更好取决于你的工作性质 - 但它足够复杂,而且意义重大,你应该简单地用你的实际工作量进行分析。

还有其他选择 - 例如,特别是如果您的平均推送具有合理的大小(例如千字节或更多) - 您可以使用方式2并返回向量向量 - 让弹出代码依次发送而不花费时间将它们整合到更大的应用程序缓冲区中。无论如何,你的TCP实现将合并它们(如果你发送它们的速度足够快,例如Naggle算法不会不耐烦并发送当时可用的内容)。

另外,您不需要nCount - vector公开他们的size(),而listData.reserve(200000);似乎真的过分 - 而不是它可能很重要。