<b>在C++中利用Lambda函数提高代码性能</b>[VC/C++编程]
本文“<b>在C++中利用Lambda函数提高代码性能</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
使编译器以及操作系统从正在成立的利用中榨取更高性能的关键在于供应充沛的有关代码企图的信息.在充分理解这个代码企图实现的功效等信息的情形下,就有大概将代码在编译时和运行时的并行吞吐量最大化,令开辟者可以将更多精神放在他们所关注的商业范畴的问题,将重量级的多核多处理器的任务筹划交托给编译器,运行时库以及操作系统中的底子设备代码来处理.
循环函数是很重要的一个环节,因为在全部可用的硬件资源中,被别离的循环中的各个部份在普通情形下可以供应更高的利用性能.考虑这样一个小情形:迭代选定组合中的全部元素以求得总和.最简单最直接的履行办法以下:
std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total = 0;
for (int ix = 0; ix ﹤ v.size(); ++ix){
total += v[ix];
}
以上的例子非常便于人工读写.关于熟习C语言家族语法的开辟者而言,这个循环的企图也非常简单理解.但是关于编译器以及运行时库的组合而言,要在多个线程之间筹划好这个循环,它还需求近似于OpenMP编译指导一类的指导来奉告它那边有优化的空间:
std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total = 0;
#pragma omp for
for (int ix = 0; ix ﹤ v.size(); ++ix){
#pragma omp atomic
total += v[ix];
}
第一个OpenMP指导提出了多线程运行for循环的要求,而第二个omp atomic指导则被用来避免多线程同时向总数变量上写入.关于OpenMP,在MSDN库的参考文档中有关于全部指导的具体介绍.
假如利用了声明式循环本领,那么将并行办法利用在矢量求和上则越发干净简单.STL for_each函数是一个抱负的替换品,以上的例子则被改写以下:
class Adder{
private:
int _total;
public:
Adder() : _total(0) {}
void operator ( ) ( int& i )
{
_total += i;
}
operator int ( )
{
return _total;
}
};
void VectorAdd()
{
std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total = std::for_each(v.begin(), v.end(), Adder());
}
这里,具体的for循环被舍弃,求矢量和的代码变得干净了一些;但是由于需求利用一系列运行符来定义一个类,这使得这个办理筹划被大大的复杂化了.除非代码库中还有大量近似的求和声明,不然一个开辟者是不会仅仅为了STL for_each的那点好处而多耗费工夫去定义一个新类的.
细心查抄这个Adder类,可以很明显的看出其大部份内容都仅仅是用来满意将实例用作函数对象的调用条件的.这个类中唯一同到计算作用的仅仅是那一行_total += i.考虑到这一点,C++ 0x供应了一个被大大简化了的、以lambda函数方法来实现的语法本领.Lambda函数移除了对这些搭架子代码的需求,并答应在别的的一个声明中定义一个谓词函数.由此,VectorAdd函数可以被改写以下:
std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total = 0;
std::for_each(v.begin(), v.end(),
[&total](int x) {total += x;}
);
以上是“<b>在C++中利用Lambda函数提高代码性能</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |