On 01/06/2017 08:05 PM, Phil Bouchard wrote:
On 01/06/2017 07:17 PM, Phil Bouchard wrote:

Just to conclude I did try the attached benchmark and I get the
following on a x86_64 @ 2.40 GHz:

0: 61331143.40263957 allocations / second
1: 63644162.93924019 allocations / second
2: 177628727.5388474 allocations / second
3: 179850939.5413082 allocations / second
1 / 0: 103.7713621632905% boost
2 / 1: 101.2510431354494% boost

So the fast_pool_allocator is already pretty fast and I can only get a
1% speed boost by allocating big memory blocks.  So it doesn't look like
there is any way to make the fast_pool_allocator any faster.

Correction: I get a 11% speed boost with the -O3 flag:

0: 60387275.67636769 allocations / second
1: 63133704.55951615 allocations / second
2: 169169529.8609596 allocations / second
3: 188535531.4062488 allocations / second
1 / 0: 104.5480258090584% boost
2 / 1: 111.447688931456% boost

So I am not sure if this is worth the trouble.

Did you know the optimized boost::fast_pool_allocator is 305% times faster than the regular one?

0: 61407861.18875794 allocations / second
1: 62565419.96725326 allocations / second
2: 175311265.1512761 allocations / second
3: 187319938.708916 allocations / second
1 / 0: 101.8850335381934% boost
2 / 1: 106.8499155187076% boost
3 / 0: 305.0422781101666% boost

Is Qt using a similar pool allocator?
#include <limits>
#include <iomanip>
#include <boost/timer.hpp>
#include <boost/pool/pool_alloc.hpp>

using namespace std;
using namespace boost;

int main()
{
    double speed[4];
    
    static int const n = 100000000;
    
    cout << setprecision(numeric_limits<double>::digits10 + 1);
    
    {
        pool_allocator<int, default_user_allocator_new_delete, details::pool::default_mutex> p;
        timer t;
        
        for (int i = 0; i < n; ++ i)
            p.allocate(1);
        
        speed[0] = n / t.elapsed();
    }

    {
        pool_allocator<int, default_user_allocator_new_delete, details::pool::default_mutex, n> p;
        timer t;
        
        for (int i = 0; i < n; ++ i)
            p.allocate(1);
        
        speed[1] = n / t.elapsed();
    }

    {
        fast_pool_allocator<int, default_user_allocator_new_delete, details::pool::default_mutex> p;
        timer t;
        
        for (int i = 0; i < n; ++ i)
            p.allocate(1);
        
        speed[2] = n / t.elapsed();
    }

    {
        fast_pool_allocator<int, default_user_allocator_new_delete, details::pool::default_mutex, n> p;
        timer t;
        
        for (int i = 0; i < n; ++ i)
            p.allocate(1);
        
        speed[3] = n / t.elapsed();
    }
    
    for (int i = 0; i < 4; ++ i)
        cout << i << ": " << speed[i] << " allocations / second" << endl;

    for (int i = 0; i < 2; ++ i)
        cout << i + 1 << " / " << i << ": " << speed[i * 2 + 1] / speed[i * 2] * 100 << "% boost" << endl;

    cout << 3 << " / " << 0 << ": " << speed[3] / speed[0] * 100 << "% boost" << endl;

    return 0;
}
_______________________________________________
Development mailing list
[email protected]
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to