Boost::multi_array performance question

前端 未结 16 2127
不思量自难忘°
不思量自难忘° 2020-12-04 11:20

I am trying to compare the performance of boost::multi_array to native dynamically allocated arrays, with the following test program:

#include 

        
16条回答
  •  既然无缘
    2020-12-04 11:57

    Consider using Blitz++ instead. I tried out Blitz, and its performance is on par with C-style array!

    Check out your code with Blitz added below:


    #include 
    #define _SCL_SECURE_NO_WARNINGS
    #define BOOST_DISABLE_ASSERTS 
    #include 
    #include 
    
    int main(int argc, char* argv[])
    {
        const int X_SIZE = 200;
        const int Y_SIZE = 200;
        const int ITERATIONS = 500;
        unsigned int startTime = 0;
        unsigned int endTime = 0;
    
        // Create the boost array
        typedef boost::multi_array ImageArrayType;
        ImageArrayType boostMatrix(boost::extents[X_SIZE][Y_SIZE]);
    
    
        //------------------Measure boost----------------------------------------------
        startTime = ::GetTickCount();
        for (int i = 0; i < ITERATIONS; ++i)
        {
            for (int y = 0; y < Y_SIZE; ++y)
            {
                for (int x = 0; x < X_SIZE; ++x)
                {
                    boostMatrix[x][y] = 2.345;
                }
            }
        }
        endTime = ::GetTickCount();
        printf("[Boost] Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
    
        //------------------Measure blitz-----------------------------------------------
        blitz::Array blitzArray( X_SIZE, Y_SIZE );
        startTime = ::GetTickCount();
        for (int i = 0; i < ITERATIONS; ++i)
        {
            for (int y = 0; y < Y_SIZE; ++y)
            {
                for (int x = 0; x < X_SIZE; ++x)
                {
                    blitzArray(x,y) = 2.345;
                }
            }
        }
        endTime = ::GetTickCount();
        printf("[Blitz] Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
    
    
        //------------------Measure native-----------------------------------------------
        // Create the native array
        double *nativeMatrix = new double [X_SIZE * Y_SIZE];
    
        startTime = ::GetTickCount();
        for (int i = 0; i < ITERATIONS; ++i)
        {
            for (int y = 0; y < Y_SIZE; ++y)
            {
                for (int x = 0; x < X_SIZE; ++x)
                {
                    nativeMatrix[x + (y * X_SIZE)] = 2.345;
                }
            }
        }
        endTime = ::GetTickCount();
        printf("[Native]Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
    
    
    
        return 0;
    }
    

    Here's the result in debug and release.

    DEBUG:

    Boost  2.093 secs 
    Blitz  0.375 secs 
    Native 0.078 secs
    

    RELEASE:

    Boost  0.266 secs
    Blitz  0.016 secs
    Native 0.015 secs
    

    I used MSVC 2008 SP1 compiler for this.

    Can we now say good-bye to C-stlye array? =p

提交回复
热议问题