Cześć!
Dużo programuję w C/C++ i w Octavie, postanowiłem więc zotymalizować kilka funkcji z których często korzystam.
Na starcie, zastanawia mnie czy da się zoptymalizować, przesuwanie wektora i "doklejenie" nowej wartości:
#!/usr/bin/octave-cli -q
N = 10000000;
m = zeros(N, 1);
for i=1:5
tic();
m = [m(1:end-1); 123];
toc();
end
Czasy na moim sprzęcie:
$ ./mytest.m
Elapsed time is 0.111147 seconds.
Elapsed time is 0.111628 seconds.
Elapsed time is 0.111384 seconds.
Elapsed time is 0.110364 seconds.
Elapsed time is 0.11188 seconds.
Napisałem funkcje, helloworld - nazwa została z poszukiwań jak się w ogóle pliki OCT "pisze":
#include <octave/oct.h>
DEFUN_DLD (helloworld, args, nargout, "Hello World!")
{
ColumnVector dx = args(0).vector_value ();
for(int i=0; i<dx.length()-1; ++i){
dx(i) = dx(i+1);
}
dx(dx.length()-1) = args(1).double_value();
return octave_value(dx);
}
//mkoctfile -Wall helloworld.cc -o helloworld.oct
Porównianie metod:
#!/usr/bin/octave-cli -q
N = 10000000;
m = zeros(N, 1);
for i=1:5
tic();
m = [m(1:end-1); 123];
toc();
end
printf('\n');
for i=1:5
tic();
m = helloworld(m, 123);
toc();
end
Wynik:
Elapsed time is 0.111147 seconds.
Elapsed time is 0.111628 seconds.
Elapsed time is 0.111384 seconds.
Elapsed time is 0.110364 seconds.
Elapsed time is 0.11188 seconds.
Elapsed time is 0.159062 seconds.
Elapsed time is 0.156478 seconds.
Elapsed time is 0.157529 seconds.
Elapsed time is 0.156857 seconds.
Elapsed time is 0.156399 seconds.
Rozumiem że m = [m(1:end-1); 123];
może być już zoptymalizowane, ale nie na tyle, że funkcja w C++ jest wolniejsza...
Jak napisać szybszą funkcję w C++? Coś źle kombinuję?