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

标签: c++ 测试 性能测试 benchmark
25680人阅读 评论(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时钟周期进行估计.

 

 

查看评论

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

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

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

一、前言 参考GPROF用户数手册:http://sourceware.org/binutils/docs-2.17/gprof/index.html 参考博客:http://blog.csdn....
  • luchengtao11
  • luchengtao11
  • 2017-07-10 12:24:35
  • 829

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

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

一个完整系统的测试过程

一、           需求审查方面 首先我们从最开始接触的文档开始,那就是测需求文档;需求审查主要是我们对需求文档的理解,并熟透整个系统的每个功能和流程,对后期所有的测试建立思路,后续的工作基本...
  • Va_Tsai
  • Va_Tsai
  • 2016-05-23 21:54:14
  • 23019

程序性能分析及性能测试

这里所说的程序是指对外提供tcp/ip交互协议的服务性程序。网络程序性能分析很重要,比如随着网络请求流量越来越大,我们需要知道已部署的服务能不能满足需求。这里采用对网络服务程序进行建模的方法分析影响程...
  • MICweaver
  • MICweaver
  • 2014-11-08 20:48:53
  • 7734

软件性能测试完整指南

译文 | 软件性能测试完整指南 作者 | Angela Stringfellow 来源 | DZone 原文 | https://dzone.com/articles/a-com...
  • abdstime
  • abdstime
  • 2017-05-26 13:50:43
  • 1545

Java程序性能测试

Java程序性能测试1 概述在开发中,性能测试是设计初期容易忽略的问题,开发人员会为了解决一个问题而“不择手段”,作者所参与的项目中也遇到了类似问题,字符串拼接、大量的网络调用和数据库访问等等都对系统...
  • freshmanya
  • freshmanya
  • 2004-11-28 17:02:00
  • 2016

测试我们的程序性能

测试我们的程序性能 在开发iphone程序的时候,如果程序会有较大的开销并且希望运行在配置较低的早期设备上,我们就需要解决一些在设备环境窘迫的时候出现的性能问题,程序性能优化调整上升为一个不可忽视的...
  • ArthurChenJS
  • ArthurChenJS
  • 2011-08-17 22:59:12
  • 6988

软件性能测试的几种方法

首先我们来看看什么是软件性能?         软件的性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,而是在完成该功能时展示出来的及时性。 表明了软件系统对时间及时性及资源经...
  • youngyunq
  • youngyunq
  • 2015-11-27 22:27:14
  • 6819

程序压力测试

在面试测试人员的时候,这是一个很好的问题:你如何定义性能/负载/压力测试?在很多时候,人们都是将它们作为可互相替换的相同术语来使用,然而实际上他们之间的差异是比较大的。这个贴子是根据我自己的一些经验,...
  • qbook
  • qbook
  • 2014-05-28 10:34:16
  • 2912
    最新评论