是否需要对网络传输数据进行压缩?如何选择压缩算法?

版权所有。如需转载,请保留作者及出处信息:http://blog.csdn.net/jmppok/article/details/38121115


在网络网络传输过程中,最关心的就是传输效率问题。而提高传输效率最有效的方法就是对传输的数据进行压缩。但压缩数据也要耗费一定的时间,是不是压缩后一定能提高效率呢?该如何选择合适的压缩算法呢?请看本文的具体分析。


1.数据传输时间

假设数据大小为D (MB)

网络带宽为       N (MBps)  -------------注意这里是MBps,而不是通常说的Mbps,      1MBps = 10Mbps,       1000Mbps=100MBps.


那么数据传输时间T1 = D/N


2.压缩后的数据传输时间


假设压缩算法压缩率为 R     ------------------ 即压缩后数据大小为D*R

压缩速度为           Vc  MB/S

解压缩速度为       Vd MB/S


那么压缩后的数据传输时间 T2 =  D/Vc + D*R/N + D/Vd  = D/N * ( R + N/Vc + N/Vd)


3.分析

对比:

        T1 = D/N

        T2 = D/N*(R+N/Vc+N/vd)

发现:

        如果R + N/Vc + N/Vd < 1,则压缩后传输要更快,否则压缩后传输反而更慢。

        也就是压缩后传输能否更快是和压缩算法的 “压缩率”,“压缩/解压缩速度” 以及当前“带宽”相关

        压缩率越小,压缩/解压缩越快,带宽越小,压缩后传输越能提高效率。而在带宽不变得情况下,压缩率越小,压缩/解压缩越快 越好。

       而由于压缩率和压缩/解压缩速度成指数型反比(压缩率提高一点点,压缩/解压缩速度就大幅降低),所以在选用压缩算法时:

        最好选择压缩/解压缩速度快的算法,而不必太关注压缩率(当然也不能完全不压缩)


4.常用压缩算法对比

    这是来自网上一个常用压缩算法压缩比,压缩/解压缩速度对比图:

   

来源:http://blog.csdn.net/zhangskd/article/details/17009111

    压缩率R为 图中的 1/Ratio。

    那么带入到上面公式:

    LZ4:1/2.084 + N/422 + N/1820 = 0.48 + N*0.0029   也就是说在带宽N<179MBps的情况下,采用LZ4压缩能提高传输效率。

    zlib:1/3.099 + N/21 + N/300 =  0.32 + N*0.051          也就是说在带宽N<13.3Mbps的情况下,采用zlib压缩才能提高传输效率,如果带宽够高,就不要压缩了,否则会更慢


5.总结

  一般客户端访问服务器,需进行压缩。 (目前客户端到服务器的带宽还是比较低的)

  服务器间传输,可以不压缩,或者用LZ4压缩。 (服务器间的带宽一般是1000bps,即100MBps)


  在带宽 N<3.3MBps的情况下, 使用zlib要比LZ4更快。


 0-3.3MBps                       zlib压缩传输最快,lz4压缩传输次之,普通传输最慢

 3.3 - 13.3MBps               lz4压缩传输最快,zlib压缩传输次之,普通传输最慢

 13.3-179MBps                lz4压缩传输最快,普通传输次之,zlib压缩传输 反而更慢

  大于179MBps                普通传输就可以,因为网络传输速度 远远高于压缩及解压缩速度了


 

          


     

网络传输压缩算法是一种用于减少数据传输量的技术,它通过对数据进行编码和解码来实现。其中,哈夫曼编码是一种常用的网络传输压缩算法之一。 在C++中,可以使用哈夫曼编码来实现网络传输压缩算法。下面是一个简单的示例代码: ```cpp #include <iostream> #include <queue> #include <map> using namespace std; // 定义哈夫曼树节点结构 struct HuffmanTreeNode { int weight; // 结点的权重 char value; // 结点的值 HuffmanTreeNode* LChild; // 结点的左孩子 HuffmanTreeNode* RChild; // 结点的右孩子 }; // 定义比较函数,用于优先队列的排序 struct Compare { bool operator()(HuffmanTreeNode* a, HuffmanTreeNode* b) { return a->weight > b->weight; } }; // 构建哈夫曼树 HuffmanTreeNode* buildHuffmanTree(map<char, int>& frequency) { priority_queue<HuffmanTreeNode*, vector<HuffmanTreeNode*>, Compare> pq; // 将每个字符的频率作为权重,构建叶子节点 for (auto it = frequency.begin(); it != frequency.end(); ++it) { HuffmanTreeNode* node = new HuffmanTreeNode(); node->weight = it->second; node->value = it->first; node->LChild = nullptr; node->RChild = nullptr; pq.push(node); } // 构建哈夫曼树 while (pq.size() > 1) { HuffmanTreeNode* left = pq.top(); pq.pop(); HuffmanTreeNode* right = pq.top(); pq.pop(); HuffmanTreeNode* parent = new HuffmanTreeNode(); parent->weight = left->weight + right->weight; parent->value = '\0'; parent->LChild = left; parent->RChild = right; pq.push(parent); } return pq.top(); } // 生成哈夫曼编码 void generateHuffmanCode(HuffmanTreeNode* root, map<char, string>& huffmanCode, string code) { if (root == nullptr) { return; } if (root->LChild == nullptr && root->RChild == nullptr) { huffmanCode[root->value] = code; } generateHuffmanCode(root->LChild, huffmanCode, code + "0"); generateHuffmanCode(root->RChild, huffmanCode, code + "1"); } int main() { // 假设有一个字符串需要进行压缩 string input = "hello world"; // 统计每个字符的频率 map<char, int> frequency; for (char c : input) { frequency[c]++; } // 构建哈夫曼树 HuffmanTreeNode* root = buildHuffmanTree(frequency); // 生成哈夫曼编码 map<char, string> huffmanCode; generateHuffmanCode(root, huffmanCode, ""); // 输出每个字符的哈夫曼编码 for (auto it = huffmanCode.begin(); it != huffmanCode.end(); ++it) { cout << it->first << ": " << it->second << endl; } return 0; } ``` 这段代码演示了如何使用C++实现哈夫曼编码的生成过程。首先,统计输入字符串中每个字符的频率,然后根据频率构建哈夫曼树。接下来,通过遍历哈夫曼树,生成每个字符的哈夫曼编码。最后,输出每个字符对应的哈夫曼编码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值