I'm writing a template function which involved usage of f = std::bind(std::bind(std::bind(...))).
but I'm not sure whether the c++ compiler is smart enough to unfold the calling chain.
What I mean is:
- when creating functor
f, is there multiplestd::bind()invoked at runtime? - when calling
f(), does it involves calling multipleoperator()at different layers of bind_functor object.
As a simple example: Does f2() run slightly faster than f1()?
#include <functional>
int add(int a, int b) {
return a + b;
}
int main() {
using namespace std::placeholders;
auto f1 = std::bind(std::bind(&add, 1, _1), 2);
auto f2 = std::bind(&add, 1, 2);
return 0;
}
Update: I did some experiment. It seems f2() does run faster than f1(). And if you use std::function, it is even slower. Here is the experimental code (ubuntu/gcc 7.5.0, with optimization enabled. Without optimization, f2 is the slowest.):
#include <chrono>
#include <iostream>
#include <functional>
int add(int a, int b) {
return a + b;
}
int main() {
using namespace std::placeholders;
auto f1 = std::bind(std::bind(&add, 1, _1), 2);
auto f2 = std::bind(&add, 1, 2);
std::function<int(void)> f3 = std::bind(&add, 1, 2);
const int N = 10000000;
{
auto begin = std::chrono::system_clock::now();
for (int n = 0; n < N; n++) {
f1();
}
auto end = std::chrono::system_clock::now();
auto d = end - begin;
std::cout << "done: " << d.count() << std::endl;
}
{
auto begin = std::chrono::system_clock::now();
for (int n = 0; n < N; n++) {
f2();
}
auto end = std::chrono::system_clock::now();
auto d = end - begin;
std::cout << "done: " << d.count() << std::endl;
}
{
auto begin = std::chrono::system_clock::now();
for (int n = 0; n < N; n++) {
f3();
}
auto end = std::chrono::system_clock::now();
auto d = end - begin;
std::cout << "done: " << d.count() << std::endl;
}
return 0;
}
Aucun commentaire:
Enregistrer un commentaire