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