• Giuseppe Ottaviano's avatar
    Further Function simplification · 68cf03b1
    Giuseppe Ottaviano authored
    Summary:
    Use tag dispatching instead of `enable_if`: it is clearer, it
    sidesteps the GCC mangling bug, and more importantly the conditional
    doesn't leak into the symbol, making stack traces and profiles more
    readable.
    
    Testing on a compilation unit with 1000 `Function`s from simple lambdas.
    Before:
    ```
    folly::impl::Function<int (), false>::Function<main::{lambda()#1}, {lambda()#1}>(main::{lambda()#1}&&, std::enable_if<std::integral_constant<bool, ((sizeof (std::decay<main::{lambda()#1}>::type))<=(sizeof folly::detail::function::Data::small))&&std::is_nothrow_move_constructible<std::decay<main::{lambda()#1}> >::value>::value, folly::detail::Tag>::type)::Ops::call(folly::detail::function&)
    ```
    After:
    ```
    folly::impl::Function<int (), false>::OpsSmall<main::{lambda()#1}>::call(folly::detail::function::Data&)
    ```
    Note that the function type is repeated 5 times before, and only once after. This makes a large difference with long namespaces.
    
    Binary size is almost unaffected, compile times slightly better:
    Before:
    GCC opt: 22.3 seconds, 4435232 bytes
    Clang dev: 7.7 seconds, 5257344 bytes
    
    After:
    GCC opt: 18.6 seconds, 4493920 bytes
    Clang dev: 7.2 seconds, 5469136 bytes
    
    Reviewed By: ericniebler
    
    Differential Revision: D3231530
    
    fb-gh-sync-id: 6aa76e7f780a8afdbfed8a378f257ceb86dce704
    fbshipit-source-id: 6aa76e7f780a8afdbfed8a378f257ceb86dce704
    68cf03b1
Function.h 22.7 KB