CryptoPP的 Timer算法的使用

2023-11-13

密码学库Cryptopp不仅给提供了丰富的密码学算法,而且还包含了一些有用的工具类算法,比如本次要讲到的Timer,使用该类定义的对象,可以在程序中统计某一段代码的运行时间。前面我们在讲解随机数发生器的使用的时候,在程序中用到统计产生1G bits的随机数需要的时间。那时,我们使用的C语言库函数clock()。

CryptoPP的LC_RNG算法的使用:
https://blog.csdn.net/Lunar_Queen/article/details/81542372。

源代码如下:

#include<cryptlib.h>
#include<rng.h>//包含LC_RNG算法的头文件
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
using namespace CryptoPP;

#define Array_Size 64

int main()
{
	//定义一个LCG(线性同余发生器)对象,同时给该RNG赋予种子。
	LC_RNG  rng(123456);
	//定义一个文件对象
	ofstream file("data.dat",ios_base::binary | ios_base::out);

	byte output[Array_Size];

	//产生1Gbits的数据。每调用一次随机数发生器,产生8*64=512bits的数据。
	//1Gbits = 1000*1000*1000。
	//1000*1000*1000/512 = 1953125。

	cout << "开始生成数据..." << endl;
	clock_t start = clock();

	for(int i=0; i < 1953125 ; ++i)
	{
		rng.GenerateBlock(output,Array_Size);
		file.write(reinterpret_cast<const char*>(output),Array_Size);
	}
	clock_t end = clock();
	cout << "数据生成完毕..." << endl;

	double  duration;
	duration = (double)(end - start) / CLOCKS_PER_SEC;
	cout << "生成数据总共耗时:" << duration << endl;

	file.close();

	return 0;
}

可以看到,上面的代码在加入“统计时间”的代码片段后,显得凌乱。

此时,我们就可以使用Cryptopp提供的Timer算法,不仅很好地完成了时间统计,代码又显得简单整洁。
这里写图片描述
从上图可以看到Timer提供了几个成员函数,从成员函数的名字就可以很好地知道其作用了。
1、定义Timer类对象tm。
2、在开始计时的地方,调用其成员函数StartTimer () 开始计时。
3、在计时结束的地方,调用其成员函数ElapsedTimeAsDouble ()或ElapsedTime ()或GetCurrentTimerValue 。即可得到程序中某段代码的运行时间。注意,上面几个函数的返回值不一样,其意义也不一样,具体参见其源代码注释。

示例代码如下:

#include<cryptlib.h>
#include<rng.h>//包含LC_RNG算法的头文件
#include<hrtimer.h>
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
using namespace CryptoPP;

#define Array_Size 64

int main()
{
	//定义一个LCG(线性同余发生器)对象,同时给该RNG赋予种子。
	LC_RNG  rng(123456);
	//定义一个文件对象
	ofstream file("data.dat",ios_base::binary | ios_base::out);

	byte output[Array_Size];

	//产生1Gbits的数据。每调用一次随机数发生器,产生8*64=512bits的数据。
	//1Gbits = 1000*1000*1000。
	//1000*1000*1000/512 = 1953125。

	Timer  tm;

	cout << "开始生成数据..." << endl;
	//clock_t start = clock();
	tm.StartTimer();//开始计时

	for(int i=0; i < 1953125 ; ++i)
	{
		rng.GenerateBlock(output,Array_Size);
		file.write(reinterpret_cast<const char*>(output),Array_Size);
	}
	//clock_t end = clock();
	cout << "数据生成完毕..." << endl;

	//double  duration;
	//duration = (double)(end - start) / CLOCKS_PER_SEC;
	//cout << "生成数据总共耗时:" << duration << endl;

	cout << "生成数据总共耗时:" << tm.ElapsedTimeAsDouble() << endl;

	file.close();

	return 0;
}

从上面的代码可以看出来,替换掉原来统计时间的代码即可。

去掉原来的代码,最终示例代码如下:

#include<cryptlib.h>
#include<rng.h>//包含LC_RNG算法的头文件
#include<hrtimer.h>
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
using namespace CryptoPP;

#define Array_Size 64

int main()
{
	//定义一个LCG(线性同余发生器)对象,同时给该RNG赋予种子。
	LC_RNG  rng(123456);
	//定义一个文件对象
	ofstream file("data.dat",ios_base::binary | ios_base::out);

	byte output[Array_Size];

	//产生1Gbits的数据。每调用一次随机数发生器,产生8*64=512bits的数据。
	//1Gbits = 1000*1000*1000。
	//1000*1000*1000/512 = 1953125。

	Timer  tm;

	cout << "开始生成数据..." << endl;
	
	tm.StartTimer();//开始计时

	for(int i=0; i < 1953125 ; ++i)
	{
		rng.GenerateBlock(output,Array_Size);
		file.write(reinterpret_cast<const char*>(output),Array_Size);
	}
	
	cout << "数据生成完毕..." << endl;

	cout << "生成数据总共耗时:" << tm.ElapsedTimeAsDouble() << endl;

	file.close();

	return 0;
}

执行上述代码,运行结果如下图所示;
这里写图片描述

由此,可以看到使用程序库不仅让我们减少了工作量和出错的可能性,而且让自己的代码看起来更加简洁明了。
后面,可以看到当使用Cryptopp提供的pipeling范式进行数据处理、传递时,程序会变得更简洁,更加清晰易懂。

更多示例代码详见《深入浅出CryptoPP密码学库》随书电子文档:https://github.com/locomotive-crypto/crypto_book_1st

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CryptoPP的 Timer算法的使用 的相关文章

  • 骰子【概率dp】

    题目链接 P1409 骰子 因为会有人被弹出队列 所以我设置的期望dp为 表示当现在队列中有i个人的时候 第j个人获胜的概率 于是有当只剩一个人的时候 那个人必胜 再往下 先看它在队首的情况 也就是直接获胜的概率加上它被弹到队尾时候的概率
  • IntelliJ IDEA 2023.2 新版本,拥抱 AI

    IntelliJ IDEA 近期连续发布多个EAP版本 官方在对用户体验不断优化的同时 也新增了一些不错的功能 尤其是人工智能助手补充 AI Assistant 相信在后续IDEA使用中 会对开发者工作效率带来不错的提升 以下是官方对AI
  • LeetCode:动态规划中的0-1背包问题【快来直接套模板啦】

    PS 0 1背包问题无疑是动态规划题目里面的非常经典的一类题目了 下面给出这类题目的一种解题模板 本文是参考代码随想录做的一些笔记 完整版本请戳链接 标准0 1背包问题 二维数组求解 标准的背包问题 有n件物品和一个最多能背重量为w的背包
  • 106 letcode - 重建二叉树

    class Solution 内存条里 有两个区域 堆和栈 其中 栈是我们函数跳转的关键 顺序是先进后出 通过压栈出栈 可以实现递归 1 当到达递归终止条件时候 则开始返回 例如 先序遍历二叉树中 每个节点都要执行三个操作 根 左 右 当对
  • Java基于 SpringBoot 的车辆充电桩系统

    博主介绍 程序员徐师兄 7年大厂程序员经历 全网粉丝30W Csdn博客专家 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战 文章目录 1 效果演示 效果图 技术栈 2 前言介绍 完整源码请私聊 3 主
  • 关于今年五一调休。。

    作者主页 爱笑的男孩 的博客 CSDN博客 深度学习 YOLO 活动领域博主爱笑的男孩 擅长深度学习 YOLO 活动 等方面的知识 爱笑的男孩 关注算法 python 计算机视觉 图像处理 深度学习 pytorch 神经网络 opencv领
  • unity 渲染帧率优化-OnDemandRendering

    FixedUpdate更新速率设置 OnDemandRendering 相关的API 1 OnDemandRendering renderFrameInterval 3 解释说明 在一些静态UI的时候把OnDemandRendering r
  • Message": "请求的资源不支持 http 方法“GET”

    今天用postman测试后端api 总是报错 下面是问题解决方案 一 测试方法 public ApiResult Get int id ApiResult result new ApiResult result data 我是Get方法返回
  • Java调用jython

    Java调用jython 因为工作需要 需要在Java Jvm 进程内调用Python脚本 下了Jython练练手 脚本语言看着真别扭啊 若干年前写自动化测试工具时也用过python一小阵子 但基本忘光光了 好了 直奔主题 前提 1 sun
  • Linux如何给服务器增加白名单

    1 查看系统白名单配置 iptables L n 2 增加白名单 19 40 145 140 是需要增加的服务器IP iptables I INPUT s 19 40 145 140 32 p tcp j ACCEPT 注 I I是i的大写
  • oracle 函数使用方法----replace函数

    例 sql语句如下 select from cen sys TB DIC JDLX t 查询结果如下 需求 需要获取字段 PID 的值并 新增一个字段 PNAME PNAME的值为字段PID去掉 市平台前置机 剩下的字段 实现 select
  • 后端返回parentId,前端处理成children嵌套数据

    rouyi 的 vuetree函数结合elementui el table组件使用 把有parentId和id结构的数据处理成children嵌套数据 字段名称不一致 可以设置 vuetree函数 构造树型结构数据 param data 数
  • html 调用ActiveX

    html网页调用ActiveX控件时 要获取到ActiveX的ClassID 这个ClassID是注册到系统里的 而不是工程中的uuid 下图为uuid 正确的是在注册表的HKEY CLASSES ROOT中查找你的工程名的 项 找到后 其
  • flink state ttl 清理逻辑(截止到flink1.8之前的逻辑)

    在我们开发Flink应用时 许多有状态流应用程序的一个常见要求是自动清理应用程序状态以有效管理状态大小 或控制应用程序状态的访问时间 TTL Time To Live 功能在Flink 1 6 0中开始启动 并在Apache Flink中启
  • openwrt golang mysql_golang1.9编译openwrt运行程序 ,window7下liteide编译

    网上看了好多资料发现都很过时了 基本都是用的https github com gomini go mips32编译的 但是go1 9早就支持mips了 设置好编译参数 开始build 这时在go pkg下会出现linux mips目录 就是

随机推荐

  • Thumb / Thumb-2 / ThumbEE

    本文转载至 http zh wikipedia org wiki ARM E6 9E B6 E6 A7 8B Thumb 较新的ARM处理器有一种16 bit指令模式 叫做Thumb 也许跟每个条件式运行指令均耗用4位的情形有关 在Thum
  • 问题定位及解决方案

    1 视频沉浸页快速滑动后 必现不能向下划动 复现步骤 进入视频沉浸页 快速向下划动 滑动到第一页最后一个时 不能再向下划动 解决步骤 1 确定请求API mtop aliexpress ugc feed video list 2 找到触发请
  • uniapp开发小程序,编译时报错Cannot read property ‘forceUpdate‘ of undefined的解决方案

    1 这个报错 主要是没有在uniapp的开发平台为这个应用注册一个appid 2 登录uniapp开发平台 https dev dcloud net cn 注册成为开发者 并创建一个应用 此应用的名称要与本地的项目的名称一致 3 重现获取u
  • Android开发---Fragment可见/不可见时的生命周期回调函数

    Fragment可见 不可见时的生命周期回调函数 项目中经常会碰到 需要在fragment失去焦点和获得焦点的方法中进行一些设置 但是fragment没有onpause 和onResume 方法 你重写的这两个方法 都是fragment依附
  • python安装

    Python 环境搭建 本章节我们将向大家介绍如何在本地搭建Python开发环境 Python可应用于多平台包括 Linux 和 Mac OS X 你可以通过终端窗口输入 python 命令来查看本地是否已经安装Python以及Python
  • ORA-32021: parameter value longer than 255 characters 解决方法

    在增加节点完后 用dbca 添加数据库实例时 报ORA 32021 parameter value longer than 255 characters 错误 oraagent log 2011 10 24 09 18 32 724 USR
  • 框架学习笔记——Spring

    Spring 文章目录 Spring 1 Spring简介 1 1 框架的主要特征 1 2 Spring的主要特点 1 3 组成 2 Spring之控制反转 IOC 2 1 百科 2 2 两种方式 2 3 依赖注入 推导 2 3 1 新建一
  • Centos7.5安装应用服务教程 ---- jdk1.8安装教程

    1 下载jdk1 8压缩包 建议装在 usr local目录下 2 解压 tar zxvf jdk 8u301 linux x64 tar gz 3 配置环境变量 修改文件配置 vi vim etc profile 在文件底部加入以下配置
  • C++中queue使用详细说明

    一 queue 的介绍 queue 翻译为队列 在 STL 中主要则是实现了一个先进先出的容器 二 queue 的定义 单独定义一个 queue queue
  • linux开放tomcat8080端口,防火墙开启/关闭/状态查询

    linux开放tomcat8080端口 防火墙开启 关闭 状态查询 最终效果 开放8080端口成功访问tomcat页面 要实现开放端口8080有两种方式 仅限于我所知道的 条条大路通罗马 能实现功能就行 废话不多说上干货 一是单独开放808
  • github 如何删除不需要的项目(两种方法)

    在Github上删除项目是一项非常基本的操作 但是对于很多使用者来说 却可能会因为缺乏经验而无从下手 如果你也处于这个情况 那么这篇文章就为你提供了一些详细的指导 删除Github上的项目可以采用两种方式 通过网站进行删除 或者通过Git客
  • JavaScript中的promise

    概述 promise 承诺 是异步编程的一种解决方案 可以替代传统的解决方案 回调函数和事件 ES6统一了用法 并原生提供了Promise对象 promise是异步编程的一种解决方案 什么时候我们会来处理异步事件呢 一种很常见的场景就应该是
  • [1228]Python prometheus-client使用方式

    文章目录 安装 prometheus client 基本使用介绍 应用实例 收集 CPU 使用率指标 收集自定义指标 Python封装 调用 github https github com prometheus client python
  • MkDocs全文搜索中的中文支持

    在前一篇MkDocs全文搜索中使用模糊匹配中已经实现了模糊匹配 这次通过lunr languages来实现lunr对中文搜索的支持 MkDocs版本 v0 16 3 lunr js版本2 0 3 lunr languages版本1 0 0
  • Linux配置tomcat

    Linux配置tomcat 1 下载tomcat tomcat官网 https tomcat apache org 2 上传tomcat到Linux 将下载的tomcat上传到linux的并解压 3 运行tomcat 启动tomcat之前要
  • C#中的拆装箱,与object类型紧密相关

    class Program static void Main string args Console WriteLine Hello World int a 1 装箱操作 比较消耗性能 最 box 值类型隐式转换为object类型或由此值类
  • Oracle字符串拆分

    文章目录 Oracle字符串拆分 1 使用regexp substr 函数 1 1 拆分aaa bbb ccc 1 2 拆分aaa bbb ccc 1 3 level作用 2 在oracle中实现MySQL的find in set 函数 2
  • shell脚本循环插入参数到另外一个shell脚本

    bin bash cd var lib hadoop hdfs reflush array 0 1 2 for i 0 i lt array i do startKey array i let n i 1 let m array 如果当前值
  • 【SSA-LSTM】基于麻雀算法优化LSTM 模型预测研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 麻雀搜索算法 1 2 长短期记忆神经网络 2 运行结果 3 参考文献 4 Matlab代码实现 1
  • CryptoPP的 Timer算法的使用

    密码学库Cryptopp不仅给提供了丰富的密码学算法 而且还包含了一些有用的工具类算法 比如本次要讲到的Timer 使用该类定义的对象 可以在程序中统计某一段代码的运行时间 前面我们在讲解随机数发生器的使用的时候 在程序中用到统计产生1G