C++ Thread多线程并发记录(11)多核计算Base16编码

#include <iostream>
#include <vector>
#include <chrono>
#include <thread>
#include <unordered_map>

//编码表
static std::unordered_map<int, char> base16{{0,  '0'},
                                            {1,  '1'},
                                            {2,  '2'},
                                            {3,  '3'},
                                            {4,  '4'},
                                            {5,  '5'},
                                            {6,  '6'},
                                            {7,  '7'},
                                            {8,  '8'},
                                            {9,  '9'},
                                            {10, 'A'},
                                            {11, 'B'},
                                            {12, 'C'},
                                            {13, 'D'},
                                            {14, 'E'},
                                            {15, 'F'}
};

//Base16编码
static void Base16Encode(unsigned char *data, int size, unsigned char *output) {
    for (int i = 0; i < size; ++i) {
        unsigned char byte_ = data[i];
        char high_bit = base16[byte_ >> 4];
        char low_bit = base16[byte_ & 0x0F];
        output[i * 2] = high_bit;
        output[i * 2 + 1] = low_bit;
    }
}

//多线程Base16编码
void Base16EncodeThread(std::vector<unsigned char> &data, std::vector<unsigned char> &output){
    //数据切片
    size_t size = data.size();
    auto thread_count = std::thread::hardware_concurrency(); //CPU支持的最大线程数
    int slice_count = size / thread_count;
    //处理数据量很小的情况
    if (size < thread_count){
        //如果数据切片数量小于线程数
        thread_count = 1;
        slice_count = size;
    }

    //准备线程
    std::vector<std::thread> ths;
    ths.resize(thread_count);   //分配线程数量
    //任务分配
    for (int i = 0; i < thread_count; ++i) {
        int offset = i * slice_count;
        int count = slice_count;

        if (thread_count > 1 && i == thread_count - 1){
            count = slice_count + size % thread_count;
        }
        ths[i] = std::thread(Base16Encode, data.data() + offset, count, output.data());
    }
    for (auto & th : ths) {
        if (th.joinable())
            th.join();
    }

}

int main() {
    //编码测试
/*    std::string str_test{"Base16 encoding test."};
    char test[1024] = {};
    Base16Encode((unsigned char *)str_test.c_str(), str_test.size(), (unsigned char *)test);
    std::cout << test << std::endl;*/

    //待编码数据准备
    std::vector<unsigned char> data_test;
    data_test.resize(1024 * 1024 * 100); //100M
    for (int i = 0; i < data_test.size(); ++i) {
        data_test[i] = i % 256;
    }

    //单线程测试
    {
        std::vector<unsigned char> output1;
        output1.resize(data_test.size() * 2);
        std::cout << "one thread start -> " << std::endl;
        auto start_time = std::chrono::system_clock::now();
        Base16Encode(data_test.data(), data_test.size(), output1.data());
        auto end_time = std::chrono::system_clock::now();
        auto time_duration = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time) ;
        std::cout << data_test.size() / (1024 * 1024) << " M bytes encode cost " << time_duration.count() << "milliseconds" << std::endl;
    }
    //多线程测试
    {
        std::vector<unsigned char> output1;
        output1.resize(data_test.size() * 2);
        std::cout << "Muti-Thread start -> " << std::endl;
        auto start_time = std::chrono::system_clock::now();
        //Base16Encode(data_test.data(), data_test.size(), output1.data());
        Base16EncodeThread(data_test, output1);
        auto end_time = std::chrono::system_clock::now();
        auto time_duration = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time) ;
        std::cout << data_test.size() / (1024 * 1024) << " M bytes encode cost " << time_duration.count() << "milliseconds" << std::endl;
    }

    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值