diff --git a/tests/speedBenchmark.asv b/tests/speedBenchmark.asv
deleted file mode 100644
index 1388be0e6f1ef8be1f34f7e9237e143556ce35e9..0000000000000000000000000000000000000000
--- a/tests/speedBenchmark.asv
+++ /dev/null
@@ -1,22 +0,0 @@
-ms = Mission(true);
-
-cl = Motor(ms);
-st = struct(cl);
-
-len = length(st.xCg);
-a = zeros(1, len);
-b = zeros(1, len);
-
-tic  
-    for i = 1:len
-        a(i) = cl.xCg(i);
-    end
-classTime = toc;
-
-tic  
-    for i = 1:len
-        b(i) = st.xCg(i);
-    end
-structTime = toc;
-
-disp(strcat('classTime: ', classTime));
\ No newline at end of file
diff --git a/tests/speedBenchmark.m b/tests/speedBenchmark.m
index 68055776ad1243bac7db8bd31bffdbf29847e8cd..395c8bb95eccd720164e5c4c75c004059b3b1c32 100644
--- a/tests/speedBenchmark.m
+++ b/tests/speedBenchmark.m
@@ -1,119 +1,72 @@
-clear; clc; close all;
-
-%% Low overhead
-
-testClass = Test(1, 2, 3);
-testStruct = struct;
-
-testStruct.a = 1;
-testStruct.b = 2;
-testStruct.c = 3;
-
-len = 3*10000;
-arr1 = zeros(1, len);
-arr2 = zeros(1, len);
-
-fields = fieldnames(testClass);
-
-tic  
-for i = 1:len
-    arr1(i) = testStruct.(fields{mod(i,3) + 1});
-end
-fprintf('readTime, struct: %f s\n', toc);
-
-tic  
-for i = 1:len
-    arr2(i) = testClass.(fields{mod(i,3) + 1});
-end
-fprintf('readTime, class: %f s\n', toc);
-fprintf('\n=======================\n\n');
-
-%% High overhead
-ms = Mission(true);
-
-cl = Motor(ms);
-st = struct(cl);
-
-len = length(st.xCg);
-a = zeros(1, len);
-b = zeros(1, len);
-c = zeros(1, len);
-d = zeros(1, len);
-
-tic  
-a = cl.xCg;
-fprintf('stdAssignment, class: %f s\n', toc);
-
-tic  
-c = st.xCg;
-fprintf('stdAssignment, struct: %f s\n', toc);
-fprintf('\n=======================\n\n');
-
-tic  
-for i = 1:len
-    b(i) = cl.xCg(i);
+function speed = speedBenchmark(len)
+    %=======READ=========
+    testClass = Test(1, 2, 3, 4);
+    testStruct = struct;
+    
+    testStruct.a = 1;
+    testStruct.b = 2;
+    testStruct.c = 3;
+   
+    arr1 = zeros(1, len);
+    arr2 = zeros(1, len);
+    
+    fields = fieldnames(testClass);
+    
+    tic  
+    for i = 1:len
+        arr1(i) = testStruct.(fields{mod(i,3) + 1});
+    end
+    speed.readTime.struct = toc;
+    
+    tic  
+    for i = 1:len
+        arr2(i) = testClass.(fields{mod(i,3) + 1});
+    end
+    speed.readTime.class = toc;
+
+    ms = Mission(true);
+
+    %=======ASSIGNMENT=========
+    cl = Motor(ms);
+    st = struct(cl); % converting class to a struct. calling of a warning
+    
+    len_xcg = length(st.xCg);
+    a = zeros(1, len_xcg);
+    b = zeros(1, len_xcg);
+    c = zeros(1, len_xcg);
+    d = zeros(1, len_xcg);
+    
+    tic  
+    a = cl.xCg;
+    speed.assignment.std.class = toc; 
+    
+    tic  
+    c = st.xCg;
+    speed.assignment.std.struct = toc;
+    
+    tic  
+    for i = 1:len_xcg
+        b(i) = cl.xCg(i);
+    end
+    speed.assignment.elementWise.class = toc;
+    
+    tic  
+    for i = 1:len_xcg
+        d(i) = st.xCg(i);
+    end
+    speed.assignment.elementWise.struct = toc;
+
+    %=======SCALAR PRODUCT=======
+    rng;
+    v1 = randi(1000,len,1); v2 = randi(1000,len,1);
+    testClass.a = v1; testStruct.a = v1;
+    testClass.b = v2; testStruct.b = v2;
+    
+    tic
+    scalarProductStruct = dot(testStruct.a,testStruct.b);
+    speed.scalarProduct.struct = toc;
+
+    tic
+    scalarProductClass = dot(testClass.a,testClass.b);
+    speed.scalarProduct.class = toc;
 end
-fprintf('elementWiseAssignment, class: %f s\n', toc);
-
-tic  
-for i = 1:len
-    d(i) = st.xCg(i);
-end
-fprintf('elementWiseAssignment, struct: %f s\n', toc);
-
-%% Integration test
-mission = Mission(1);
-motor = Motor(mission);
-wind = Wind(mission);
-aero = Aerodynamics(mission);
-mass = Masses(mission, motor);
-env = Environment(mission, motor);
-geo = Geometries(mission, motor, mass);
-inertia = Inertia(mission, motor, mass, geo);
-
-settings.wind.model = true;
-settings.wind.input = false;
-settings.wind.variable = false;
-settings.timeEngineCut = inf;
-
-settings.tControl = motor.time(end);
-settings.control = [1 3];
-settings.MachControl = 0.8; 
-settings.tb = motor.time(end);
-
-Q0 = angleToQuat(env.phi, env.omega, 180*pi/180)';
-
-%%% State
-X0 = [0 0 0]';
-V0 = [0 0 0]';
-W0 = [0 0 0]';
-
-Y0a = [X0; V0; W0; Q0];
-
-settings.ode.optionsasc1 = odeset('Events', @eventApogee, 'InitialStep', 1);
-tf = 2000;
-
-t = 0;
-Y = zeros(1,13);
-Y(end) = 1;
-
-tic
-[Ta, Ya] = ode113(@ascent, [0, tf], Y0a, settings.ode.optionsasc1, geo, mass, motor, inertia, ...
-    env, wind, aero, settings); % till the apogee
-classTime = toc;
-
-motor = struct(motor);
-wind = struct(wind);
-aero = struct(aero);
-mass = struct(mass);
-env = struct(env);
-geo = struct(geo);
-inertia = struct(inertia);
-clc;
-
-tic
-[~, ~] = ode113(@ascent, [0, tf], Y0a, settings.ode.optionsasc1, geo, mass, motor, inertia, ...
-    env, wind, aero, settings); % till the apogee
-structTime = toc;
-
-fprintf('speed ratio (class/struct): %f\n', (classTime / structTime));
\ No newline at end of file
diff --git a/tests/speedBenchmark2.m b/tests/speedBenchmark2.m
index b164cda1587c66e065ec229e5929d6341858d4af..49a486bd5dc681e1856553a44c5f004635088657 100644
--- a/tests/speedBenchmark2.m
+++ b/tests/speedBenchmark2.m
@@ -1,3 +1,4 @@
+% ottimizzazione proprietà dipendenti (no)
 a = 1;
 b = 2;
 c = 3;
diff --git a/tests/speedBenchmarkPlot.m b/tests/speedBenchmarkPlot.m
new file mode 100644
index 0000000000000000000000000000000000000000..6abf509588a1d695f7bf9ac89f7c850bedfaf4eb
--- /dev/null
+++ b/tests/speedBenchmarkPlot.m
@@ -0,0 +1,77 @@
+%% 
+clc; close all; clear all;
+warning off 
+% call of a warning because converting class to a struct in function
+
+%% function
+vct = 10^2:1000:10^5;
+speed = [];
+for i = 1:length(vct)
+    head = speedBenchmark(vct(i));
+    speed = [speed head]; %#ok<*AGROW>
+end
+clear head
+
+%% Plots
+plt.stdBlue = [0 0.447 0.741];
+plt.stdRed = [0.8500 0.3250 0.0980];
+
+% Reading time
+figure
+for i = 1:length(vct)
+    semilogx(vct(i), speed(i).readTime.struct, '.' ,'Color', plt.stdBlue)
+    semilogx(vct(i), speed(i).readTime.class, '.', 'Color', plt.stdRed)
+    hold on
+end
+plt.lgdStruct = plot(nan, nan, 'color', plt.stdBlue);
+plt.lgdClass = plot(nan, nan, 'color', plt.stdRed);
+title('readTime');
+xlabel('Number of elements')
+ylabel('Speed [s]')
+legend([plt.lgdStruct, plt.lgdClass], {'Struct', 'Class'})
+grid on
+
+% Assignment time standard
+figure
+for i = 1:length(vct)
+    semilogx(vct(i), speed(i).assignment.std.struct, '.' ,'Color', plt.stdBlue)
+    semilogx(vct(i), speed(i).assignment.std.class, '.', 'Color', plt.stdRed)
+    hold on
+end
+plt.lgdStruct = plot(nan, nan, 'color', plt.stdBlue);
+plt.lgdClass = plot(nan, nan, 'color', plt.stdRed);
+title('Assignment time standard');
+xlabel('Number of elements')
+ylabel('Speed [s]')
+legend([plt.lgdStruct, plt.lgdClass], {'Struct', 'Class'})
+grid on
+
+% Assignment time element wise
+figure
+for i = 1:length(vct)
+    semilogx(vct(i), speed(i).assignment.elementWise.struct, '.' ,'Color', plt.stdBlue)
+    semilogx(vct(i), speed(i).assignment.elementWise.class, '.', 'Color', plt.stdRed)
+    hold on
+end
+plt.lgdStruct = plot(nan, nan, 'color', plt.stdBlue);
+plt.lgdClass = plot(nan, nan, 'color', plt.stdRed);
+title('Assignment time element wise');
+xlabel('Number of elements')
+ylabel('Speed [s]')
+legend([plt.lgdStruct, plt.lgdClass], {'Struct', 'Class'})
+grid on
+
+% Scalar product
+figure
+for i = 1:length(vct)
+    semilogx(vct(i), speed(i).scalarProduct.struct, '.' ,'Color', plt.stdBlue)
+    semilogx(vct(i), speed(i).scalarProduct.class, '.', 'Color', plt.stdRed)
+    hold on
+end
+plt.lgdStruct = plot(nan, nan, 'color', plt.stdBlue);
+plt.lgdClass = plot(nan, nan, 'color', plt.stdRed);
+title('Scalar product time');
+xlabel('Number of elements')
+ylabel('Speed [s]')
+legend([plt.lgdStruct, plt.lgdClass], {'Struct', 'Class'})
+grid on
\ No newline at end of file
diff --git a/tests/speedBenchmark_script.m b/tests/speedBenchmark_script.m
new file mode 100644
index 0000000000000000000000000000000000000000..be8e323f9d3cebbc6d39324dd5adbb1572f5a153
--- /dev/null
+++ b/tests/speedBenchmark_script.m
@@ -0,0 +1,120 @@
+clear; clc; close all;
+
+%% Low overhead
+
+testClass = Test(1, 2, 3, 4);
+testStruct = struct;
+
+testStruct.a = 1;
+testStruct.b = 2;
+testStruct.c = 3;
+
+len = 3*10000;
+arr1 = zeros(1, len);
+arr2 = zeros(1, len);
+
+fields = fieldnames(testClass);
+
+tic  
+for i = 1:len
+    arr1(i) = testStruct.(fields{mod(i,3) + 1});
+end
+fprintf('readTime, struct: %f s\n', toc);
+
+tic  
+for i = 1:len
+    arr2(i) = testClass.(fields{mod(i,3) + 1});
+end
+fprintf('readTime, class: %f s\n', toc);
+fprintf('\n=======================\n\n');
+
+%% High overhead
+ms = Mission(true);
+
+cl = Motor(ms);
+st = struct(cl);
+
+len = length(st.xCg);
+a = zeros(1, len);
+b = zeros(1, len);
+c = zeros(1, len);
+d = zeros(1, len);
+
+tic  
+a = cl.xCg;
+time = toc; % !!!!!!!!
+fprintf('stdAssignment, class: %f s\n', time);
+
+tic  
+c = st.xCg;
+fprintf('stdAssignment, struct: %f s\n', toc);
+fprintf('\n=======================\n\n');
+
+tic  
+for i = 1:len
+    b(i) = cl.xCg(i);
+end
+fprintf('elementWiseAssignment, class: %f s\n', toc);
+
+tic  
+for i = 1:len
+    d(i) = st.xCg(i);
+end
+fprintf('elementWiseAssignment, struct: %f s\n', toc);
+
+%% Integration test
+mission = Mission(1);
+motor = Motor(mission);
+wind = Wind(mission);
+aero = Aerodynamics(mission);
+mass = Masses(mission, motor);
+env = Environment(mission, motor);
+geo = Geometries(mission, motor, mass);
+inertia = Inertia(mission, motor, mass, geo);
+
+settings.wind.model = true;
+settings.wind.input = false;
+settings.wind.variable = false;
+settings.timeEngineCut = inf;
+
+settings.tControl = motor.time(end);
+settings.control = [1 3];
+settings.MachControl = 0.8; 
+settings.tb = motor.time(end);
+
+Q0 = angleToQuat(env.phi, env.omega, 180*pi/180)';
+
+%%% State
+X0 = [0 0 0]';
+V0 = [0 0 0]';
+W0 = [0 0 0]';
+
+Y0a = [X0; V0; W0; Q0];
+
+settings.ode.optionsasc1 = odeset('Events', @eventApogee, 'InitialStep', 1);
+tf = 2000;
+
+t = 0;
+Y = zeros(1,13);
+Y(end) = 1;
+
+tic
+[Ta, Ya] = ode113(@ascent, [0, tf], Y0a, settings.ode.optionsasc1, geo, mass, motor, inertia, ...
+    env, wind, aero, settings); % till the apogee
+classTime = toc;
+
+motor = struct(motor);
+wind = struct(wind);
+aero = struct(aero);
+mass = struct(mass);
+env = struct(env);
+geo = struct(geo);
+inertia = struct(inertia);
+clc;
+
+tic
+[~, ~] = ode113(@ascent, [0, tf], Y0a, settings.ode.optionsasc1, geo, mass, motor, inertia, ...
+    env, wind, aero, settings); % till the apogee
+structTime = toc;
+
+fprintf('speed ratio (class/struct): %f\n', (classTime / structTime));
\ No newline at end of file