Test Performance Using Scripts or Functions
This example shows how to create and run a script-based or function-based performance test that times the preallocation of a vector using four different approaches.
Write Performance Test
Create a performance test in a file named
preallocationTest.m in your current folder. In this
example, you can choose to use either the following script-based test or the
function-based test. The output in this example is for the function-based test.
If you use the script-based test, then your test names will be different.
| Script-Based Performance Test | Function-Based Performance Test |
|---|---|
vectorSize = 1e7; %% Ones Function x = ones(1,vectorSize); %% Indexing With Variable id = 1:vectorSize; x(id) = 1; %% Indexing On LHS x(1:vectorSize) = 1; %% For Loop for i=1:vectorSize x(i) = 1; end |
function tests = preallocationTest tests = functiontests(localfunctions); end function testOnes(testCase) vectorSize = getSize(); x = ones(1,vectorSize()); end function testIndexingWithVariable(testCase) vectorSize = getSize(); id = 1:vectorSize; x(id) = 1; end function testIndexingOnLHS(testCase) vectorSize = getSize(); x(1:vectorSize) = 1; end function testForLoop(testCase) vectorSize = getSize(); for i=1:vectorSize x(i) = 1; end end function vectorSize = getSize() vectorSize = 1e7; end |
Run Performance Test
Run the performance test using the runperf function.
results = runperf("preallocationTest.m")Running preallocationTest
.......... .......... .......... .......... .......
Done preallocationTest
__________
results =
1×4 TimeResult array with properties:
Name
Valid
Samples
TestActivity
Totals:
4 Valid, 0 Invalid.
8.7168 seconds testing time.The results variable is a 1-by-4 TimeResult array. Each element in the array corresponds to one of
the tests defined in preallocationTest.m.
Display Test Results
Display the measurement results for the second test. Your results might vary.
results(2)
ans =
TimeResult with properties:
Name: 'preallocationTest/testIndexingWithVariable'
Valid: 1
Samples: [4×7 table]
TestActivity: [9×12 table]
Totals:
1 Valid, 0 Invalid.
0.87973 seconds testing time.As indicated by the size of the TestActivity property, the
performance testing framework collected nine measurements. This number of
measurements includes five measurements to warm up the code. The
Samples property excludes warm-up measurements.
Display the sample measurements for the second test.
results(2).Samples
ans =
4×7 table
Name MeasuredTime Timestamp Host Platform Version RunIdentifier
__________________________________________ ____________ ____________________ ___________ ________ __________________________________ ____________________________________
preallocationTest/testIndexingWithVariable 0.096513 14-Oct-2022 14:04:00 MY-HOSTNAME win64 9.14.0.2081372 (R2023a) Prerelease 7ff84b09-8a58-4961-bfcb-75c86f4a3ae1
preallocationTest/testIndexingWithVariable 0.097008 14-Oct-2022 14:04:00 MY-HOSTNAME win64 9.14.0.2081372 (R2023a) Prerelease 7ff84b09-8a58-4961-bfcb-75c86f4a3ae1
preallocationTest/testIndexingWithVariable 0.096777 14-Oct-2022 14:04:00 MY-HOSTNAME win64 9.14.0.2081372 (R2023a) Prerelease 7ff84b09-8a58-4961-bfcb-75c86f4a3ae1
preallocationTest/testIndexingWithVariable 0.097157 14-Oct-2022 14:04:00 MY-HOSTNAME win64 9.14.0.2081372 (R2023a) Prerelease 7ff84b09-8a58-4961-bfcb-75c86f4a3ae1
Compute Statistics for Single Test Element
Display the mean measured time for the second test. To exclude data collected
in the warm-up runs, use the values in the Samples
property.
sampleTimes = results(2).Samples.MeasuredTime; meanTest2 = mean(sampleTimes)
meanTest2 =
0.0969Compute Statistics for All Test Elements
To compare the different preallocation methods, create a table of summary
statistics from results. In this example, the
ones function was the fastest way to initialize the
vector to ones. The performance testing framework made four measurement runs for
this test.
T = sampleSummary(results)
T =
4×7 table
Name SampleSize Mean StandardDeviation Min Median Max
__________________________________________ __________ ________ _________________ ________ ________ ________
preallocationTest/testOnes 4 0.016716 0.00018455 0.016515 0.016699 0.016952
preallocationTest/testIndexingWithVariable 4 0.096864 0.0002817 0.096513 0.096892 0.097157
preallocationTest/testIndexingOnLHS 15 0.024099 0.0025168 0.022721 0.0232 0.031685
preallocationTest/testForLoop 4 0.79044 0.016054 0.78203 0.78261 0.81452Change Statistical Objectives and Rerun Tests
Change the statistical objectives defined by the runperf
function by constructing and running a time experiment. Construct a time
experiment that collects two warm-up measurements and runs the test a variable
number of times to reach a sample mean with a 4% relative
margin of error within a 98% confidence level.
Create a test suite.
suite = testsuite("preallocationTest");Construct a time experiment with the specified requirements, and run the test suite.
import matlab.perftest.TimeExperiment experiment = TimeExperiment.limitingSamplingError("NumWarmups",2, ... "RelativeMarginOfError",0.04,"ConfidenceLevel",0.98); resultsTE = run(experiment,suite);
Running preallocationTest .......... .......... .......... .......... Done preallocationTest __________
Compute the summary statistics for all the test elements.
T1 = sampleSummary(resultsTE)
T1 =
4×7 table
Name SampleSize Mean StandardDeviation Min Median Max
__________________________________________ __________ ________ _________________ ________ ________ ________
preallocationTest/testOnes 16 0.017424 0.001223 0.016911 0.017056 0.021938
preallocationTest/testIndexingWithVariable 8 0.099153 0.0039523 0.096619 0.097218 0.10736
preallocationTest/testIndexingOnLHS 4 0.022985 0.00018664 0.022843 0.022921 0.023257
preallocationTest/testForLoop 4 0.80613 0.005993 0.79979 0.80591 0.8129See Also
runperf | testsuite | matlab.perftest.TimeExperiment | matlab.perftest.TimeResult