Wydajność funkcji vs czysty kod - szansa na optymalizację?

0

Czy istnieją jakieś metody optymalizacji funkcji bądź ustawienie kompilatora, żeby w miejscu wywołania funkcji wstawić jej zawartość a nie wykonywać skoki itp??
Czy to może, w moim kodzie jest jakiś haczyk, że przy użyciu funkcji czas wykonania wynosi 4.8 sec a czysty kod 0.675sec.

Przy okazji zapytam czy jest możliwe wykonanie tego kodu w jednej linijce
A = (AHKObject*) O->A[Row].Value;
return A->A[Item].Value;

unsigned int F(HWND h,AHKObject* Events_O,AHKObject* Col_O) {
	int ColCount = Col_O->Item_Num;
	int RowCount = Events_O->Item_Num;

	int q = 0;
	for(int row=0; row<100000000; row++){
		AHKObject *A;
		A = (AHKObject*) Events_O->A[0].Value; // <-----------------
		q += A->A[3].Value; // <--------------------
		//q +=RV(Events_O,0,3); // <--------------------
	}
	return q;
}

int RV(AHKObject *O,int Row, int Item){
	AHKObject *A;
	A = (AHKObject*) O->A[Row].Value;
	return A->A[Item].Value;
}
 
1

Czy istnieją jakieś metody optymalizacji funkcji bądź ustawienie kompilatora, żeby w miejscu wywołania funkcji wstawić jej zawartość a nie wykonywać skoki

Jeżeli mówimy o C++

kompilator widząc że funkcja jest inline w miejsce jej wywołania nie wstawia jak w normalnym przypadku wskaźnika do tej funkcji w pamięci, lecz wpisuje jej kod w miejsce jej wystąpienia.

http://pl.wikibooks.org/wiki/C++/Funkcje_inline

Tylko pamiętaj o zwiększonej wadze programu i nigdy nie dawaj jako inline funkcji którą wywołujesz w pętli
Chodziło mi o to by w funkcji inline nie było pętli gdyż program rozrósł by się do dużych rozmiarów co by go spowolniło zamiast przyśpieszyło.

0

zamieniłem funkcję na

inline int RV(AHKObject *O,int Row, int Item){
	AHKObject *A;
	A = (AHKObject*) O->A[9].Value;
	return A->A[3].Value;
} 

a także w nagłówku

inline int RV(AHKObject* O,int Row, int Item); 

niestety brak jakichkolwiek efektów, próbowałem także __forceinline i to samo.
dla testu także spróbowałem z najprostszą funkcją, efekt taki sam...

__forceinline int a(int a, int b){
	return a+b;
} 

Sposób kompilacji ma tutaj jakiś wpływ?? Bo kompiluję to w ten sposób, że po uruchomieniu mojej aplikacji uruchamiam
C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe "C:\Users\xXx\Documents\Visual Studio 2010\Projects\qqq\qqq.sln" po czym kopiuję skompilowany dll do mojej folderu aplikacji i stamtąd ładuję go do programu ... Tak jest mi wygodniej gdyż mój główny program jest napisany w Autohotkey'u

0

Co do pierwszego pytania, twój problem polega na tym że nie rozumiesz zasady inline aby kompilator łaskawie na to się zgodził to musisz całą deklaracje funkcji umieścić przed pierwszym wywołaniem (warunek niezbędny ale nie wystarczający).
Co do drugiego pytania:

inline int RV(AHKObject *O,int Row, int Item) { return ((AHKObject*)O->A[Row].Value)->A[Item].Value; } 

Poza tym przy tak zawiłym kodzie podejrzewam błąd w projekcie.

2
  1. mierz prędkość tylko buildu Release. build Debug wiadomo że będzie powolny, bo nie do mierzenia prędkości służy.
  2. dla kompilacji Release ustaw pełną optymalizację (parametr /Ox)
    vs.png
0
Azarien napisał(a):
  1. mierz prędkość tylko buildu Release. build Debug wiadomo że będzie powolny, bo nie do mierzenia prędkości służy.
  2. dla kompilacji Release ustaw pełną optymalizację (parametr /Ox)
    vs.png

w tej konfiguracji w zasadzie zatarły się różnicę pomiędzy "kodem" a "funkcją"....

Czy gdzieś można w VS znaleźć "aktualną" linię komend, bo C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe "C:\Users\xXx\Documents\Visual Studio 2010\Projects\qqq\qqq.sln" cały czas kompiluje mi Debuga a męczące jest ręczne kompilowanie przed każdym uruchomieniem programu i chciałbym aby właśnie w ww konfiguracji mi się kompilowało z linii komend.

1
msbuild plik.sln /p:Configuration=Release

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