From bf81befe4e7c5d639879d9ca3d5ea43b468f0fbf Mon Sep 17 00:00:00 2001
From: giuliaghirardini <giuliaghirardini2001@gmail.com>
Date: Tue, 12 Mar 2024 17:04:45 +0100
Subject: [PATCH] [benchmark][speed] Implemented new function to check classes
 speed for dependent and non-dependent properties

---
 tests/Test.m                      | 23 ++++++++++++-----------
 tests/dataSpeed.mat               |  4 ++--
 tests/operations/dependentSpeed.m | 22 ++++++++++++++++++++++
 tests/speedBenchmarkConfig.m      | 11 +++++++++++
 tests/speedBenchmarkPlot.m        |  3 +++
 tests/speedPlots.m                | 30 ++++++++++++++++++++++++++++++
 6 files changed, 80 insertions(+), 13 deletions(-)
 create mode 100644 tests/operations/dependentSpeed.m

diff --git a/tests/Test.m b/tests/Test.m
index b39e3f6..62c2a53 100644
--- a/tests/Test.m
+++ b/tests/Test.m
@@ -9,22 +9,24 @@ classdef Test < Config
         rows double  % Number of rows for random matrix
         cols double  % Number of columns for random matrix
         e double 
+        randomMatrix double
+        randomVect double
+        nonDependentProp double
     end
 
     properties(SetAccess = protected)
         d   double
     end
 
-    properties(Dependent)
-        randomMatrix
-        randomVect
-    end
-
     properties(Access = protected)
         configName = '';
         mission Mission
     end
 
+    properties (Dependent)
+        dependentProp 
+    end
+
     methods
         function obj = Test(a, b, c, d, rows, cols)
             obj.a = a;
@@ -33,14 +35,13 @@ classdef Test < Config
             obj.d = d;
             obj.rows = rows;  % Set rows
             obj.cols = cols;  % Set cols
+            obj.randomMatrix = obj.a * randn(obj.rows, obj.cols);
+            obj.randomVect = obj.randomMatrix(1,:);
+            obj.nonDependentProp = obj.a^(obj.b) + obj.c;
         end
 
-        function randomMatrix = get.randomMatrix(obj)
-            randomMatrix = obj.a * randn(obj.rows, obj.cols);
-        end
-
-        function randomVect = get.randomVect(obj)
-            randomVect = obj.randomMatrix(1,:);
+        function dependentProp = get.dependentProp(obj)
+            dependentProp = obj.a^(obj.b) + obj.c;
         end
     end
 end
diff --git a/tests/dataSpeed.mat b/tests/dataSpeed.mat
index 0eb49fd..f77792e 100644
--- a/tests/dataSpeed.mat
+++ b/tests/dataSpeed.mat
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:66a0de3e874d8c280bdea780291cd24128be24983af59683ff246bf2c98ba946
-size 29105
+oid sha256:c6aa949ebce91d4c7e5da9fd77fa7d7b972a01e094492dc117b9e965bdb27f90
+size 33429
diff --git a/tests/operations/dependentSpeed.m b/tests/operations/dependentSpeed.m
new file mode 100644
index 0000000..817a710
--- /dev/null
+++ b/tests/operations/dependentSpeed.m
@@ -0,0 +1,22 @@
+function dependentTime = dependentSpeed(times,len)
+    testClass = Test(1, 2, 3, 4, len, len);
+    
+    arr1 = zeros(1, len);
+    arr2 = zeros(1, len);
+
+    tic  
+    for k = 1:length(times)
+        for j = 1:times(k)
+            arr1(j) = testClass.dependentProp;
+        end
+    end
+    dependentTime.dependent = toc;
+    
+    tic  
+    for k = 1:length(times)
+        for j = 1:times(k)
+            arr2(j) = testClass.nonDependentProp;
+        end
+    end
+    dependentTime.nonDependent = toc;
+end
\ No newline at end of file
diff --git a/tests/speedBenchmarkConfig.m b/tests/speedBenchmarkConfig.m
index dced1b2..96bf141 100644
--- a/tests/speedBenchmarkConfig.m
+++ b/tests/speedBenchmarkConfig.m
@@ -42,6 +42,17 @@ for i = 1:length(vct)
 end
 clear temp
 
+%% Dependent vs non dependent time
+dep.dependentTime = [];
+dep.dependentRatio = [];
+
+for i = 1:length(vct)
+    temp = dependentSpeed(vct(i), vct(i));
+    dep.dependentTime = [dep.dependentTime temp]; %#ok<*AGROW>
+    dep.dependentRatio = [dep.dependentRatio temp.dependent/temp.nonDependent]; 
+end
+clear temp
+
 %% Scalar product time
 scalar.scalarProductTime = [];
 scalar.scalarProductRatio = [];
diff --git a/tests/speedBenchmarkPlot.m b/tests/speedBenchmarkPlot.m
index 4cff712..dcdda19 100644
--- a/tests/speedBenchmarkPlot.m
+++ b/tests/speedBenchmarkPlot.m
@@ -16,6 +16,9 @@ load('dataSpeed.mat')
 %% Assignment time element wise
 [~, ~] = speedPlots(assignment.assignmentTime, assignment.assignmentRatio, vct, 'Assignment element wise');
 
+%% Dependent
+[~, ~] = speedPlots(dep.dependentTime, dep.dependentRatio, vct, 'Dependent vs non dependent time');
+
 %% Scalar product
 [~, ~] = speedPlots(scalar.scalarProductTime, scalar.scalarProductRatio, vct, 'Scalar product');
 
diff --git a/tests/speedPlots.m b/tests/speedPlots.m
index bd67118..8b74a07 100644
--- a/tests/speedPlots.m
+++ b/tests/speedPlots.m
@@ -4,6 +4,36 @@ function [pltConfig, plt] = speedPlots(obj1, obj2, vct, name)
     speedPlotsFig = figure;
     tabgp   = uitabgroup(speedPlotsFig);
 
+    if strcmp(name,'Dependent vs non dependent time')
+        tab    = uitab(tabgp,'Title','Time');
+        axes('parent', tab)
+        for i = 1:length(vct)
+            semilogx(vct(i), obj1(i).dependent, '.' ,'Color', pltConfig.stdBlue)
+            semilogx(vct(i), obj1(i).nonDependent, '.', 'Color', pltConfig.stdRed)
+            hold on
+        end
+        pltConfig.lgdDependent = plot(nan, nan, 'color', pltConfig.stdBlue);
+        pltConfig.lgdNonDependent = plot(nan, nan, 'color', pltConfig.stdRed);
+        title(strcat(name,' time'));
+        xlabel('Number of elements')
+        ylabel('Speed [s]')
+        legend([pltConfig.lgdDependent, pltConfig.lgdNonDependent], {'Dependent', 'Non dependent'})
+        grid on
+        
+        tab    = uitab(tabgp,'Title','Ratio');
+        axes('parent', tab) 
+        x = 10:0.1:1000;
+        plt.readPlot = semilogx(vct, obj2);
+        hold on
+        plt.regrPlot = plot(x,polyval(polyfit(vct, obj2, 10),x), 'k--');
+        title(strcat(name,' time ratio'));
+        xlabel('Number of elements')
+        ylabel('Ratio')
+        legend([plt.readPlot, plt.regrPlot], {'Ratio','Regression'})
+        grid on
+        return
+    end
+
     if strcmp(name,'Assignment element wise')
         tab    = uitab(tabgp,'Title','Time');
         axes('parent', tab)
-- 
GitLab