示例代码含义:记目标字符串中有多少个目标字符。
linux代码(例子)如下:

#include <iostream>
#include <x86intrin.h>
#include <fstream>
#include <chrono>using namespace std;struct StringView {const char* p;const size_t len;
};StringView FileSize(const char* fileName) {ifstream ifstr(fileName);const auto b = ifstr.tellg();ifstr.seekg(0, ios::end);const auto e = ifstr.tellg();const size_t fileSize = e - b;ifstr.seekg(0, ios::beg);char *p = new char[fileSize];ifstr.read(p, fileSize);return {p, fileSize};
}// Normal function
size_t count_c_normal(const StringView& str, const uint8_t c) {uint32_t num = 0;for (uint32_t i = 0; i < str.len; ++i) {if (c == *(str.p + i)) {++num;}}return num;
}// SIMD function
size_t count_c_simd(const StringView& str, const uint8_t c) {__m128i ch = _mm_set1_epi8(c); // char ch[16] = { c, c, ..., c }size_t cnt = 0;uint32_t i = 0;for (; i < str.len; i+=16) {// char t[16] = { (str+i)[0], (str+i)[1], ... }__m128i t = _mm_loadu_si128((__m128i *)(str.p + i));__m128i res = _mm_cmpeq_epi8(t, ch);// res[16] = { 0xFF, 0x00, 0xFF ... }unsigned mask = _mm_movemask_epi8(res);// bits[16] = 0...1101cnt += __builtin_popcount(mask);}// free cnt .for (; i < str.len; ++i) {if (c == *(str.p + i)){++cnt;}}return cnt;
}int main() {const auto ret = FileSize("./test_file");size_t cnt1 = 0, cnt2 = 0;const auto t1 = std::chrono::steady_clock::now();cnt1 = count_c_normal(ret, uint8_t('1'));const auto t2 = std::chrono::steady_clock::now();cnt2 = count_c_simd(ret, uint8_t('1'));const auto t3 = std::chrono::steady_clock::now();std::cout << "cnt1:" << cnt1 << ",cnt2:" << cnt2 << std::endl;const auto d1 = std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count();const auto d2 = std::chrono::duration_cast<std::chrono::milliseconds>(t3-t2).count();std::cout << "time1:" << d1 << ",time2:" << d2 << std::endl;return 0;
}

生成随机数代码如下:

#include <iostream>
#include <random>
#include <fstream>
using namespace std;void RandCharFile(const uint32_t file_len) {default_random_engine e;ofstream ofstr("./test_file");for (uint32_t i = 0; i < file_len; ++i) {ofstr << e() % 128;}ofstr.close();
}int main() {RandCharFile(1024 * 1024 * 1024);return 0;
}

编译命令:

g++ -std=c++11 main.cc -o main -O2

结果如下:

cnt1:511699574,cnt2:511699574
time1:1957,time2:900

总结:在O2优化下耗时相差2倍多,没有O2优化耗时6倍+。

备注:avx比simd还要强大:对avx2也做了类似测试,测试过程和结果:https://blog.csdn.net/weixin_41644391/article/details/113571486

c++ SIMD 样例相关推荐

  1. YOLOv4 资源环境配置和测试样例效果

    YOLOv4 资源环境配置和测试样例效果 基本环境:cuda=10.0,cudnn>=7.0, opencv>=2.4 一.下载yolov4 git clone https://githu ...

  2. 2021年大数据常用语言Scala(三十二):scala高级用法 样例类

    目录 样例类 定义样例类 样例类方法 样例对象 样例类 样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类(类似于Java POJO类),而且它会自动生成apply方法,允许我们快速地创建样例 ...

  3. 在Ubuntu下构建Bullet以及执行Bullet的样例程序

    在Ubuntu下构建Bullet以及执行Bullet的样例程序 1.找到Bullet的下载页,地址是:https://code.google.com/p/bullet/downloads/list 2 ...

  4. JDBC连接MySQL数据库及演示样例

    JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  5. Oracle简单脚本演示样例

    Oracle简单脚本演示样例 1.添加表 --改动日期:2014.09.21 --改动人:易小群 --改动内容:新增採购支付情况表 DECLARE VC_STR           VARCHAR2( ...

  6. 【ZooKeeper Notes 3】ZooKeeper Java API 使用样例

    查看PDF版本 转载请注明:@ni掌柜 nileader@gmail.com ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务框架,包含一组简单的原语集合.通过这些原语言的组合使用, ...

  7. ACMNO.24 C语言-转置矩阵 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。 输入 一个3x3的矩阵 输出 转置后的矩阵 样例

    题目描述 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换. 输入 一个3x3的矩阵 输出 转置后的矩阵 样例输入 1 2 3 4 5 6 7 8 9 样例输出 1 4 7 2 5 8 3 ...

  8. ACMNO.21 C语言-逆序输出 输入10个数字,然后逆序输出。 输入 十个整数 输出 逆序输出,空格分开 样例输入 1 2 3 4 5 6 7 8 9 0

    题目描述 输入10个数字,然后逆序输出. 输入 十个整数 输出 逆序输出,空格分开 样例输入 1 2 3 4 5 6 7 8 9 0 样例输出 0 9 8 7 6 5 4 3 2 1 提示 数组?堆栈 ...

  9. ACMNO.19 C语言-对角求和 求一个3×3矩阵对角线元素之和。 输入 矩阵 输出 主对角线 副对角线 元素和 样例输入 1 2 3 1 1 1 3 2 1 样例输出 3 7

    这个我做了改进,可以实现NXN的矩阵.求出对角线之和! 只需要修改定义的define z的值就好! 接下来,进入正题! 题目描述: 求一个3×3矩阵对角线元素之和. 输入 矩阵 输出 主对角线 副对角 ...

最新文章

  1. <马哲>科学技术在社会发展中的作用2017-12-27
  2. JavaScript Map 和 Set
  3. c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊?
  4. kindeditor项目集成
  5. Netty构建游戏服务器(一)--基本概念与原理
  6. SQL Serve——版本
  7. ws550 第三方固件_【详细图文】华为WS550固件升级方法
  8. [渝粤教育] 西北农林科技大学 土壤学 参考 资料
  9. Uchome分页方法
  10. 2021-06-19
  11. 如何将md文件完美转化为 PDF?
  12. hzhost防asp攻击函数
  13. ZeroTier 和 FRP 速度对比实验(附搭建方法)
  14. 中国最大的IDC世纪互联是如何成为云计算时代的看客的
  15. 句法分析-基于CKY的PCFG(概率上下文无法语法)
  16. Android 文件夹管理
  17. 一款强大的端口扫描工具(nmap)
  18. EXCEL 批量生成条形码、二维码方案
  19. 一加6t android,一加6T使用体验:可能是最流畅的安卓旗舰
  20. C语言实现字符串转十六进制

热门文章

  1. 图文教你下载英雄联盟League of Legends手游版
  2. id auto mysql_主键-使mysql表中的ID为auto_increment(在事实之后)
  3. 【洛谷 P2257】YY的GCD 【莫比乌斯反演 经典题目】
  4. vim + tmax
  5. 动态网站设计十八般武艺—— ASP 篇(十七)(转)
  6. Ubuntu下几种常用的文本编辑器
  7. ESP8266 连接巴法云
  8. spc统计过程控制系统架构模型
  9. Unity学习之预制件变体
  10. mysql备份恢复数据防止乱码