用cmake编译并使用c++基准测试库-celero

celero是c++用来测试程序性能与运行效率的一个测试库, 通过celero可以方便的测试我们程序的性能

下载并编译celero

下载

celero下载地址:https://github.com/DigitalInBlue/Celero
cmake下载地址:https://cmake.org/download/
关于celero与cmake的使用这里就不一一赘述了,大家可以看下相关文章.

编译celero

安装好cmake环境之后,在celero目录下面新建一个build目录,这个目录是用于构建编译程序的,下面是我的celero目录情况:
用cmake编译并使用c++基准测试库-celero然后在build目录下面执行cmake ..此时,build目录下面会生成相应的构建文件,再执行make命令会对celero源码进行编译并在build目录生成相应的so文件,效果如下:
用cmake编译并使用c++基准测试库-celero这样的话,我们的celero库就已经编译好了,接下来就是怎么将这个so引入到我们的c++工程里面


使用celero库

首先新建一个c++程序目录:
mkdir celeroTest
然后在这个目录中新建一个src目录用于存放源码路径,在这个目录中再建一个include目录用于存放celero相应的头文件,接着在celeroTest目录下面见一个名为CMakeLists.txt的文件,在这个文件中加上以下命令:

PROJECT(CERLODEMO)
ADD_SUBDIRECTORY(src)

接着将celero库中的include/celero(包括celero文件夹)头文件复制到本程序目录的src/include里面, 接着在celeroTest目录下面建一个lib目录将编译好的so文件放在里面,然后在src目录下面新建一个CMakeLists.txt 然后在里面添加如下命令:

INCLUDE_DIRECTORIES(include/)
ADD_EXECUTABLE(smartDemo smartDemo.cpp)
MESSAGE(STATUS "this project path====>" ${PROJECT_SOURCE_DIR})
TARGET_LINK_LIBRARIES(smartDemo ${PROJECT_SOURCE_DIR}/lib/libcelero.so)

INCLUDE_DIRECTORIES是指定头文件的路径
ADD_EXECUTABLE是我们要编译的目标文件
参数说明:

  • smartDemo 是编译成目标文件的名字
  • smartDemo.cpp是我们的源码文件
    TARGET_LINK_LIBRARIES是将目标文件链接到共享库

关于这个cpp文件我在后面也会贴出来.
ok, 通过以上的配置,接下来就是编译代码了,还是与之前一样在,celeroTest目录下面新建build目录,然后cd build; cmake ..; make接着会在build/src下面会生成编译好的可执行程序,效果如下:
用cmake编译并使用c++基准测试库-celero然后执行./smartDemo我们写的celero测试程序就执行了,效果如下:
用cmake编译并使用c++基准测试库-celero从图中可以看到,如果在多次循环中用弱指针的话是非常耗资源的.
好了,celero库的编译与如何引入就说完了,下面就将这个c++测试程序贴出来供大家参考:

#include<stdlib.h>
#include<iostream>
#include<vector>
#include<memory>
#include<utility>

#include "celero/Celero.h"

using ptr = std::shared_ptr<int>;
using weakPtr = std::weak_ptr<int>;

static std::vector<int> origin;
static std::vector<ptr> group;
static std::vector<weakPtr> group2;
static std::vector<int*> group3;
static std::vector<double> bigValues;

int main(int argc, char **arv){
    

    for(int i=0; i < 100000; i++){
        origin.push_back(i);
        auto p = std::make_shared<int>(i);
        group3.push_back(p.get());
        group2.push_back(p);
        group.push_back(p);
    }

    std::cout << group.size() << " " << group2.size() << std::endl;

    celero::Run(argc, arv);
    return 0;
}

BASELINE(Ptr, Baseline, 600, 3){
    double value = 0;
    for(auto v : origin){
        value += v;
    }

    bigValues.push_back(value);
}

BENCHMARK(Ptr, Ptr, 600, 3){
    double value = 0;
    for(auto &v : group3){
        if(v){
            value += *v;
        }
    }

    bigValues.push_back(value);
}

BENCHMARK(Ptr, SharedPtr, 600, 3){
    double value = 0;
    for(auto &v : group){
        if(v){
            value += *v;
        }
    }

    bigValues.push_back(value);
}

BENCHMARK(Ptr, weakPtr, 600, 3){
    double value = 0;
    for(auto &v : group2){
        auto pp = v.lock();
        if(pp){
            value += (*pp);
        }
    }

    bigValues.push_back(value);
}