社区
C语言
帖子详情
求助:计算程序某个模块的运行所耗时间
na1ve
2005-08-13 01:57:29
也就是为了测试不同的算法的执行效率,时间精度可否达到微妙级以上,如0. 000 000 1秒,怎么实现呢?我只能做到毫秒级,请高手提示。
是否能利用CPU本身时钟?
...全文
217
7
打赏
收藏
求助:计算程序某个模块的运行所耗时间
也就是为了测试不同的算法的执行效率,时间精度可否达到微妙级以上,如0. 000 000 1秒,怎么实现呢?我只能做到毫秒级,请高手提示。 是否能利用CPU本身时钟?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
51365133
2005-08-16
打赏
举报
回复
#include <stdio.h>
#include <windows.h>
#include <winbase.h>
int main()
{
int begin=GetTickCount();
for (int i=0;i<9999999;i++);
int end=GetTickCount();
printf("一共执行了%d",end-begin);
system("pause");
return 0;
}
xiaocai0001
2005-08-16
打赏
举报
回复
//刚在网上看到一个程序
//运行时间不能太长,太长了时间就不对了
long HighStart,LowStart,HighEnd,LowEnd;
long numhigh,numlow;
//获取代码运行开始时cpu内部计数器的值
__asm
{
RDTSC
mov HighStart, edx
mov LowStart, eax
}
//自己的程序代码放在这里
__asm
{
RDTSC
mov HighEnd, edx
Mov LowEnd, eax
;获取两次计数器值得差
sub eax, LowStart
cmp eax, 0 ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大
jg L1
neg eax
jmp L2
L1: mov numlow, eax
L2: sbb edx, HighStart
mov numhigh, edx
}
//把两个计数器值之差放在一个64位的整形变量中
//先把高32位左移32位放在64的整形变量中,然后再加上低32位
__int64 timer =(numhigh<<32) + numlow;
//输出代码段运行的时钟周期数
//以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^
cout<<"Time elapsed: "<< (double) (timer /1.7/1000000000) << endl;
//获取代码结束时cpu内部计数器的值,并减去初值
trackant
2005-08-16
打赏
举报
回复
是windows的API
可以用Intel处理器本身的时间戳,精度达到cpu时钟周期的量级,但要嵌入汇编代码,而且多半不需要这样高的精读,不建议使用。
如果算法的效率有很明显的差距,能给理论结果就差不多了,如果确实要测试且要较高精度时,可以提高问题的规模,或将算法循环执行多次并测量运行总时间,再取平均值。
na1ve
2005-08-16
打赏
举报
回复
C语言里怎么实现呢?
na1ve
2005-08-16
打赏
举报
回复
QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数 是否windows API?
我在BCB里运行不了
na1ve
2005-08-16
打赏
举报
回复
看不大懂,先试试
谢谢了
cenlmmx
2005-08-13
打赏
举报
回复
QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型为:
BOOL QueryPerformanceFrequency(LARGE—INTEGER *lpFrequency);
BOOL QueryPerformanceCounter(LARGE—INTEGER *lpCount) ;
----------------------------------------------------------------------
typedef union —LARGE—INTEGER
{
struct
{
DWORD LowPart; // 4字节整型数
LONG HighPart; // 4字节整型数
};
LONGLONG QuadPart;
// 8字节整型数
} LARGE—INTEGER;
LARGE—INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
// 获得计数器的时钟频率
dfFreq = (double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);
// 获得初始值
QPart1 = litmp.QuadPart;
Sleep(100) ;
QueryPerformanceCounter(&litmp);
// 获得终止值
QPart2 = litmp.QuadPart;
dfMinus = (double)(QPart2 - QPart1);
dfTim = dfMinus / dfFreq;
// 获得对应的时间值
Toad 使用快速入门
在Oracle应用
程序
的开发过程中,访问数据库对象和编写SQL
程序
是一件乏味且耗费时间的工作,对数据库进行日常管理也是需要很多SQL脚本才能完成的。Quest Software为此提供了高效的Oracle应用开发工具-Toad(Tools of ...
C#微软培训资料
2.2 公用语言
运行
时环境与公用语言规范.13 2.3 开 发 工 具 .17 2.4 小 结 .19 第三章 编写第一个应用
程序
.20 3.1 Welcome
程序
.20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 ...
区块链之Go语言设计模式
在朋友聚会上碰到了一个美女Sarah,从拉斯维加斯来的,可我不会说粤语,她不会说普通话,只好
求助
于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我)。 &...
linux常用命令。(持续更新)
1.gdb:flash builder模拟客户端
运行
程序
,这时服务器挂在内存中
运行
,如果此时发送了请求而
程序
中的某个
模块
没有正确
运行
,就需要进行调试,gdb就是很好的工具,常用的命令是,gdb + 可执行文件, gdb -c core文件 ...
【Linux命令】《鸟哥Linux基础》第二十一章 软件安装:源代码与Tarball
了解:如何将开放源码的
程序
设计、加入函数库的原理、通过编译而成为可执行的二进制
程序
,最后该文件可被我们所使用的一连串过程。 这一章介绍最原始的软件管理方式,使用Tarball来安装与升级管理我们的软件。 ...
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章