Wytajność Octavy a pliki OCT

0

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ę?

0

Przepraszam za gafę w tytule, dziołcha co chwile d. zawraca ...

0
%m = [m(1:end-1); 123];
%m = [m(2:end); 123];
%m(1) = []; m(end) = 123;
%m(end + 1) = 123; m(1) = [];
%m = circshift(m, -1); m(end) = 123;

Rezultatem twojej wersji z linii 1 jest modyfikacja ostatniego element wektora.
Efekt moich eksperymentów to linie 2-5, które prawdopodobnie robią co chciałeś("przesuwanie wektora i doklejenie nowej wartości"), wersja z linii 2-3 jest najszybsza, z linii 4 wolniejsza, a z linii 5 to żółw

Jeśli czas wykonania octavowej wersji ("m = [m(2:end); 123];") oznaczymy jako t
modyfikacja ostatniego elementu "dx(dx.length()-1) = args(1).double_value();" to koszt czasowy t,
przepisywanie wartości elementów w forze "for ... {dx(i) = dx(i+1);}" to koszt czasowy 1.5 * t,
razem te dwie operacje dają czas wykonania 1.5 * t

1 użytkowników online, w tym zalogowanych: 0, gości: 1