大公司网站搭建公司,网站空间续费一年多少钱,兰州起点网站建设公司,服务商是什么意思目录 4.1手动实现多核base16编码4.1.1 实现base16编码4.1.2无多线程代码4.1.3 C 11多线程代码4.1.4 C 17多线程并发4.1.5 所有测试代码汇总 4.1手动实现多核base16编码
4.1.1 实现base16编码
二进制转换为字符串
一个字节8位#xff0c;拆分为两个4位字节#xff08;最大值… 目录 4.1手动实现多核base16编码4.1.1 实现base16编码4.1.2无多线程代码4.1.3 C 11多线程代码4.1.4 C 17多线程并发4.1.5 所有测试代码汇总 4.1手动实现多核base16编码
4.1.1 实现base16编码
二进制转换为字符串
一个字节8位拆分为两个4位字节最大值16
拆分后的字节映射到0123456789abcdef
4.1.2无多线程代码 #include thread
#includeiostream
#includefuture
#include string
#include vector
#include chrono//计时头C11using namespace std;
using namespace chrono;static const char base16[] 0123456789abcdef;
void Base16Encode(const unsigned char* data, int size, unsigned char* out)
{for (int i 0; i size; i){unsigned char d data[i];//0000 0000//1234 5678 4 0000 1234 移位操作//1234 5678 0000 1111 0000 5678char a base16[d 4];//取出高位char b base16[d 0x0F];//取出低位out[i * 2] a;out[i * 21] b;}
}int main()
{//使用字符串进行16位编码测试string test_data 测试base16编码;printf(test_data size%d\n, test_data.size());//一个中文占用2个字节一个英文占用1个字节如果要解码出来包含中文和英文有点难度unsigned char* out new unsigned char[test_data.size()*21];Base16Encode((unsigned char*)test_data.data(), test_data.size(), out);//编码out[test_data.size()*2] \0;//字符串\0结尾否则后面总有乱码cout base16: out endl;//测试单线程base16编码效率{vectorunsigned charin_data;in_data.resize(1024 * 1024 * 20);// 1024*1024*10 - 10M 测试数据for (int i 0; i in_data.size(); i){//初始化里面数据in_data[i] i % 256;}vectorunsigned charout_data;out_data.resize(in_data.size()*2);//是输入数据2倍auto start system_clock::now();//计时开始Base16Encode(in_data.data(), in_data.size(),out_data.data());auto end system_clock::now();//计时结束auto duration duration_castmilliseconds(end-start);//模板函数转换到毫秒cout 编码 in_data.size() 字节数据花费 duration.count() 毫秒 endl;//cout out_data.data() endl;}printf(All done!\n);getchar();return 0;
}4.1.3 C 11多线程代码
//C11多线程
void Base16EncodeThread(const vectorunsigned chardata, vectorunsigned char out)
{long size data.size();int th_count thread::hardware_concurrency();//系统支持的线程核心数printf(CPU report thread count:%d\n,th_count);//对原始数据进行切片long slice_count size / th_count;//余数丢弃了余数后续单独处理if (size th_count){//只切一片th_count 1;//1个线程搞定slice_count size;}vectorthread ths;//准备好线程ths.resize(th_count);//任务分配到各个线程 for (int i 0; i th_count; i){//eg. 1234 5678 9abc defg hi//计算偏移位置long offset i * slice_count;long count slice_count;//最后一个线程要把余数加起来一起处理if (th_count 1 i th_count - 1){count slice_count size%th_count;}//cout offset : count endl;ths[i] thread(Base16Encode, data.data() offset,count, out.data());}//等待所有线程处理结束for (auto th : ths){th.join();}
}
4.1.4 C 17多线程并发 printf(C17多线程Base16编码效率测试(编译的时候先检查设置C17) 开始计算\n);//设置C17方法属性-C/C -C语言标准 设置ISOC17vectorunsigned charin_data;in_data.resize(TestNumber);// 1024*1024*10 - 10M 测试数据for (int i 0; i in_data.size(); i){//初始化里面数据in_data[i] i % 256;}vectorunsigned charout_data;out_data.resize(in_data.size() * 2);//是输入数据2倍auto start system_clock::now();//计时开始//#include execution //C17 支持std::for_each(std::execution::par,//并行计算 多核in_data.begin(),in_data.end(),[](auto d)//多线程进入此函数{char a base16[(d 4)];char b base16[(d 0x0F)];int index d - in_data.data();out_data[index * 2] a;out_data[index * 2 1] b;});auto end system_clock::now();//计时结束auto duration duration_castmilliseconds(end - start);//模板函数转换到毫秒cout C17多线程 编码 in_data.size() 字节数据花费 duration.count() 毫秒 endl;4.1.5 所有测试代码汇总 #include thread
#includeiostream
#includefuture
#include string
#include vector
#include chrono//计时头C11#include execution //C17 for_eachusing namespace std;
using namespace chrono;static const char base16[] 0123456789abcdef;
void Base16Encode(const unsigned char* data, long size, unsigned char* out)
{for (int i 0; i size; i){unsigned char d data[i];//0000 0000//1234 5678 4 0000 1234 移位操作//1234 5678 0000 1111 0000 5678char a base16[d 4];//取出高位char b base16[d 0x0F];//取出低位out[i * 2] a;out[i * 21] b;}
}//C11多线程
void Base16EncodeThread(const vectorunsigned chardata, vectorunsigned char out)
{long size data.size();int th_count thread::hardware_concurrency();//系统支持的线程核心数printf(CPU report thread count:%d\n,th_count);//对原始数据进行切片long slice_count size / th_count;//余数丢弃了余数后续单独处理if (size th_count){//只切一片th_count 1;//1个线程搞定slice_count size;}vectorthread ths;//准备好线程ths.resize(th_count);//任务分配到各个线程 for (int i 0; i th_count; i){//eg. 1234 5678 9abc defg hi//计算偏移位置long offset i * slice_count;long count slice_count;//最后一个线程要把余数加起来一起处理if (th_count 1 i th_count - 1){count slice_count size%th_count;}//cout offset : count endl;ths[i] thread(Base16Encode, data.data() offset,count, out.data());}//等待所有线程处理结束for (auto th : ths){th.join();}
}int main()
{int TestNumber 1024 * 1024 * 20 - 1; //1024 * 1024 * 10 - 10M 测试数据大小//使用字符串进行16位编码测试string test_data 测试base16编码;printf(test_data size%d\n, test_data.size());//一个中文占用2个字节一个英文占用1个字节如果要解码出来包含中文和英文有点难度unsigned char* out new unsigned char[test_data.size()*21];Base16Encode((unsigned char*)test_data.data(), test_data.size(), out);//编码out[test_data.size()*2] \0;cout base16: out endl;//测试单线程base16编码效率{printf(单线程Base16编码效率测试 开始计算\n);vectorunsigned charin_data;in_data.resize(TestNumber);// 1024*1024*10 - 10M 测试数据for (int i 0; i in_data.size(); i){//初始化里面数据in_data[i] i % 256;}vectorunsigned charout_data;out_data.resize(in_data.size()*2);//是输入数据2倍auto start system_clock::now();//计时开始Base16Encode(in_data.data(), in_data.size(),out_data.data());auto end system_clock::now();//计时结束auto duration duration_castmilliseconds(end-start);//模板函数转换到毫秒cout 编码 in_data.size() 字节数据花费 duration.count() 毫秒 endl;//cout out_data.data() endl;//预览编码后的文本}//测试C11多线程base16编码效率{printf(C11多线程Base16编码效率测试 开始计算\n);vectorunsigned charin_data;in_data.resize(TestNumber);// 1024*1024*10 - 10M 测试数据for (int i 0; i in_data.size(); i){//初始化里面数据in_data[i] i % 256;}vectorunsigned charout_data;out_data.resize(in_data.size() * 2);//是输入数据2倍auto start system_clock::now();//计时开始Base16EncodeThread(in_data, out_data);//多线程auto end system_clock::now();//计时结束auto duration duration_castmilliseconds(end - start);//模板函数转换到毫秒cout C11多线程 编码 in_data.size() 字节数据花费 duration.count() 毫秒 endl;//cout out_data.data() endl;//预览编码后的文本}//测试C11多线程base16编码效率{printf(C17多线程Base16编码效率测试(编译的时候先检查设置C17) 开始计算\n);//设置C17方法属性-C/C -C语言标准 设置ISOC17vectorunsigned charin_data;in_data.resize(TestNumber);// 1024*1024*10 - 10M 测试数据for (int i 0; i in_data.size(); i){//初始化里面数据in_data[i] i % 256;}vectorunsigned charout_data;out_data.resize(in_data.size() * 2);//是输入数据2倍auto start system_clock::now();//计时开始//#include execution //C17 支持std::for_each(std::execution::par,//并行计算 多核in_data.begin(),in_data.end(),[](auto d)//多线程进入此函数{char a base16[(d 4)];char b base16[(d 0x0F)];int index d - in_data.data();out_data[index * 2] a;out_data[index * 2 1] b;});auto end system_clock::now();//计时结束auto duration duration_castmilliseconds(end - start);//模板函数转换到毫秒cout C17多线程 编码 in_data.size() 字节数据花费 duration.count() 毫秒 endl;//cout out_data.data() endl;//预览编码后的文本}printf(All done!\n);getchar();return 0;
}分析 release版本优化的比较多之所以C17耗时较长原因是进入多线程次数远远大于C11,C11只进入了12次而C17采用lambda表达式函数进入了TestNumber次