1、基准测试简介
基准测试(Benchmark)是指通过运行一系列标准化的测试来评估系统或组件的性能。根据维基百科的定义,基准测试是运行计算机程序、一组程序或其他操作的行为,以评估对象的相对性能,通常是通过对其运行许多标准测试和试验。
许多成熟的GitHub开源项目都采用了基准测试结果作为性能依据。在.NET代码世界中,我们通常使用BenchmarkDotNet类库来进行性能测试。
BenchmarkDotNet支持以下环境:
- 编程环境:.NET Framework (4.6+), .NET Core (2.0+), Mono, CoreRT
- 支持语言:C#, F#, Visual Basic
- 操作系统:Windows, Linux, macOS
该工具可以方便地生成测试数据和图表,帮助开发者更好地理解系统的性能表现。
2、微服务访问效率测试
在我们公司,当前使用的微服务框架是基于Thrift封装的。有时会有人建议将其转换为HTTP API,但为了确保这一决策的合理性,我们决定先进行性能测试。
我们选择了.NET Core版本进行测试,其他版本暂不考虑。
以下是测试代码示例:
// 选择两组数据,1000次和10000次访问
[CoreJob(baseline: true)]
[RPlotExporter, RankColumn]
public class TestAbc
{
[Params(1000, 10000)]
public int N;
private Qt2Api api = new Qt2Api(new UserContext
{
Token = "04100ccc-0ac5-4ec7-ba53-9ad5fcfac2c4"
});
[GlobalSetup]
public void Setup()
{
ServerSetting.Initialize("abb", 1);
SCMBaseServiceRpcProxyManager.Initialize();
}
// 这是Thrift RPC调用
[Benchmark]
public GetListWmsWareHousesResult RpcCall() => CommTools.GetListWmsWareHouses(new RpcContext(null, new Args
{
tk = "04100ccc-0ac5-4ec7-ba53-9ad5fcfac2c4"
}), out StatusCode code);
// 这是HTTP API调用
[Benchmark]
public Nullables ApiCall() => api.Call("/mark/Test", new Nullables());
}
3、测试结果
在Windows平台下,Thrift和HTTP API的性能差异仅为10毫秒,这表明HTTP API的性能表现相当不错。从最大值来看,两者相差20毫秒。如果对性能有较高要求,选择RPC(如Thrift)是一个不错的选择,因为数据库查询的时间通常也只有几毫秒甚至纳秒。