## Best Practices for Using MEX Functions to Accelerate MATLAB Algorithms

When you choose a section of MATLAB^{®} code to accelerate,
the following practices are recommended.

### Accelerate Code That Dominates Execution Time

Find the section of MATLAB code that dominates run time. Accelerate this section of the code using a MEX function as follows:

Place this section of the code inside a separate MATLAB function.

From this MATLAB function, generate a MEX function.

From your original MATLAB code, call the MEX function.

To find the execution time of each MATLAB instruction, use MATLAB Profiler.

To open the Profiler from the command line, type

`profile viewer`

.To open Profiler from the MATLAB Editor window, under the

**Editor**tab, click**Run and Time**.

For more information about using the Profiler to measure run time of MATLAB code, see Profile Your Code to Improve Performance.

### Include Loops Inside MEX Function

Instead of calling a MEX function inside a loop in the MATLAB code, include the loop inside the MEX function. Including the loop eliminates the overheads in calling the MEX function for every run of the loop.

For example, the following code finds the greatest element
in every row of a 1000–by–1000 matrix, `mat`

.
You can accelerate sections 1,2, and 3 using a MEX function.:

% Section 1 begins for i = 1:10000 % Section 2 begins max = mat(i,0); % Initialize max for j = 1:10000 % Section 3 begins if (mat(i,j) > max) max = mat(i,j) % Store the current maximum end % Section 3 ends end % Section 2 ends end % Section 1 ends

Accelerate section 1 using a MEX function. Accelerate section 1 first so that the MEX function is called only once.. If you cannot accelerate section 1 first, then accelerate sections 2 or 3, in that order. If section 2 (or 3) is accelerated using a MEX function, the function is called 10000 (or 10000 × 10000) times.

### Avoid Generating MEX Functions from Unsupported Functions

Check that the section of MATLAB code that you accelerate does not contain many functions and language features that are unsupported by MATLAB Coder™. For a list of supported functions, see Functions and Objects Supported for C/C++ Code Generation.

**Note**

In certain situations, you might have to accelerate sections
of code even though they contain a few unsupported functions. Declare
an unsupported function as extrinsic to invoke the original MATLAB function
instead of the code generated for the function. You can declare a
function as extrinsic by using `coder.extrinsic`

or
wrapping it in an `feval`

statement.
See Use MATLAB Engine to Execute a Function Call in Generated Code.

### Avoid Generating MEX Functions if Built-In MATLAB Functions Dominate Run Time

Use MEX functions to accelerate MATLAB code only if user-generated code dominates the run time.

Avoid generating MEX functions if computationally intensive,
built-in MATLAB functions dominate the run time. These functions
are pre-compiled and optimized, so the MATLAB code is not accelerated
significantly using a MEX function. Examples of such functions include `svd`

, `eig`

,`fft`

, `qr`

, `lu`

.

**Tip**

You can invoke computationally intensive, built-in MATLAB functions
from your MEX function. Declare the MATLAB function as extrinsic
using `coder.extrinsic`

or wrap
it in an `feval`

statement. For
more information, see Use MATLAB Engine to Execute a Function Call in Generated Code.

### Minimize MEX Function Calls

Accelerate as much of the MATLAB code as possible using one MEX function instead of several MEX functions called at lower levels. This minimizes the overheads in calling the MEX functions.

For example, consider the function,`testfunc`

,which
calls two functions,`testfunc_1`

and `testfunc_2`

:

function [y1,y2] = testfunc(x1,x2) y1 = testfunc_1(x1,x2); y2 = testfunc_2(x1,x2); end

Instead of generating MEX functions individually for `testfunc_1`

and `testfunc_2`

,
and then calling the MEX functions in `testfunc`

,
generate a MEX function for `testfunc`

itself.