iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c++性能测试工具之计算时间复杂度的示例分析
  • 336
分享到

c++性能测试工具之计算时间复杂度的示例分析

2023-06-15 08:06:14 336人浏览 独家记忆
摘要

小编给大家分享一下c++性能测试工具之计算时间复杂度的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Google benchmark已经为我们提供了类似的功能,而且使用相当简单。具体的解释在后面,我们先来看几个例子

小编给大家分享一下c++性能测试工具之计算时间复杂度的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

Google benchmark已经为我们提供了类似的功能,而且使用相当简单。

具体的解释在后面,我们先来看几个例子,我们人为制造几个时间复杂度分别为O(n), O(logn), O(n^n)的测试用例:

// 这里都是为了演示而写成的代码,没有什么实际意义static void bench_N(benchmark::State& state){    int n = 0;    for ([[maybe_unused]] auto _ : state) {        for (int i = 0; i < state.range(0); ++i) {            benchmark::DoNotOptimize(n += 2); // 这个函数防止编译器将表达式优化,会略微降低一些性能        }    }    state.SetComplexityN(state.range(0));}BENCHMARK(bench_N)->RangeMultiplier(10)->Range(10, 1000000)->Complexity();static void bench_LogN(benchmark::State& state){    int n = 0;    for ([[maybe_unused]] auto _ : state) {        for (int i = 1; i < state.range(0); i *= 2) {            benchmark::DoNotOptimize(n += 2);        }    }    state.SetComplexityN(state.range(0));}BENCHMARK(bench_LogN)->RangeMultiplier(10)->Range(10, 1000000)->Complexity();static void bench_Square(benchmark::State& state){    int n = 0;    auto len = state.range(0);    for ([[maybe_unused]] auto _ : state) {        for (int64_t i = 1; i < len*len; ++i) {            benchmark::DoNotOptimize(n += 2);        }    }    state.SetComplexityN(len);}BENCHMARK(bench_Square)->RangeMultiplier(10)->Range(10, 100000)->Complexity();

如何传递参数和生成批量测试我们在上一篇已经介绍过了,这里不再重复。

需要关注的是新出现的state.SetComplexityN和Complexity。

首先是state.SetComplexityN,参数是一个64位整数,用来表示算法总体需要处理的数据总量。benchmark会根据这个数值,再加上运行耗时以及state的迭代次数计算出一个用于后面预估*均时间复杂度的值。

Complexity会根据同一组的多个测试用例计算出一个较接*的*均时间复杂度和一个均方根值,需要和state.SetComplexityN配合使用。

Complexity还有一个参数,可以接受一个函数或是benchmark::BigO枚举,它的作用是提示benchmark该测试用例的时间复杂度,默认值为benchmark::oAuto,测试中会自动帮我们计算出时间复杂度。对于较为复杂的算法,而我们又有预期的时间按复杂度,这时我们就可以将其传给这个方法,比如对于第二个测试用例,我们还可以这样写:

static void bench_LogN(benchmark::State& state){    // 中间部分与前面一样,略过}BENCHMARK(bench_LogN)->RangeMultiplier(10)->Range(10, 1000000)->Complexity(benchmark::oLogN);

在选择正确的提示后对测试结果几乎没有影响,除了偏差值可以降得更低,使结果更准确。

Complexity在计算时间复杂度时会保留复杂度的系数,因此,如果我们发现给出的提示的时间复杂度前的系数过大的话,就意味着我们的预估发生了较大的偏差,同时它还会计算出RMS值,同样反应了时间复杂度的偏差情况。

运行我们的测试:

c++性能测试工具之计算时间复杂度的示例分析

可以看到,自动的时间复杂度计算基本是准确的,可以在我们对算法进行测试时提供一个有效的参考。

看完了这篇文章,相信你对“c++性能测试工具之计算时间复杂度的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网其他教程频道,感谢各位的阅读!

--结束END--

本文标题: c++性能测试工具之计算时间复杂度的示例分析

本文链接: https://www.lsjlt.com/news/279027.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作