Linux下使用benchmark进行性能测试

3 篇文章 0 订阅

1、背景

继《Linux下使用gtest对接口进行单元测试》一文之后,Google还有一个实用工具:benchmark;他是基于c++11的性能测试工具,写法方面跟gtest十分类似

2、实践

实践这块正好使用bm这个工具,正好结合测试了一下leveldb的读写性能,课题背景是调研leveldb单条写入的测试,后续还继续对比redis、sqlite相关性能;

2.1 实现

首先构造一个类bm_level,与gtest类似,实现setup、teardown方法。

#include <list>
#include <string>

#include <benchmark/benchmark.h>
#include <leveldb/db.h>
#include <leveldb/write_batch.h>

class bm_level:
    public ::benchmark::Fixture
{
public:
    leveldb::DB *_db;
    leveldb::Options _opt;

    void SetUp(const ::benchmark::State &st)
    {
        leveldb::Status res;
        _opt.create_if_missing = true;
        res = leveldb::DB::Open(_opt, "bm2.db", &_db);
        if (!res.ok()) {
            printf("DB::open, %s\n", res.ToString().c_str());
        }
    }

    void TearDown(const ::benchmark::State &)
    {
        delete _db;
    }
};

然后构造第一个测试方法,创造一个list,然后进行增删改操作:
注意for (auto _ : state)的地方为计时的地方。然后测试规模times由外部获取。

BENCHMARK_DEFINE_F(bm_level, easy)(benchmark::State &state)
{
    leveldb::Status res;
    const int times = static_cast<int>(state.range(0));
    std::list<std::pair<std::string, std::string>> list;

    for (int ix = 0; ix < times; ix++) {
        list.push_back(std::pair<std::string, std::string>(std::to_string(ix), std::to_string(ix)));
    }

    for (auto _ : state) {
        for (auto &pair : list) {
            res = _db->Put(leveldb::WriteOptions(), pair.first, pair.second);
            if (!res.ok()) {
                break;
            }
        }

        for (auto &pair : list) {
            std::string val;
            res = _db->Get(leveldb::ReadOptions(), pair.first, &val);
            if (!res.ok()) {
                break;
            }
        }

        for (auto &pair : list) {
            res = _db->Delete(leveldb::WriteOptions(), pair.first);
            if (!res.ok()) {
                break;
            }
        }
    }
}

ok基本完成,最终构建入口测试,测试规模分别从1024到32768(2^15)

BENCHMARK_REGISTER_F(bm_level, easy)->Range(1 << 10, 1 << 15);

2.2 运行

编译需要依赖libbenchmark、libbenchmark_main :

g++ -std=c++11 bm_level.cpp -lleveldb -lbenchmark -lbenchmark_main -o bm_level -Wall -O3 -Os

Running ./bm_level
Run on (1 X 2394.45 MHz CPU )
CPU Caches:
  L1 Data 32K (x1)
  L1 Instruction 32K (x1)
  L2 Unified 4096K (x1)
------------------------------------------------------------
Benchmark                     Time           CPU Iterations
------------------------------------------------------------
bm_level/easy/1024      6473115 ns    5874249 ns        142
bm_level/easy/4096     24995781 ns   21576585 ns         48
bm_level/easy/32768   141431213 ns  111995007 ns          8

可见benchmark在运行过程中,将自动选择合适的迭代次数(Iterations),然后得出开销时间。

3 结论

Benchmark从编程风格上比较贴近与gtest,用过gtest对bm的编码上手将比较方便。同时,测试接口也可以不局限于c++,测试c的代码也是支持的。
注意的地方是在测试用例中,某些函数会出现被编译器优化,还得加入benchmark::DoNotOptimize操作,其他的详细用法,可以参见Benchmark官方的项目说明

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux测试并发连接数可以使用一些工具和命令来完成。以下是一种常用的测试方法: 1. 使用Apache Benchmark(ab)命令进行测试。ab是一个用于进行性能测试的工具,可以模拟多个并发连接,并测量服务器的响应时间。 使用命令:ab -n 总请求数 -c 并发数 URL 例如,要发送100个请求并发数量为10的连接,可以使用以下命令:ab -n 100 -c 10 http://localhost/ 此命令将输出关于请求数、吞吐量、连接时间和响应时间等方面的统计信息。 2. 使用Siege工具进行测试。Siege是另一个用于进行并发性能测试的工具,它提供了更多的选项和细节来进行测试和分析。 使用命令:siege -c 并发数 -r 总请求数 URL 例如,要进行50个并发连接的100个请求的测试,可以使用以下命令:siege -c 50 -r 100 http://localhost/ Siege还提供了其他选项,如持续时间、延迟时间、随机URL等。 3. 使用自定义脚本进行测试。如果需要更加灵活和定制的测试,可以编写自己的脚本来模拟多个并发连接并发送请求。 使用网络编程语言(如Python、Java等)编写脚本,创建多个并发连接,发送请求,并记录响应时间和其他相关指标。 这种方法需要熟悉编程语言和网络编程的知识,但可以提供更加精确和定制的性能测试。 无论使用哪种方法,测试并发连接数可以帮助我们评估服务器的性能和承载能力,以便优化和调整系统配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值