Может ли присвоение имени лямбде повлиять на производительность? - PullRequest
0 голосов
/ 30 августа 2018

В чем разница в производительности, если таковая имеется, между непосредственным использованием лямбды и определением именованной лямбды, а затем передачей ее в качестве аргумента?

Например, это:

std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });

против этого:

auto a_greater_than_b = [](int a, int b) { return a > b; };
std::sort(v.begin(), v.end(), a_greater_than_b);

1 Ответ

0 голосов
/ 30 августа 2018

Использование gcc 8.2 со следующим кодом:

#include<algorithm>
#include<vector>

int main ()
{
    std::vector<int> v;
    std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });


    auto a_greater_than_b = [](int a, int b) { return a < b; };
    std::sort(v.begin(), v.end(), a_greater_than_b);
}

Выходы для безымянных:

main::{lambda(int, int)#1}::operator()(int, int) const:
  pushq %rbp
  movq %rsp, %rbp
  movq %rdi, -8(%rbp)
  movl %esi, -12(%rbp)
  movl %edx, -16(%rbp)
  movl -12(%rbp), %eax
  cmpl -16(%rbp), %eax
  setg %al
  popq %rbp
  ret

.....

leaq -48(%rbp), %rax
  movq %rax, %rdi
  call std::vector<int, std::allocator<int> >::end()
  movq %rax, %rbx
  leaq -48(%rbp), %rax
  movq %rax, %rdi
  call std::vector<int, std::allocator<int> >::begin()
  movq %rbx, %rsi
  movq %rax, %rdi
  call void std::sort<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, main::{lambda(int, int)#1}>(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, main::{lambda(int, int)#1}, main::{lambda(int, int)#1})

и для именованного:

main::{lambda(int, int)#2}::operator()(int, int) const:
  pushq %rbp
  movq %rsp, %rbp
  movq %rdi, -8(%rbp)
  movl %esi, -12(%rbp)
  movl %edx, -16(%rbp)
  movl -12(%rbp), %eax
  cmpl -16(%rbp), %eax
  setl %al
  popq %rbp
  ret

.....

leaq -48(%rbp), %rax
  movq %rax, %rdi
  call std::vector<int, std::allocator<int> >::end()
  movq %rax, %rbx
  leaq -48(%rbp), %rax
  movq %rax, %rdi
  call std::vector<int, std::allocator<int> >::begin()
  movq %rbx, %rsi
  movq %rax, %rdi
  call void std::sort<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, main::{lambda(int, int)#2}>(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, main::{lambda(int, int)#2}, main::{lambda(int, int)#2})

Оба одинаковы. Так что без разницы.

...