性能测试的时间间隔获取方法

性能测试的时候,一个问题就是时间间隔,有很多时间函数能获取时间,从而求取时间间隔。关于这方面的文章很多,我就不重复了,这里只是提供一些基本的信息,从而方便我自己做性能测试使用:

(1)C语言时间函数clock()和clock_t:

time.h中的C语言时间函数clock()能获取当前时间。需要注意的是,这个函数在Windows和Linux下是通用的,但是其返回值的单位是不同的,一个是毫秒,一个是微秒。

从单位也可以看出该方式获取时间的精度。总体来说,其精度在毫秒级,所以测试性能的时候,对于粗时间间隔的测试,用这个函数就足够了。

需要注意的是:在Linux上,clock()获取的是CPU时间,不是wall-clock时间,所以如果使用了sleep()等函数,那么是不会计算在内的。但是在Windows平台上,clock()获取的时间包括Sleep()等函数的时间,所以使用clock()的时候要注意这一点,在Linux上得到的很可能不是一个正确的Elapsed time。

(2)利用CPU获取高精度时间rdtsc寄存器

rdtsc是一个64位的寄存器,新的CPU都具备这个寄存器,用于记录从计算机启动开始CPU经过的时钟周期,可见其精度之高是和CPU的频率级别的。

可以参考http://blog.sina.com.cn/s/blog_5d9051c00100jcsn.html的文章。

由于是寄存器,所以只要使用汇编读取寄存器的值就可以得到时间了,具体关于汇编的写法有一些不同的形式,具体可以参考网上的写法,而且windows和Linux下也可能是有一些区别。需要注意的是,即使都是在Linux下或都是Windows下,编译64位和32位的时候,其写法也会不一样,参考:http://www.phpzy.com/php/1068620.htmlhttp://www.uplook.cn/index-Index-show-view2681.html?treeid=624(如果错误使用,得到的时间间隔可能为负数)

PS:在Linux上,-m32和-m64选项分别表示生成32位和64位程序,使用-m32会定义__i386__宏,使用-m64则使用__x86_64__宏。

关于Windows上,也可以使用rdtsc寄存器,但是windows上生成64位程序的时候,不知道该如何获得正确值,参考http://sunxiunan.com/?p=983里面有64位的情况,但是只能用于Itanium CPU上。根据MSDN的说明(http://msdn.microsoft.com/en-us/library/ee417693.aspx),不建议使用rdtsc寄存器,建议使用更精确的windows API的QueryPerformanceCounter和QueryPerformanceFrequency。

(3)Windows平台的QueryPerformanceCounter和QueryPerformanceFrequency的使用:

参考:http://www.oschina.net/code/snippet_197161_6789

(4)Timing.h和测试:

下面是能运行于Linux和Windows的代码,可以用于计算程序运行时间,对于一样的性能测试,应该可以胜任。

// Timing.h
#ifndef TIMING_H
#define TIMING_H

#include <time.h>
#include <stdio.h>

#ifdef WIN
#include <windows.h>
#define timing_t double
static _LARGE_INTEGER time_start, time_over;
static double dqFreq;

static inline void startTiming()
{
_LARGE_INTEGER f;
QueryPerformanceFrequency(&f);
dqFreq=(double)f.QuadPart;

QueryPerformanceCounter(&time_start);
}

// unit: ms
static inline timing_t stopTiming()
{
    QueryPerformanceCounter(&time_over);
    return ((double)(time_over.QuadPart-time_start.QuadPart)/dqFreq*1000);
}

static inline timing_t stopWithPrintTiming()
{
    timing_t timing;
QueryPerformanceCounter(&time_over);
    timing = ((double)(time_over.QuadPart-time_start.QuadPart)/dqFreq*1000);
    printf("----------Elapsed Timing(ms) : %.3lf\n", timing);
    printf("----------------------------------------\n");

    return timing;
}

#else
#include <unistd.h>
typedef unsigned long long int64;
#define timing_t int64
#if defined(__i386__)
inline int64 GetCycleCount() {
    int64 result;
    __asm__ __volatile__ ("rdtsc" : "=A" (result));
    return result;
}
#elif defined(__x86_64__)
inline int64 GetCycleCount() 
{
    int64 hi, lo;
    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
    return ( (int64)lo)|( ((int64)hi)<<32 );
}
#endif

static int64 ticks_start, ticks_end;

static inline void startTiming()
{
ticks_start = GetCycleCount();
}

// unit: cycles
static inline int64 stopTiming()
{
    ticks_end = GetCycleCount();
    return (ticks_end - ticks_start);
}

static inline int64 stopWithPrintTiming()
{
    int64 timing;
    ticks_end = GetCycleCount();
    timing = (ticks_end - ticks_start);
    printf("----------Elapsed Timing(Cycles) : %llu\n", timing);
    printf("----------------------------------------\n");

    return timing;
}
#endif

// unit: ms
static inline void wait(int ms)
{
#ifdef WIN32
    Sleep(ms);
#else
    usleep(ms*1000);
#endif
}

#endif

// foo.cpp
#include "timing.h"

int main()
{
timing_t ticks_start, ticks_end;
startTiming();

    wait(3000);// 3 seconds
    timing_t timing = stopWithPrintTiming();

    return 1;
}


Windows上编译:cl foo.cpp /DWIN,分别启动64bit和32bit的VS控制台进行测试。

Linux上编译:gcc foo.cpp -m32和gcc foo.cpp -m64进行测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WinMTR 中文版是 Laurentiu Stanimir 开发的一款网络诊断工具,集成了 tracert 与 ping 这两个命令的图形界面,使用 WinMTR 可以直接的看到各个节点的响应时间及丢包率,适合 Windows 下做路由追踪及 Ping 测试。使用方法简单,WinMTR 不需安裝,解压之后即可执行。 路由跟踪测试小工具 WinMTR 中文版 路由跟踪测试小工具 WinMTR 中文版 WinMTR 是一个轻便的便携式应用程序,结合了 Ping 和 Traceroute 命令来测试计算机与主机之间的通信。 由于不需要安装,因此您只需将可执行文件拖放到硬盘上的某个位置,然后单击它即可运行。一种替代方法是将 WinMTR 保存到 USB 闪存盘,以便在任何计算机上以最小的努力运行它。 要考虑的一个重要方面是 Windows 注册表不会获取新条目,并且一旦删除该工具,文件就不会保留在磁盘上。 该界面基于布局合理的基本窗口,您可以在其中编写主机名或IP地址,并在刷新率,LRU 列表中的最大主机数和 ping 大小时配置设置。您也可以要求 WinMTR 解析名称。 结果显示ID号,发送和接收的数据包,最佳,最差,平均值和最后值,以及丢失数据包的百分比。该报告可以导出为纯文本或HTML以进行进一步检查,也可以复制到剪贴板(如 TXT 或 HTML)。 WinMTR 中文版所需的 CPU 和 RAM 最少,因此不会对系统性能造成压力。它具有良好的刷新率,并且在最小化到任务栏时不会中断用户活动。在整个评估过程中,我们没有遇到任何问题。 WinMTR在较新的操作系统上可以平稳运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_72431373

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值