最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言實(shí)現(xiàn)短字符串壓縮的三種方法詳解

 更新時(shí)間:2022年08月10日 16:33:21   作者:T-BARBARIANS  
這篇文章主要和大家分享一下smaz,shoco,unisox2三種短字符串壓縮算法,并分別探索它們各自的壓縮率與壓縮和解壓縮性能,需要的可以參考一下

前言

上一篇探索了LZ4的壓縮和解壓性能,以及對(duì)LZ4和ZSTD的壓縮、解壓性能進(jìn)行了橫向?qū)Ρ取N哪┑淖詈笠步o了一個(gè)彩蛋:任意長(zhǎng)度的字符串都可以被ZSTD、LZ4之類(lèi)的壓縮算壓縮得很好嗎?

本篇我們就來(lái)一探究竟。

一、通用算法的短字符壓縮

開(kāi)門(mén)見(jiàn)山,我們使用一段比較短的文本:Narrator: It is raining today. So, Peppa and George cannot  play outside.Peppa: Daddy, it's stopped raining.

使用ZSTD與LZ4分別壓縮一下上面這段短文本。下面分別是它們的壓縮結(jié)果。

ZSTD:

LZ4:

對(duì)短文本的壓縮,zstd的壓縮率很低,lz4壓縮后的文本長(zhǎng)度盡然超過(guò)了原有字符串的長(zhǎng)度。這是為什么?說(shuō)實(shí)話(huà)在這之前我也沒(méi)想到。

引用兩位大佬的名言:

Are you ok?  

What's your problem?

二、短字符串壓縮

從上面的結(jié)果可以得知,任何壓縮算法都有它的使用場(chǎng)景,并不是所有長(zhǎng)度的字符串都適合被某種算法壓縮。一般原因是通用壓縮算法維護(hù)了被壓縮字符串的,用于字符串還原的相關(guān)數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)的長(zhǎng)度超過(guò)了被壓縮短字符串的自身長(zhǎng)度。

那么問(wèn)題來(lái)了,“我真的有壓縮短字符串的需求,我想體驗(yàn)壓縮的極致感,怎么辦?”。

短字符壓縮算法它來(lái)了。這里挑選了3種比較優(yōu)異的短字符壓縮算法,分別是smaz,shoco,以及壓軸的unisox2。跟前兩章一樣,還是從壓縮率,壓縮和解壓縮性能的角度,一起看看他們?cè)诙套址麎嚎s場(chǎng)景的各自表現(xiàn)吧。

(1)Smaz

1、Smaz的壓縮和解壓縮

#include <stdio.h>
#include <string.h>
#include <iostream>
#include "smaz.h"

using namespace std;

int main()
{
    int buf_len;
    int com_size;
    int decom_size;

    char com_buf[4096] = {0};
    char decom_buf[4096] = {0};

    char str_buf[1024] = "Narrator: It is raining today. So, Peppa and George cannot play outside.Peppa: Daddy, it's stopped raining.";

    buf_len = strlen(str_buf);
    com_size = smaz_compress(str_buf, buf_len, com_buf, 4096);

    cout << "text size:" << buf_len << endl;
    cout << "compress text size:" << com_size << endl;
    cout << "compress ratio:" << (float)buf_len / (float)com_size << endl << endl;

    decom_size = smaz_decompress(com_buf, com_size, decom_buf, 4096);
    cout << "decompress text size:" << decom_size << endl;

    if(strncmp(str_buf, decom_buf, buf_len)) {
        cout << "decompress text is not equal to source text" << endl;
    }

    return 0;
}

執(zhí)行結(jié)果如下:

通過(guò)smaz壓縮后的短字符串長(zhǎng)度為77,和源字符串相比,減少了30Byte。

2、Smaz的壓縮和解壓縮性能

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <sys/time.h>
#include "smaz.h"

using namespace std;

int main()
{
    int cnt = 0;
    int buf_len;
    int com_size;
    int decom_size;

    timeval st, et;

    char *com_ptr = NULL;
    char* decom_ptr = NULL;

    char str_buf[1024] = "Narrator: It is raining today. So, Peppa and George cannot play outside.Peppa: Daddy, it's stopped raining.";

    buf_len = strlen(str_buf);
    gettimeofday(&st, NULL);
    while(1) {

        com_ptr = (char *)malloc(buf_len);
        com_size = smaz_compress(str_buf, buf_len, com_ptr, buf_len);

        free(com_ptr);
        cnt++;

        gettimeofday(&et, NULL);
        if(et.tv_sec - st.tv_sec >= 10) {
            break;
        }
    }

    cout << endl <<"compress per second:" << cnt/10 << " times" << endl;

    cnt = 0;
    com_ptr = (char *)malloc(buf_len);
    com_size = smaz_compress(str_buf, buf_len, com_ptr, buf_len);

    gettimeofday(&st, NULL);
    while(1) {

        // decompress length not more than origin buf length
        decom_ptr = (char *)malloc(buf_len + 1);
        decom_size = smaz_decompress(com_ptr, com_size, decom_ptr, buf_len + 1);

        // check decompress length
        if(buf_len != decom_size) {
            cout << "decom error" << endl;
        }

        free(decom_ptr);
        cnt++;

        gettimeofday(&et, NULL);
        if(et.tv_sec - st.tv_sec >= 10) {
            break;
        }
    }

    cout << "decompress per second:" << cnt/10 << " times" << endl << endl;

    free(com_ptr);
    return 0;
}

結(jié)果如何?

壓縮性能在40w條/S,解壓在百萬(wàn)級(jí),好像還不錯(cuò)哈!

(2)Shoco

1、Shoco的壓縮和解壓縮

#include <stdio.h>
#include <string.h>
#include <iostream>
#include "shoco.h"

using namespace std;

int main()
{
    int buf_len;
    int com_size;
    int decom_size;

    char com_buf[4096] = {0};
    char decom_buf[4096] = {0};

    char str_buf[1024] = "Narrator: It is raining today. So, Peppa and George cannot play outside.Peppa: Daddy, it's stopped raining.";

    buf_len = strlen(str_buf);
    com_size = shoco_compress(str_buf, buf_len, com_buf, 4096);

    cout << "text size:" << buf_len << endl;
    cout << "compress text size:" << com_size << endl;
    cout << "compress ratio:" << (float)buf_len / (float)com_size << endl << endl;

    decom_size = shoco_decompress(com_buf, com_size, decom_buf, 4096);
    cout << "decompress text size:" << decom_size << endl;

    if(strncmp(str_buf, decom_buf, buf_len)) {
        cout << "decompress text is not equal to source text" << endl;
    }

    return 0;
}

執(zhí)行結(jié)果如下:

通過(guò)shoco壓縮后的短字符串長(zhǎng)度為86,和源字符串相比,減少了21Byte。壓縮率比smaz要低。

 2、Shoco的壓縮和解壓縮性能

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <sys/time.h>
#include "shoco.h"

using namespace std;

int main()
{
    int cnt = 0;
    int buf_len;
    int com_size;
    int decom_size;

    timeval st, et;

    char *com_ptr = NULL;
    char* decom_ptr = NULL;

    char str_buf[1024] = "Narrator: It is raining today. So, Peppa and George cannot play outside.Peppa: Daddy, it's stopped raining.";

    buf_len = strlen(str_buf);
    gettimeofday(&st, NULL);
    while(1) {

        com_ptr = (char *)malloc(buf_len);
        com_size = shoco_compress(str_buf, buf_len, com_ptr, buf_len);

        free(com_ptr);
        cnt++;

        gettimeofday(&et, NULL);
        if(et.tv_sec - st.tv_sec >= 10) {
            break;
        }
    }

    cout << endl <<"compress per second:" << cnt/10 << " times" << endl;

    cnt = 0;
    com_ptr = (char *)malloc(buf_len);
    com_size = shoco_compress(str_buf, buf_len, com_ptr, buf_len);

    gettimeofday(&st, NULL);
    while(1) {

        // decompress length not more than origin buf length
        decom_ptr = (char *)malloc(buf_len + 1);
        decom_size = shoco_decompress(com_ptr, com_size, decom_ptr, buf_len + 1);

        // check decompress length
        if(buf_len != decom_size) {
            cout << "decom error" << endl;
        }

        free(decom_ptr);
        cnt++;

        gettimeofday(&et, NULL);
        if(et.tv_sec - st.tv_sec >= 10) {
            break;
        }
    }

    cout << "decompress per second:" << cnt/10 << " times" << endl << endl;

    free(com_ptr);
    return 0;
}

執(zhí)行結(jié)果如何呢?

holy shit!壓縮和解壓縮居然都達(dá)到了驚人的百萬(wàn)級(jí)。就像算法作者們自己說(shuō)的一樣:“在長(zhǎng)字符串壓縮領(lǐng)域,shoco不想與通用壓縮算法競(jìng)爭(zhēng),我們的優(yōu)勢(shì)是短字符的快速壓縮,雖然壓縮率很爛!”。這樣說(shuō),好像也沒(méi)毛病。

(3)Unisox2

我們?cè)賮?lái)看看unisox2呢。

1、Unisox2的壓縮和解壓縮

#include <stdio.h>
#include <string.h>
#include "unishox2.h"

int main()
{
    int buf_len;
    int com_size;
    int decom_size;

    char com_buf[4096] = {0};
    char decom_buf[4096] = {0};

    char str_buf[1024] = "Narrator: It is raining today. So, Peppa and George cannot play outside.Peppa: Daddy, it's stopped raining.";

    buf_len = strlen(str_buf);
    com_size = unishox2_compress_simple(str_buf, buf_len, com_buf);

    printf("text size:%d\n", buf_len);
    printf("compress text size:%d\n", com_size);
    printf("compress ratio:%f\n\n", (float)buf_len / (float)com_size);

    decom_size = unishox2_decompress_simple(com_buf, com_size, decom_buf);

    printf("decompress text size:%d\n", decom_size);

    if(strncmp(str_buf, decom_buf, buf_len)) {
        printf("decompress text is not equal to source text\n");
    }

    return 0;
}

結(jié)果如下:

通過(guò)Unisox2壓縮后的短字符串長(zhǎng)度為67,和源字符串相比,減少了40Byte,相當(dāng)于是打了6折?。〔诲e(cuò)不錯(cuò)。

 2、Unisox2的壓縮和解壓縮性能

Unisox2的壓縮能力目前來(lái)看是三者中最好的,如果他的壓縮和解壓性能也不錯(cuò)的話(huà),那就真的就比較完美了。再一起看看Unisox2的壓縮和解壓性能吧!

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <sys/time.h>
#include "unishox2.h"

int main()
{
    int cnt = 0;
    int buf_len;
    int com_size;
    int decom_size;

    struct timeval st, et;

    char *com_ptr = NULL;
    char* decom_ptr = NULL;

    char str_buf[1024] = "Narrator: It is raining today. So, Peppa and George cannot play outside.Peppa: Daddy, it's stopped raining.";

    buf_len = strlen(str_buf);
    gettimeofday(&st, NULL);
    while(1) {

        com_ptr = (char *)malloc(buf_len);
        com_size = unishox2_compress_simple(str_buf, buf_len, com_ptr);

        free(com_ptr);
        cnt++;

        gettimeofday(&et, NULL);
        if(et.tv_sec - st.tv_sec >= 10) {
            break;
        }
    }

    printf("\ncompress per second:%d times\n", cnt/10);

    cnt = 0;
    com_ptr = (char *)malloc(buf_len);
    com_size = unishox2_compress_simple(str_buf, buf_len, com_ptr);

    gettimeofday(&st, NULL);
    while(1) {

        // decompress length not more than origin buf length
        decom_ptr = (char *)malloc(buf_len + 1);
        decom_size = unishox2_decompress_simple(com_ptr, com_size, decom_ptr);

        // check decompress length
        if(buf_len != decom_size) {
            printf("decom error\n");
        }

        free(decom_ptr);
        cnt++;

        gettimeofday(&et, NULL);
        if(et.tv_sec - st.tv_sec >= 10) {
            break;
        }
    }

    printf("decompress per second:%d times\n\n", cnt/10);

    free(com_ptr);
    return 0;
}

執(zhí)行結(jié)果如下:

事與愿違,Unisox2雖然有三個(gè)算法中最好的壓縮率,可是卻也擁有最差的壓縮和解壓性能。跟前兩章分析的不謀而合:有高壓縮率,就會(huì)損失自身的壓縮性能,兩者不可兼得。

三、總結(jié)

本篇分享了smaz,shoco,unisox2三種短字符串壓縮算法,分別探索了它們各自的壓縮率與壓縮和解壓縮性能,結(jié)果如下表所示。

表1

shoco的壓縮率最低,但是擁有最高的壓縮和解壓速率;smaz居中;unisox2擁有最高的壓縮率,可是它的壓縮和解壓性能最低。

結(jié)論與前兩章有關(guān)長(zhǎng)字符串壓縮的分析不謀而合:擁有高壓縮率,就會(huì)損失自身的壓縮性能,兩者不可兼得。

實(shí)際使用還是看自身需求和環(huán)境吧。如果適當(dāng)壓縮就好,那就可以選用shoco,畢竟性能高;想要節(jié)約更多的空間,那就選擇smaz或者unisox2。

到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)短字符串壓縮的三種方法詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言短字符串壓縮內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++基于對(duì)話(huà)框的程序的框架實(shí)例

    C++基于對(duì)話(huà)框的程序的框架實(shí)例

    這篇文章主要介紹了C++基于對(duì)話(huà)框的程序的框架,以實(shí)例形式講述了C++對(duì)話(huà)框程序框架,有助于深入理解基于C++的Windows程序設(shè)計(jì),需要的朋友可以參考下
    2014-10-10
  • 示例詳解C++中的各種鎖

    示例詳解C++中的各種鎖

    C++中常見(jiàn)的鎖包括互斥鎖、遞歸互斥鎖、讀寫(xiě)鎖、定時(shí)互斥鎖、遞歸定時(shí)互斥鎖、自旋鎖和條件變量,互斥鎖用于防止多線(xiàn)程同時(shí)訪(fǎng)問(wèn)共享資源,遞歸互斥鎖允許同一線(xiàn)程多次獲取鎖,讀寫(xiě)鎖區(qū)分讀寫(xiě)操作,提高并發(fā)性
    2024-11-11
  • C++深淺拷貝和寫(xiě)時(shí)拷貝圖文詳解

    C++深淺拷貝和寫(xiě)時(shí)拷貝圖文詳解

    這篇文章主要給大家介紹了關(guān)于C++深淺拷貝和寫(xiě)時(shí)拷貝的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C語(yǔ)言常見(jiàn)的文件操作函數(shù)

    C語(yǔ)言常見(jiàn)的文件操作函數(shù)

    這篇文章主要為大家介紹了C語(yǔ)言文件操作函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • C?語(yǔ)言的弱符號(hào)與弱引用你了解嗎

    C?語(yǔ)言的弱符號(hào)與弱引用你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C?語(yǔ)言弱符號(hào)與弱引用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C++ 讀取文件內(nèi)容到指定類(lèi)型的變量方法

    C++ 讀取文件內(nèi)容到指定類(lèi)型的變量方法

    今天小編就為大家分享一篇C++ 讀取文件內(nèi)容到指定類(lèi)型的變量方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • C語(yǔ)言通訊錄管理系統(tǒng)完整代碼

    C語(yǔ)言通訊錄管理系統(tǒng)完整代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言通訊錄管理系統(tǒng)完整代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 基于C語(yǔ)言string函數(shù)的詳解

    基于C語(yǔ)言string函數(shù)的詳解

    本篇文章是對(duì)C語(yǔ)言中string函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt?TCP網(wǎng)絡(luò)通信學(xué)習(xí)

    Qt?TCP網(wǎng)絡(luò)通信學(xué)習(xí)

    用于數(shù)據(jù)傳輸?shù)牡蛯泳W(wǎng)絡(luò)協(xié)議,多個(gè)物聯(lián)網(wǎng)協(xié)議都是基于TCP協(xié)議的,這篇文章為大家介紹了Qt?TCP網(wǎng)絡(luò)通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語(yǔ)言正則表達(dá)式操作示例

    C語(yǔ)言正則表達(dá)式操作示例

    這篇文章主要介紹了C語(yǔ)言正則表達(dá)式操作,結(jié)合實(shí)例形式分析了C語(yǔ)言正則匹配類(lèi)似郵箱格式功能的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07

最新評(píng)論

寿宁县| 开原市| 景宁| 星座| 德清县| 祁门县| 工布江达县| 宜都市| 平和县| 万源市| 博爱县| 广河县| 法库县| 吉木乃县| 正安县| 鹤庆县| 道孚县| 平乐县| 罗城| 安义县| 莱芜市| 泗水县| 清水县| 莒南县| 迁西县| 梁河县| 启东市| 英吉沙县| 瑞安市| 高尔夫| 天门市| 金乡县| 林甸县| 彭州市| 南京市| 建水县| 温州市| 冷水江市| 万源市| 彩票| 历史|