В общем, в Release, 10 000 задач, поток вытаскивает 1 задачу, пытается ее выполнить и спит 1 мсек.
Итого:
1 поток: 19.5ms
2 потока: 9.7ms
3 потока: 6.4ms
Хочу отметить, что время завышено, так как 1 поток всего лишь 1 задачу пытается выполнить и спит 1 мсек, так что, большая часть времени - это сон
Результаты реализации с макросами (без std::function)
1 поток: 19.3 ms
2 потока: 9.6 ms
3 потока: 6.5 ms
P.S. Разница между методами с макросом или с std::function (лямбдами) небольшая, но это не точно, так как в тестовом коде выполняется мало других действий