繁体   English   中英

在c ++中为多个线程创建lambda的开销

[英]Overhead of creating lambda for multiple threads in c++

我有一个concurrency::parallel_for ,我在其中调用一个带有仿函数的函数,传递一个lambda,就像

concurrency::parallel_for(0, particleCount, [&](int i)
{
...
  kdTree->VisitCells([&](const KDTreeNode &node) //defining and passing
  {
   //code dealing with tree traversal
  }
}

...问题是在parallel_for定义lambda是不好的做法,而parallel_for是为很多粒子中的每一个运行的。 这基本上会为每个粒子定义一个仿函数吗? 另一种方法是在parallel_for之外编写lambda并设计它以获取更多参数(因为它不再能像以前那样进行相同的捕获)并将其传递给parallel_for的树。

在对此进行测试时,似乎在parallel_for之外定义它的速度要快得多,但数据尚无定论,而且我不确定具有不同捕获数据的多个相同lambda是如何真正处理的。

一般来说,这取决于两件事。

首先,除非定义“外部” parallel_for本质上是一个类或结构,以某种方式捕获对parallel_for所有变量的引用,否则您将苹果与橙子进行比较。 捕获规范[&]基本上使lambda表示法成为创建这种结构的简写。 如果您要使用不同的捕获规范,您实际上将更改正在创建的结构/类的性质(或者如果没有捕获任何内容,则使其成为函数),从而改变创建和使用它的开销。

其次,假设您实际上正在将苹果与苹果进行比较,任何差异都将归结为编译器的实现质量,程序如何分配内存以及类似的事情。

使用高质量的编译器,我倾向于打赌编译器将使用lambda捕获比通过手动滚动等效数据结构所做的更好(因此我怀疑你没有比较喜欢)。

假设您正在使用一个体面的质量编译器(您还没有指定),我会打赌您看到“在parallel_for之外定义它”的模糊优势是因为您正在将手动简单函数或结构定义与lambda正在捕获几个变量(强制编译器打包一个更大的数据结构)。 换句话说,您正在将苹果与橙色进行比较。

使用较低质量的编译器....好吧,它只是取决于。 你可以用任何你喜欢的方式下注。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM