cpp学习:测试时间性能与查看汇编带代码

C语言/C++测试算法运行时间的五个方法(关于时间的小知识) 可以使用如下代码。 阅读详情

添加测试时间的代码:

#include<iostream>
#include<memory>
#include<chrono>
class Timer {

public:
	Timer() {//Timer构建时开始计时
		m_StartTimePoint = std::chrono::high_resolution_clock::now();
	}
	~Timer() {//Timer销毁时,停止计时 ---->RAII 超出范围对象就被解析

		Stop();

	}
	void Stop() {
		auto endTimePoint = std::chrono::high_resolution_clock::now();
		auto start = std::chrono::time_point_cast<std::chrono::microseconds>(m_StartTimePoint).time_since_epoch().count();
		auto end = std::chrono::time_point_cast<std::chrono::microseconds>(endTimePoint).time_since_epoch().count();

		auto duration = end - start;
		double ms = duration * 0.001;
		std::cout << "duration :" << duration << " us (" << duration * 0.001 << " ms)" << std::endl;
	}
private:
	std::chrono::time_point<std::chrono::high_resolution_clock> m_StartTimePoint;


};





int main() {

	int value = 0;

	{  //增加一个作用域,结束的时候会Timer会启动计算Stop()
		Timer timer;
		for (int i = 0; i < 1000000; i++) {
			value += 2;
		}
		std::cout << value << std::endl;
	}


	__debugbreak();

	return 0;
}

库函数 #include<chrono,这是一个用于与时间相关的一个库
在这里插入图片描述

chrono是标题的名称,也是子命名空间的名称:该标头中的所有元素(common_type特殊化
除外)不是直接在std命名空间下定义(像大多数标准库一样),而是在std ::下定义:
chrono名称空间。
此标头中的元素处理时间。这主要通过三个概念来完成:
持续时间
它们测量时间跨度,例如:1分钟,2小时或10毫秒。
在此库中,它们用持续时间类模板的对象表示,该对象将计数表示形式和周期精度结合在一起(例如,十毫秒的conds具有十作为计数表示形式,毫秒作为周期精度)。
时间点
对特定时间点的参考,例如生日,今天的黎明或下一趟火车何时通过。
在此库中,time_point类模板的对象通过使用相对于纪元的持续时间(这是使用同一时钟的所有time_point对象共有的固定时间点)来表示这一点。
钟表
将时间点与实际物理时间相关联的框架。
该库提供至少三个时钟,其提供的方法来表达所述当前时间作为time_point:SYSTEM_CLOCK,steady_clock和high_resolution_clock。

小技巧:
__debugbreak()方法可以让我们对程序添加断点进行调试

debug 模式 3.697ms

	for (int i = 0; i < 1000000; i++) {
00133460  mov         dword ptr [ebp-34h],0  
00133467  jmp         main+72h (0133472h)  
00133469  mov         eax,dword ptr [ebp-34h]  
0013346C  add         eax,1  
0013346F  mov         dword ptr [ebp-34h],eax  
00133472  cmp         dword ptr [ebp-34h],0F4240h  
00133479  jge         main+86h (0133486h)  
			value += 2;
0013347B  mov         eax,dword ptr [value]  
0013347E  add         eax,2  
00133481  mov         dword ptr [value],eax  
		}
00133484  jmp         main+69h (0133469h)  
		std::cout << value << std::endl;
00133486  mov         esi,esp  
00133488  push        offset std::endl<char,std::char_traits<char> > (0131325h)  
0013348D  mov         edi,esp  
0013348F  mov         eax,dword ptr [value]  
00133492  push        eax  
00133493  mov         ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (013E0E8h)]  
00133499  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (013E0B0h)]  
0013349F  cmp         edi,esp  
001334A1  call        __RTC_CheckEsp (01312FDh)  
001334A6  mov         ecx,eax  
001334A8  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (013E0B4h)]  
001334AE  cmp         esi,esp  
001334B0  call        __RTC_CheckEsp (01312FDh)  
	}
001334B5  mov         dword ptr [ebp-4],0FFFFFFFFh  
001334BC  lea         ecx,[ebp-28h]  
001334BF  call        Timer::~Timer (01310EBh)  

release模式

	{
		Timer timer;
00DA1215  lea         ecx,[timer]  
00DA1218  call        Timer::Timer (0DA1000h)  
		for (int i = 0; i < 1000000; i++) {
			value += 2;
		}
		std::cout << value << std::endl;
00DA121D  push        offset std::endl<char,std::char_traits<char> > (0DA1580h)  
00DA1222  mov         dword ptr [ebp-4],0  
00DA1229  mov         ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (0DA3068h)]  
00DA122F  push        1E8480h  
00DA1234  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0DA3038h)]  
00DA123A  mov         ecx,eax  
00DA123C  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0DA3034h)]  
	}
00DA1242  lea         ecx,[timer]  
00DA1245  mov         dword ptr [ebp-4],1  
00DA124C  call        Timer::Stop (0DA10D0h)  

汇编代码中,ecx,eax是寄存器。

push和pop是用来操作栈的2个指令。
push寄存器:将一个寄存器中的数据入栈
pop寄存器:出栈用一个寄存器接收数据
16位处理器有14个寄存器,每个寄存器有各自的名字。

14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

32位处理器有16个寄存器,每个寄存器有各自的名字。

16个寄存器:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP、ES、CS、SS、DS、FS、GS、EIP、EFLAGS。

64位处理器有16个寄存器,每个寄存器有各自的名字。

16个寄存器:RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、CS、DS、ES、SS、FS、GS、RIP、RFLAGS。

推荐博客:https://blog.youkuaiyun.com/weixin_40913261/article/details/90762210

RedPanda-CPP:轻量跨平台C++ IDE实战指南与高级特性解析 集成开发环境(IDE)是提升编程效率的核心工具,它通过代码补全、语法高亮、调试器等模块化功能,将编辑、编译、调试等环节无缝衔接。其技术价值在于降低环境配置复杂度,让开发者聚焦于核心逻辑实现,尤其适用于教学、算法竞赛和快速原型开发等场景。本文以轻量级跨平台C++ IDE RedPanda-CPP为例,深入剖析其开箱即用的**GCC编译器**集成和高效的**代码补全**机制,展示如何通过五步实战路径,从环境部署、编码调试到构建配置,快速构建跨平台应用,并详解其题目集、图形库模板等高级特性,为C++学习与开发提供 阅读详情

相关推荐

代码开源(7)——测试程序执行时间

本文介绍两种测试程序时间的方法,一种是通过间隔计数,另一种通过周期计数器。针对这两种方法,分别给出Windows和 UNIX 下的实现。        首先介绍这两种方法的含义,摘自《深入理解计算机系统》。间隔计数:操作系统维护者每个进程使用的用户时间量和系统时间量的计数值,当

wuzhekai的专栏 4963

测试代码CPP

CPP测试代码,存档

KAGUYA233的博客 363

C++ 函数重载与引用:从汇编视角解析 3 种参数传递的性能差异

本文从汇编视角深入解析C++中函数重载与引用的性能差异,对比值传递、指针传递和引用传递三种参数传递方式的底层实现。通过汇编代码分析和性能测试,揭示引用传递作为指针语法糖的本质,并提供实际开发中的选择建议,帮助开发者优化C++代码性能。

weixin_34094282的博客 318

简单基准测试(C++)

市面上有很多强大的IDE都有内置的基准测试工具,但是有些小团队可能给不出那么多的经费购买IDE,那么这个方法在项目开发的前中期也许会是一个不错的选择。

qq_45651072的博客 571

C++微基准测试框架Metron:高精度性能剖析的底层实现与应用

在软件性能优化领域,基准测试是评估代码执行效率的核心手段。其原理在于通过精确测量代码片段的执行时间,量化性能表现,从而指导优化决策。对于C++这类系统级语言,微基准测试的技术价值尤为突出,它能够深入剖析函数、循环乃至单条指令的性能开销,为编译器优化、算法选型和硬件适配提供关键数据。在实际应用场景中,开发者常需评估不同数据结构、算法实现或编译器标志对热点路径的影响。本文聚焦于Metron这一专为C++设计的高精度微基准测试框架,它通过编译期代码生成和底层计时指令(如RDTSC)的结合,将测量系统开销降至极低,

weixin_33674976的博客 608

C++ 函数参数传递:3种方式汇编代码对比,从栈帧看本质差异

本文深入分析C++中值传递、指针传递和引用传递三种函数参数传递方式的底层实现差异。通过GCC生成的x86-64汇编代码和栈帧分析,揭示它们在内存访问、拷贝开销和性能优化上的本质区别,并给出不同场景下的最佳实践建议。

weixin_33794672的博客 545

C++基础:测试

每段代码中有0个或者多个错误。你的任务是找出并排除每个程序中的错误,当你排除了所有的错误之后,得到的程序编译,运行后就会输出“Success!” 即使你认为已经找到了一个错误,你仍然需要输入(原始、未修改的)程序并测试它;因为你可能猜错了,或者程序中还有其他错误。这个练习的另一个目的是让你感受一下编译器对不同错误的反应是怎么样子的。你不需要上面的程序框架25次,用剪贴,粘贴或者类似的技术就可以了。不要通过删除一条语句来逃避问题,你应该试着用修改、增加或删除一些字符来排除问题。

uxiang_blog的博客 1351

⭐⭐⭐⭐⭐Linux C++性能优化秘籍:从编译器到代码,探究高性能C++程序的实现之道

高性能C++编程涉及多个方面,包括编译器优化、C++代码性能优化基本原则、C++对象管理与性能优化、多线程编程与性能优化、Linux系统调用优化等。通过学习和掌握这些要点,程序员可以有效地提高C++程序在Linux环境下的性能。接下来的章节将对这些核心要点进行详细的介绍。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3720

C++性能之战(5)--C++各种循环方式梳理及对比(1)深入到汇编看while和for

0. 写在最前面 本文持续更新地址:https://haoqchen.site/2020/05/08/all-kind-of-loop-1/ 在学习的过程中发现C++有各种各样的循环方式,比如最基本的: for while 后面增加的: std::for_each 基于范围的for循环 std::for_each_n std::transform 这些循环方式各有特点,调用方式也不同。本文将整理他们的异同,并尝试比较他们的效率。很多情况下,程序80%的时间会被20%的代码消耗,而这20%的代码多为循

白夜行的狼 1708

Cppcheck(C/C++ 静态代码检测工具)

Cppcheck是一个用于C/C++代码的静态分析工具,它可以帮助开发者检测代码中的错误。Cppcheck可以检测出许多类型的错误,包括语法错误、未使用的函数、内存泄漏、未初始化的变量等。此外,Cppcheck还支持用户自定义规则,这使得开发者可以根据自己的需求定制Cppcheck的行为。

weixin_39094034的博客 6720

Test_cpp:C ++测试代码

常用方法 1.哈希表 表的存储形式是键值对: key->value ,C ++中有各种map实现了这种结构:map,unorderd_map,hash_map。由于性能优势,使用面广,有许多第三方类库提供了支持,如MSVC中的<hash>和Boost中的<boost>,后来Boost的unordered_map被吸纳进了C ++ 11标准。 (1)1.两数之和 译文描述:给你一个数组,要在多个中找到两个数字a和b ,相加等于target ,返回a和b在数组中的索引。 做法:遍历数组,假设当前遍历到的数是x ,如果能在数组中找到target-x ,就成功了。把已经遍历过的数作为key加入哈希表,它的索引作为value 。迭代遍历时在哈希表中查找key为target-x的值,如果找到,说明没有匹配的,然后把当前元素x作为key加入哈希表继续迭代。

less_slow.cpp - 探索C++、CUDA和汇编代码的高效编码实践

一、关于 less_slow.cpp 相关链接资源 关键功能特性 二、安装 系统要求 依赖说明 安装脚本 三、项目结构 四、Google Benchmark功能 五、趣味内容

AI工程化、开源分享、文档翻译、代码笔记 2002

cpp代码-测试用cpp

cpp代码-测试用cpp

汇编与C/C++内联嵌入汇编

汇编语言格式简介 汇编语言的指令格式,目前有两种不同的标准:Windows下的汇编语言基本上都遵循Intel风格的语法,比如:MASM、NASM;而Unix/Linux下的汇编语言基本上都遵循AT&T风格的语法。 汇编语言语句的通用格式: [名称[:]] 指令码 [第一操作数][,第二操作数] ;注释汇编语言的指令码的操作数的个数可以是0、1、2个;当操作数的个数为2的时候,语句还有两种不同的

谁曾见过风-的博客 6687

cpp单元代码测试

cpptest c++, 单元代码测试。已经经过验证

HelloWorld_cpp:测试的C ++源代码-Source code world

HelloWorld_cpp:测试的C ++源代码 目标 测试sonarQube环境: 创建一个简单的.cpp文件 运行基本的C ++质量工具 获取SonarQube(此处为sonarQube 7.4) 使用的工具(及其版本) CentOS的7.3 gcc(4.8.5) 声纳Qube(7.4) 声纳扫描仪(3.3.0) cppcheck(1.80) valgrind(3.11.0) vera ++(1.3.0) 大鼠(2.4) gcovr(3.3) 氧气(1.8.5) 安装 下载项目: $ git clone https://github.com/ExemplesDev/HelloWorld_cpp.git 构建文档: doxygen Doxyfile #other configuration:Doxyfile2) 构建二进制文件: $ g++ -ansi

突破前端性能瓶颈:cpp-httplib与WebAssembly无缝集成方案

你是否还在为前端复杂计算导致的页面卡顿而烦恼?是否尝试过JavaScript优化却仍无法满足性能需求?本文将展示如何通过cpp-httplib与WebAssembly(Wasm,网页汇编)的创新组合,将C++的高性能计算能力引入浏览器环境,彻底解决前端性能瓶颈。读完本文,你将掌握从C++后端到前端Wasm模块的完整集成流程,以及如何通过HTTP接口实现两者的高效通信。 ## 技术架构概览 cp...

gitblog_00509的博客 425

操作系统原理:【优麒麟】linux内核添加系统调用

在底端添加如下代码。

Joyce_zz的博客 2709

C++ 引用与指针深度对比:从汇编视角看 3 种参数传递的性能开销

本文深入探讨了C++中值传递、指针传递和引用传递三种参数传递方式的底层实现机制,通过汇编代码对比和性能基准测试,揭示了它们在不同场景下的性能开销差异。研究发现,对于基本类型,三种方式性能相近;但对于大对象,值传递性能显著下降,而指针和引用性能相当。文章还提供了现代C++中参数传递的最佳实践建议,帮助开发者优化代码性能。

chouxuyi9789的博客 328

dmx512协议c语言编程,DMX512协议+c程序代码.pdf

DMX512 协议1.协议简介DMX 是Digital MultipleX 的缩写 ,意为多路数字传输。DMX512 控制协议是美国舞台灯光协会(USITT)于1990 年发布的灯光控制器与灯具设备进行数据传输的工业标准 ,全称是 USITT DMX512(1990) ,包括电气特性、数据协议、数据格式等方面的内容。2. 电气特性和物理层2.1. 电气特...

weixin_39928993的博客 2543

告别Keil/IAR:在VSCode中用CMake+Clangd打造丝滑的STM32开发环境(附完整配置)

本文详细介绍了如何在VSCode中使用CMake和Clangd搭建高效的STM32开发环境,替代传统的Keil/IAR工具。通过完整的配置指南和快速开发技巧,帮助开发者实现轻量级、高度可定制的现代化开发流程,显著提升STM32项目的开发效率。

weixin_26843605的博客 164
上一篇: pytorch学习01:基础卷积运算
下一篇: 万门c++课:float
dlvector
博客等级 码龄10年 85粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值