Adam
Adam

Reputation: 1354

Why does `minmax` take longer than a consecutive `min` and `max`?

Well basically the question says it all, my intuition tells me that a call to minmax should take less time than calling a min and then a max.

Is there some optimization I prevent Matlab carrying out in the following code?

minmax:

function minmax_vals = minmaxtest()
    buffSize = 1000000;
    A = rand(128,buffSize);
    windowSize = 100;
    minmax_vals = zeros(128,buffSize/windowSize*2);
    for i=1:(buffSize/windowSize)
        minmax_vals(:,(2*i-1):(2*i)) = minmax(A(:,((i-1)*windowSize+1):(i*windowSize)));
    end
end

enter image description here

separate min-max:

function minmax_vals = minmaxtest()
    buffSize = 1000000;
    A = rand(128,buffSize);
    windowSize = 100;
    minmax_vals = zeros(128,buffSize/windowSize*2);
    for i=1:(buffSize/windowSize)
        minmax_vals(:,(2*i-1)) = min(A(:,((i-1)*windowSize+1):(i*windowSize)),[],2);
        minmax_vals(:,(2*i)) = max(A(:,((i-1)*windowSize+1):(i*windowSize)),[],2);
    end
end

enter image description here

Upvotes: 3

Views: 88

Answers (1)

Wolfie
Wolfie

Reputation: 30165

Summary

You can see the overhead because minmax isn't completely obfuscated. Simply type

edit minmax

And you will see the function!


It appears that there is a data-type conversion to nntype.data('format',x,'Data');, which will not be the case for min or max and could be costly. This is for use with MATLAB's neural networking (nn) tools as minmax belongs to that toolbox.

In short, min and max are lower-level, compiled functions (hence they are fully obfuscated), which don't require functionality from the nn toolbox.


Benchmark

Here is a slightly more isolated benchmark, without your windowing and using timeit instead of the profiler. I've also included timings for just the data conversion used in minmax! The test gets the min and max of each row in a large matrix, see here the output plot and code below...

benchmark

It appears that there is a linear relationship between number of rows and time taken (as expected for a linear operator), but the coefficient is much greater for the combined minmax relationship, with the separate operations being approximately 10x quicker. Also you can clearly see that data conversion takes more time that the min then max version alone!

function benchie()
    K = zeros(10, 3);
    for k = 1:10        
        n = 2^k;
        A = rand(n, 200);   
        Arow = zeros(1,200); 
        m = zeros(n,2);
        
        f1 = @()minmaxtest(A,m);
        K(k,1) = timeit(f1);

        f2 = @()minthenmaxtest(A,m);
        K(k,2) = timeit(f2);
        
        f3 = @()dataconversiontest(A, Arow);
        K(k,3) = timeit(f3);
    end
    figure; hold on; plot(2.^(1:10), K(:,1)); plot(2.^(1:10), K(:,2)); plot(2.^(1:10), K(:,3));
end
function minmaxtest(A,m)
    for ii = 1:size(A,1)
        m(ii, 1:2) = minmax(A(ii,:));
    end
end
function dataconversiontest(A, Arow)
    for ii = 1:size(A,1)
       Arow = nntype.data('format', A(ii,:), 'Data');;
    end    
end
function minthenmaxtest(A,m)
    for ii = 1:size(A,1)
        m(ii, 1) = min(A(ii,:));
        m(ii, 2) = max(A(ii,:));
    end
end

Upvotes: 6

Related Questions