gpt4 book ai didi

c++ - llvm g++ 和 boost 函数

转载 作者:太空狗 更新时间:2023-10-29 23:19:18 25 4
gpt4 key购买 nike

我正在尝试确定 boost::function 是否引入了时间开销与使用 function templates 相比,评估数学函数可以忽略不计。

我使用的基准测试代码如下。

对于传统的 g++boost::function 的开销可以忽略不计:

$ g++ -O3 main.cxx 
$ ./a.out
METHOD INTEGRAL TIME TO COMPUTE (SEC)
Direct 0.379885 3.360000
Function template 0.379885 3.380000
Boost function 0.379885 3.400000

使用 llvm-g++templates function 有 1.5 倍的速度增益,但 boost::function 没有增益。

$ llvm-g++ -O3 main.cxx
METHOD INTEGRAL TIME TO COMPUTE (SEC)
Direct 0.379885 2.170000
Function template 0.379885 2.160000
Boost function 0.379885 3.360000

是否有可能为 boost::functionllvm-g++ 获得 1.5 的增益?

#include <boost/function.hpp>
#include <math.h>
#include <stdio.h>

typedef unsigned int UInt;

using namespace std;

//=============================================================================
// chrono
//=============================================================================
class Chrono
{
clock_t t1_,t2_,dt_;
public:
Chrono(){}
void start() { t1_=clock(); };
void stop() { t2_=clock(); };
double diff() { return ( (double)( t2_ - t1_) ) / CLOCKS_PER_SEC; };
};

//=============================================================================
// function to integrate
//=============================================================================
inline double fct(double x)
{
return 1. / (1.+exp(x));
}

//=============================================================================
// using direct method
//=============================================================================
double direct(double a, double b, UInt numSamplePoints)
{
double delta = (b-a) / (numSamplePoints-1);
double sum = 0.;
for (UInt i=0; i < numSamplePoints-1; ++i)
sum += 1. / (1. + exp(a + i*delta));
return sum * delta;
}

//=============================================================================
// using function template
//=============================================================================
template<double functionToIntegrate(double)>
double integrate(double a, double b, UInt numSamplePoints)
{
double delta = (b-a) / (numSamplePoints-1);
double sum = 0.;
for (UInt i=0; i < numSamplePoints-1; ++i)
sum += functionToIntegrate(a + i*delta);
return sum * delta;
}

//=============================================================================
// using Boost function
//=============================================================================
typedef boost::function<double ( double )> fct_type;

class IntegratorBoost {
public:
fct_type functionToIntegrate;
IntegratorBoost(fct_type fct): functionToIntegrate(fct){}
double integrate(double a, double b, UInt numSamplePoints)
{
double delta = (b-a) / (numSamplePoints-1);
double sum = 0.;
for (UInt i=0; i < numSamplePoints-1; ++i)
sum += functionToIntegrate(a + i*delta);
return sum * (b-a) / numSamplePoints;
}
};

//=============================================================================
// main
//=============================================================================
int main()
{
double integral;
UInt numSamplePoints = 5E07;
Chrono chrono;

printf("%-20s%-10s%-30s\n","METHOD","INTEGRAL","TIME TO COMPUTE (SEC)");

// Direct
chrono.start();
integral = direct(0., 1., numSamplePoints);
chrono.stop();
printf("%-20s%-10f%-30f\n","Direct",integral,chrono.diff());

// Function template
chrono.start();
integral = integrate<fct>(0., 1.,numSamplePoints);
chrono.stop();
printf("%-20s%-10f%-30f\n","Function template",integral,chrono.diff());

// Boost function
chrono.start();
IntegratorBoost intboost(fct);
integral = intboost.integrate(0.,1.,numSamplePoints);
chrono.stop();
printf("%-20s%-10f%-30f\n","Boost function",integral,chrono.diff());
}

最佳答案

在没有实际测量的情况下,我将冒险并声称使用 boost::function(或来自 C++11 的 std::function)效率不高作为其他两个选项。

原因是 function 使用类型删除来删除正在使用的实际 functor 的类型,这意味着 function 需要通过指针存储进行调用的实际对象并使用函数调用。另一方面,在其他两种方法中,编译器能够内联逻辑并消除调度成本。

这实际上与多次提到的 C 库 qsort 与 C++ sort 的性能差异非常相似,其中通过使用 functor 编译器有更好的内联和优化机会。

那么另一个问题是,这是否会对您的应用程序产生影响,为此您需要进行衡量。可能是 IO 或任何其他操作的总体成本主导了您的应用程序,这根本不会产生任何影响。

关于c++ - llvm g++ 和 boost 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9720049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com