`

C++中 直接调用、函数指针、std::function效率对比

    博客分类:
  • C++
 
阅读更多
C++中 直接调用、函数指针、std::function效率对比

调用次数:10亿次
CPU:  i7 860  (主频2.8GHz)
测试结果: 函数指针要比直接调用慢2s左右;std::function 要比函数指针慢2s左右

貌似std::function调用时多了一句if语句的判断,用于测试是否绑定了函数。

结果及代码如下






/**
@file
@brief 测试C++11 中 function的效率
*/


#include <functional>
#include <iostream>
#include <typeinfo>
#include <chrono>

//待封装的函数
int testEfficiency (int i, int j) {
    for (size_t ii = 0; ii < 5; ii++) {
        i += i - ii;
    }
    if (i < j)
        return i + 7 * j;
    else return i - 3 * j;
}

typedef std::function<int (int, int) > FuncInt_IntInt;
using funcInt_IntInt = int (*) (int, int);  //函数指针

int main() {
    int a = 1;
    int b = a;
    int c = a;
    int testNum = 1E9;
    FuncInt_IntInt fFunctional = testEfficiency;
    funcInt_IntInt fFuncPtr = testEfficiency;

    std::cout << "函数原型类型:\t\t" << typeid (testEfficiency).name() << std::endl;
    std::cout << "std::funciton类型:\t" << typeid (fFunctional).name() << std::endl;
    std::cout << "函数指针类型:\t\t"  << typeid (fFuncPtr).name() << std::endl;


    std::chrono::time_point<std::chrono::system_clock> start, end;

    start = std::chrono::system_clock::now();
    for (size_t i = 0; i < testNum; i++) {
        a = testEfficiency (a, 2);
    }
    end = std::chrono::system_clock::now();
    std::cout << "直接调用耗时:\t\t" << std::chrono::duration<double> (end - start).count() << "秒" << std::endl;

    start = std::chrono::system_clock::now();
    for (size_t i = 0; i < testNum; i++) {
        b = fFunctional (b, 2);
    }
    end = std::chrono::system_clock::now();
    std::cout << "使用std::function耗时:\t" << std::chrono::duration<double> (end - start).count() << "秒" << std::endl;

    start = std::chrono::system_clock::now();
    for (size_t i = 0; i < testNum; i++) {
        c = fFuncPtr (c, 2);
    }
    end = std::chrono::system_clock::now();
    std::cout << "使用函数指针耗时:\t" << std::chrono::duration<double> (end - start).count() << "秒" << std::endl;

    std::cout << "a=" << a << std::endl;
    std::cout << "b=" << b << std::endl;
    std::cout << "c=" << c << std::endl;
}
  • 大小: 31.4 KB
  • 大小: 29.3 KB
分享到:
评论

相关推荐

    C++ 11 std::function和std::bind使用详解

    std::function 是一个可调用对象的包装器,用于存储和调用函数指针。std::function 可以绑定到全局函数、类静态成员函数或 lambda 表达式。std::function 的定义是 std::function(param1, param2, ...)&gt;,其中 return...

    C++11中lambda、std::function和std:bind详解

    **std::function**是C++11标准库中的一个类模板,用于封装任何可调用对象(如函数指针、成员函数指针、函数对象或lambda表达式)。它的优势在于可以将不同类型的可调用对象存储在一个统一的接口中,提供了类型安全和...

    理解C++编程中的std::function函数封装

    在C++编程中,`std::function`是一个强大的工具,它是C++11标准引入的新特性,用于封装和管理各种可调用实体,如普通函数、Lambda表达式、函数指针以及自定义的函数对象。这个特性使得在C++程序中更加灵活地处理函数...

    c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind

    还是函数指针提供了动态调用功能,或者是lambda表达式和仿函数提高了代码的可读性和封装性,再到`std::function`和`std::bind`提供了更强大的函数对象和参数绑定能力,都在不同层面上提升了C++的编程体验。

    C++ 通过字符串调用函数

    在C++编程中,通过字符串调用函数是一种高级特性,通常涉及到函数指针、元编程或者更复杂的语言机制。这个示例代码可能演示了如何在运行时根据字符串内容找到并执行相应的函数。这种技术在某些场景下非常有用,比如...

    c++类成员函数作为回调函数

    C++20引入了`std::function_object_adapter`,它可以直接将成员函数转换为可调用对象,简化了成员函数作为回调的使用: ```cpp auto callback = std::function_object_adapter, void(int)&gt;(obj, &MyClass::...

    C++ 一般(普通)函数指针、类成员函数指针,用法区别,以及强制转换

    在C++编程中,函数指针是一个非常重要的概念,它允许我们存储函数的地址并可以在程序的不同地方调用。函数指针分为两类:一般(普通)函数指针和类成员函数指针。这两种类型的指针在用法上有所区别,且类成员函数...

    vc++类函数指针的应用

    在C++中,我们可以通过typedef或者std::function来声明类函数指针类型。例如: ```cpp class MyClass { public: void myFunction(int arg); }; typedef void (MyClass::*MyClassFuncPtr)(int); // 类函数指针类型...

    C++ 回调函数

    在C++中,除了使用函数指针,还可以使用成员函数指针或者std::function来实现回调。成员函数指针适用于类的成员函数作为回调的情况,而std::function则提供了更灵活的回调机制,可以存储任何可调用对象,包括普通...

    函数指针万能打印_C++_VS_

    在C++编程中,函数指针是一个非常强大的工具,它允许我们将函数作为其他函数的参数或者存储在变量中。在本示例中,“函数指针万能打印”着重讲解如何利用函数指针实现一个通用的打印系统,可以适应各种数据类型的...

    zhiqiang-hu#AwesomeCppNotes#std::function和std::bind1

    在 &lt;functional&gt; 头文件中, std::function 是个可调用Callable对象的容器,可以容纳 函数、函数指针、lambda表达式、成员函

    c++ 成员函数指针

    在C++11及更高版本中,`std::function`和`std::bind`提供了更现代、更灵活的方式来处理成员函数,它们可以包装任何可调用对象,包括成员函数指针,而且使用起来更加简洁。 总的来说,C++中的成员函数指针和functor...

    C++函数指针

    ### C++函数指针详解 #### 一、引言 函数指针是在C++编程语言中一种非常重要的特性,它允许程序员将函数当作数据来处理。通过对函数的指针进行操作,可以实现很多高级功能,比如动态绑定、回调函数、多态等。本文...

    C++ 线程函数是类的成员函数

    由于成员函数需要对象实例才能被调用,因此在创建线程时需要提供对象的引用或指针。 ```cpp MyClass obj; std::thread my_thread(&MyClass::threadFunction, &obj, 42); // 42 是传递给成员函数的参数 ``` 三、...

    C++ STL 内 std::{bind/tuple/function} 简单实现

    在简单的实现中,`std::function`通常会有一个内部的函数指针成员变量,用于存储实际的可调用对象。例如: ```cpp template , typename... Args&gt; class function(Args...)&gt; { private: Result (*function_)(Args.....

    function文档1

    `std::function`是C++11引入的一个模板类,它提供了一种类型安全的方式来封装任何可调用对象,如普通函数、成员函数、lambda表达式、函数指针等。`std::function`的声明通常包括返回类型和参数列表,例如`std::...

    lua调用C++函数

    这通常涉及到保存C++函数指针的用户数据,然后在Lua中通过元方法或特殊协议调用。 10. **调试和日志**:在集成过程中,添加适当的调试输出和日志记录有助于定位问题。可以使用`luaL_error`或自定义的错误处理函数抛...

    c++成员函数成为线程函数

    本文将深入探讨如何在多线程环境中调用C++的成员函数,并有效地使用类中的成员变量。 一、C++成员函数成为线程函数 1.1 为什么要在线程中调用成员函数 在多线程应用中,通常需要在线程中执行特定任务,这些任务...

Global site tag (gtag.js) - Google Analytics