关闭

通用型C/C++程序性能测试Benchmark的简单实现

标签: c++测试性能测试benchmark
25393人阅读 评论(0) 收藏 举报
分类:

     在完成一个算法的改进后, 除了人工估算时间复杂度外, 我们可能还希望直观地检测改进效果, 现有的性能分析工具比如Intel® VTune™ Amplifier自然满足需求, 然而有时候使用第三方工具的成本却可能超出我们的所需(也许我们仅仅需要大概地对比便能得到结果), 或者我们希望能在代码中控制测试流程, 这时写一个Benchmark便是首选了.

     本文实现了一个简单的通用型Benchmark框架, 因为简单, 它所能得到的信息也十分有限, 不过这已经足够了.(如果你需要更为强健的framework, 推荐使用Celero, C++ Benchmark Authoring Library/Framework)

 

//compiled with /UNICODE
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <RLib_Import.h>

#if _DEBUG
#pragma comment(lib, "RLib_d.lib")
#else
#pragma comment(lib, "RLib.lib")
#endif // _DEBUG

using namespace System;

//-------------------------------------------------------------------------

static Timer timer; //Timer是对高精度计时API QueryPerformanceCounter 的简单封装

//-------------------------------------------------------------------------

static void show_benchmark_result(double interval, const String &prefix = Nothing)
{
	GlobalizeString u_prefix(prefix + _T("运行耗时:") + String().Format(_T("%f"),
		 interval * 1000) + _T("ms") RLIB_NEWLINE);
	printf(u_prefix.toGBK());
}

//-------------------------------------------------------------------------

#define SAMPLE_COUNT 1024 //采样次数
void test1()
{
}

//-------------------------------------------------------------------------

void test_wrapper(RLIB_TYPE(test1) *test_t, const String &test_name)
{
	printf(RLIB_NEWLINEA);

	double intervals[SAMPLE_COUNT];
	for (int i = 0; i < RLIB_COUNTOF(intervals); ++i) {
		timer.BeginTimer();
		test_t();
		timer.EndTimer(); 
		intervals[i] = timer.GetDoubleTimeSpan();

		//show_benchmark_result(intervals[i]);
	} //for

	double imin = intervals[0], imax = intervals[0];
	for (int i = 1; i < RLIB_COUNTOF(intervals); ++i) {
		intervals[0] += intervals[i];
		imax = max(imax, intervals[i]);
		imin = min(imin, intervals[i]);
	}
	show_benchmark_result(imin, _T("最小"));
	show_benchmark_result(imax, _T("最大"));
	show_benchmark_result((intervals[0] - imax - imin) / (RLIB_COUNTOF(intervals) - 2),
						  test_name + _T(" 平均"));
}

//-------------------------------------------------------------------------

int _tmain(int argc, _TCHAR* argv[])
{
	test_wrapper(test1, _T("测试例名"));
	printf(RLIB_NEWLINEA);
	system("pause");
	return argc;
}


此外, 如果调用API不是很方便, 还可以借助rdtsc指令获取大概的CPU时钟周期进行估计.

 

 

0
0
查看评论

google开源的C++性能分析工具 - gperftools

gperftools是Google提供的一套工具,其中的一个功能是CPU profiler,用于分析程序性能,找到程序的性能瓶颈。 Graphviz是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形,gperftools依靠此工具生成图形分析结果。 安装命令:yum...
  • okiwilldoit
  • okiwilldoit
  • 2016-03-14 11:02
  • 3421

一个简单的C++性能测试工具(ms级别)

一个简单的C++性能测试工具,最多只精确到ms级别,优点是简单易用,跨平台。
  • lee353086
  • lee353086
  • 2016-12-19 15:55
  • 1126

Linux下C++ 性能测试工具GPROF()入门教程

一、前言 参考GPROF用户数手册:http://sourceware.org/binutils/docs-2.17/gprof/index.html 参考博客:http://blog.csdn.net/stanjiang2010/article/details/5655143 GPROF是G...
  • luchengtao11
  • luchengtao11
  • 2017-07-10 12:24
  • 414

C/C++ 服务端性能评测和检测优化工具

硬件服务器的稳定性 可以通过烤机软件:随便网上搜个跑跑看,顺便统计下网路的稳定性 服务器端程序的优化评测: 英特尔工具套件 1、Intel Parallel Amplifier 2、 VTune Performance Analyzer 3、 Intel Thread Profiler ...
  • huapeng_guo
  • huapeng_guo
  • 2016-03-23 23:22
  • 1327

C++ STL容器的Benchmark[转贴]

   Standard Container Benchmark   作者留言PolyRandom我的机器上的运行结果在最后面,不知道大家的机器上运行结果是什么。
  • newsuppy
  • newsuppy
  • 2004-07-25 09:08
  • 2244

Google benchmark:一个简单易用的C++ benchmark库

在写C++程序的时候,经常需要对某些函数或者某些类的方法进行benchmark。一般来说,我们可以写一些简单的程序来进行测试, 然后跑一定的次数(比如10w次),看看跑了多久。 比如我写了下面这个从int到string的转换程序: 1 2 3 4 5 6string uint2str(unsign...
  • Tornado1102
  • Tornado1102
  • 2017-09-14 10:50
  • 306

C语言函数调用性能测试

原文链接:  http://www.cnblogs.com/woshare/p/4720771.html 在i5 3.1GHz下: 1024字节栈,需要约300纳秒; 64字节栈,需要200纳秒。
  • littlefang
  • littlefang
  • 2015-08-13 15:12
  • 1589

C++文件简单读入读出测试

对于程序来说,不管后缀名如何,文件分为两种类型:文本文件和二进制文件。C语言里有一系列文件操作函数。区分文本和二进制文件,需要在打开文件时设置不同的控制符变量mode即可。fopen的函数原型:FILE * fopen(const char * path,const char * mode);fop...
  • why850901938
  • why850901938
  • 2016-06-17 22:19
  • 554

C++实现服务器压力测试框架

C++实现服务器压力测试框架 flyfish 2015-3-9 模拟大量客户端对服务器进行压力测试框架 头文件 #pragma once #include #include #include #include #include class CSession: p...
  • flyfish1986
  • flyfish1986
  • 2015-03-09 18:27
  • 3667

程序性能的初步优化与分析(以 C++ 为例)

去年圣诞节浏览了 Milo Yip 的文章 “如何用 C 语言画一棵圣诞树” 后,对这个圣诞树生成算法很感兴趣。 下面对这个程序,做一些简单的优化分析...
  • andytimes
  • andytimes
  • 2016-06-09 02:59
  • 676
    联系作者
    通过QQ与我联系(全天候7*24小时基本不在线)
    最新评论
    免责声明
    如果转载的文章侵犯了您的版权,请务必告知,我将立刻删除;
    博客所有文章允许转载,原创类不要求注明出处,随意就好;
    如果是转载的文章,建议直接转载原始来源,因为原作者极可能有更新