`

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::packaged_task的使用详解

    C++11中的std::packaged_task是个模板类。std::packaged_task包装任何可调用目标(函数、lambda表达式、bind...存储的任务(stored task)是一些可调用的对象(例如函数指针、成员或函数对象的指针)( A stored task, which

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

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

    C++回调函数的2个DEMO程序,整理修改by唐太咸

    这里面有两个运用回调函数的DEMO程序 1.其中tcCallBack的作用是希望通过将Receiver类的...2.另外一个tcFunctionTemplate是使用std::function模板和std::bind,支持全局和类成员函数作为回调函数,我在VS2010下编译通过

    C++中各种可调用对象深入讲解

    概述 一组执行任务的语句都可以视为一个函数,一个可调用对象。在程序设计的过程中,我们习惯于把那些具有复用性的一组语句抽象为函数,把变化的部分抽象为函数的参数。... std::function C++11加入标准

    STL 源码剖析(侯捷先生译著)

    消除 "单纯传递调用函数" 097 以distance() 为例 098 3.5 std::iterator class 的保证 099 3.6 iterator相关源码完整重列 101 3.7 SGI STL的私房菜:__type_traits 103 第4章 序列式容器(sequence containers...

    LuaBind 源码 (Lua增强库)

    一个是根据函数的名字来调用函数, 另一个是调用一个可以作为函数调用的Lua值. 使用函数名来调用的版本只能调用Lua全局函数. "..."代表传递给Lua函数的 可变个数的参数. 这使得你可以指定调用的策略.你可以通过 ...

    C++ 11新特性之template

     C++提供了很多种可调用对象,例如函数指针、lambda、重载了operator()的对象等。有时我们需要将这些对象统一管理,这时使用如下这种方式是不行的: int add(int i, int j) { return i + j; } struct divide {...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     14.8.3 可调用对象与function 511  14.9 重载、类型转换与运算符 514  14.9.1 类型转换运算符 514  14.9.2 避免有二义性的类型转换 517  14.9.3 函数匹配与重载运算符 521  小结 523  术语表 523  第15章 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     14.8.3 可调用对象与function 511  14.9 重载、类型转换与运算符 514  14.9.1 类型转换运算符 514  14.9.2 避免有二义性的类型转换 517  14.9.3 函数匹配与重载运算符 521  小结 523  术语表 523  第15章 ...

    From C to C++

    // 调用基类成员函数;内联函数(in-line) #include #include using namespace std; class child { protected: char name[20]; int age; public: child(); child(char *n,int a); void ask(char *n); void ...

    STL源码剖析.pdg

    消除 "单纯传递调用函数" 097 以distance() 为例 098 3.5 std::iterator class 的保证 099 3.6 iterator相关源码完整重列 101 3.7 sgi stl的私房菜:__type_traits 103 第4章 序列式容器(sequence containers...

    [原创]自己工作中常用的模板库,简化你的工作

    这上传的资源中包含一套我工作中常用的模板库,及不需要MFC支持的excel操作接口,导出函数调用栈(dump stack)接口,可以直接用VS2008运行TestCodeLib.sln来根据unit test来了解用法。 ⑴ 需求(requirements) 重量级...

    Linux多线程服务端编程:使用muduo C++网络库

    4.4.2exit(3) 在C++ 中不是线程安全的.. . . . . . . . . . . . . . . . 94 4.5善用__thread 关键字.. . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 4.6多线程与IO . . . . . . . . . . . . . . . . ....

    papillon-ndl:巴比龙核数据库

    该函数指针是库对伪随机数生成器的访问。 因此,如果rng是这样的实例,则rng必须满足以下要求:对rng()任何调用都将在间隔[0,1)内返回随机双精度数,并且必须可以无限次地调用rng() 。 如果传递的对象不满足这些...

    代码语法错误分析工具pclint8.0

    2)在command line:中填写:c:\lint\lint-nt c:\lint\std.lnt %f 3)在Menu Item中填写:PC-LINT 4)在Command Output中选择: (x) Output to List Box 和 (x) Capture Output 5)点按"OK" 如图所示的配置...

Global site tag (gtag.js) - Google Analytics