关于 高精度性能计数器的频率 和 cpu 频率 不一致问题

/*
rdtsc指令, 该指令返回CPU自启动以来的时钟周期数;该时钟周期数,即处理器的时间戳。在CPU通电启动后,首先会重置EDX和EAX,在每个时钟周期上升或下降沿到来时,会自动累计周期数,并被记录到EDX和EAX寄存器中,EDX是高位,EAX是低位。rdtsc指令就是从该寄存器中进行获取的。周期和频率的关系公式:T(周期)=1/f(频率)如CPU频率f为1GHz,则其时钟周期T=1/1GHz秒,意味着每隔T秒,CPU完成一个最基本的动作,并在寄存器中,对周期数加1。故,假设当前时钟周期数为m,则可计算出CPU自启动后,累计运行时间X=m*T高精度性能计数器的频率是不变的,而且比cpu(平均)频率低得多
*/#include <iostream>
#include <windows.h>
using namespace std;#define read_tsc(tsc) \long long tsc; \_asm rdtsc \_asm mov dword ptr[tsc],eax \_asm mov dword ptr[tsc+4],edx#define read_hrpc(pc) \LARGE_INTEGER pc; \QueryPerformanceCounter(&pc);int main()
{read_hrpc(pc1);read_tsc(tsc1);cout << "waiting..." << endl;Sleep(1000);read_tsc(tsc2);read_hrpc(pc2);LARGE_INTEGER freq;QueryPerformanceFrequency(&freq);double elapse = (pc2.QuadPart - pc1.QuadPart) / (double)freq.QuadPart;double cpu_freq = (tsc2 - tsc1) / elapse;cout << "perf freq:\t" << freq.QuadPart / 1000.0 / 1000 << "\tMHz" << endl;cout << "cpu freq:\t" << cpu_freq / 1000 / 1000 / 1000 << "\tGHz" << endl;return 0;
}

  

 

备注:

QueryPerformanceFrequency将获得一个频率Freq,它表示高性能计时器1秒钟的计数次数,也就是说QueryPerformanceCounter获得的时间是一个计数值,其单位是秒。

高性能计时器的精度:在笔者的电脑上,频率Freq为3134267,一个计数的时间是秒,也就是0.319微秒或319纳秒。这也就是高性能计时器的精度。

高性能计时器的归零:QueryPerformanceCounter获得的计数是一个有符号的64位整数。频率Freq为3134267的Windows在连续运行9.3万年后,QueryPerformanceCounter获得的计数才可能归零。

需要注意:并不是所有的电脑都支持QueryPerformanceCounter,返回0不支持。

内联汇编VS 64位 改 32位。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/878008.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《操作系统真象还原》第十一章 TSS与用户进程

本文介绍了TSS(Task State Segment)的概念及其在操作系统中的应用。TSS是用于存储任务状态的数据结构,每个任务都有自己的TSS,包含任务切换时需要保存和恢复的信息。Intel建议为每个任务关联一个TSS,CPU通过TR寄存器指向当前任务的TSS,实现任务切换。现代操作系统采用基于…

【渗透测试】Vulnhub GROTESQUE 1.0.1

渗透环境 攻击机: IP: 192.168.10.18(Kali) 靶机: IP:192.168.10.9 靶机下载地址:https://www.vulnhub.com/entry/grotesque-101,658/ 涉及知识点:WordPress扫描(WPScan)、WrodPress反弹shell、Keypass文件解密进行渗透 一、 获取端口信息 nmap或者arp-scan都能…

DeepSeek 全面指南,95% 的人都不知道的9个技巧(建议收藏)

大家好,我是汤师爷~ 最近,DeepSeek这款AI工具爆火国内外。 虽然许多人都开始尝试使用它,但有人吐槽说,没想象中那么牛。 其实问题不在工具,很多人的使用姿势就搞错了,用大炮打蚊子,白白浪费DeepSeek的强大功能。 接下来,我将为大家分享9个实用技巧,你会发现DeepSeek远…

ez_pz_hackover_2016(shellcode)

首先检查一下保护,发现没有开启NX保护,说明可以往栈上写shellcode 首先要确定距离ebp的偏移,还有shellcode的地址(将ret覆盖到shellcode的地址上)确定离ebp偏移的代码 from pwn import * io=process("./ez_pz_hackover_2016") context.log_level=debug gdb.atta…

Android Studio 2024 不需要三方插件,直接wifi 开发调试,真方便

在测试旧版本时,wifi插件折腾了几天,还是没折腾上,最后下载了最新Android Studio Ladybug Feature Drop | 2024.2.2版本,发现居然已经集成,且放到了最显眼的位置,wifi开发,一步到位了。手机中,进开发者模式,选中 无线调试 ,再点使用二维码配对设备然后扫码,即可,…

Maven高级 -2025/1/22

分模块开发 依赖管理 可选依赖 <dependency><groupId>com.itheima</groupId><artifactId>maven_03_pojo</artifactId><version>1.0-SNAPSHOT</version><!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递-…

独立开发经验谈:如何借助 AI 辅助产品 UI 设计

我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户,在这个过程中,我也积累了不少如何开发运营一款独立产品的经验。我将在本文中介绍如何借助 AI 辅助产品…

Lazarus4Android 环境搭建

Lazarus4Android 开发环境搭建Lazarus4Android 开发环境搭建 一、下载相关文件最关键的就是这两个文件,其他的JDK、NDK、Java环境另说。 这里要注意,gradle版本必须小于7,不然无法使用。 二、IDE内部设置 安装完成laz4A之后可能会报错,无需理会,启动IDE即可。安装卸载软件…

14-断点调试单个用例

在pycharm的Terminal输入hytest,其实是输入了python -m hytest.run,意思就是执行了hytest包里面的run.py文件 然后再点击debug按钮的时候就可以进行调试了,相当于执行了cd H:\my\autotest后 python.exe -m hytest.run --test *0101

博图18安装过程记录

博图V18安装过程记录刚开通博客园,搬运一些之前的帖子过来。 博图18安装过程记录 下载 西门子中智赛官网给的链接,是正版软件。 安装 TIA Potral STEP7将ISO解压或装载。管理员身份运行。 选择典型安装,等待安装完成。 插曲1 无法更改安装路径 这是因为之前安装过博图15.1(或…

题解:P11617 递推

前言 第一次在 OI 中见到求数列极限的题,有点意思。 但是为什么会过这么多人啊。 思路分析 做一点尝试: \[\sum_{i=m} \sum_{j=0}^{m} r_ja_{i-j}=0 \]然后对于相同的 \(a_i\),合并同类项: \[\sum_{i=m}\sum_{j=0}^{m} r_ja_i + \sum_{i=0}^{m-1}\sum_{j=0}^{i} r_{m-j}a_i…