2013-08-25 14 views
5

Kompiluję kod natywny przy użyciu cygwin i Windows7. Mam wiele porad dotyczących optymalizacji w Internecie.Jak zoptymalizować natywny kod za pomocą android-ndk (Optymalizacja prędkości)

Nie mogę jednak dokładnie zrozumieć, jak ustawić te ustawienia w aplikacjach Application.mk i Android.mk. Próbowałem wielu przypadków, stosując powyższe wskazówki. , ale nie sądzę, że optymalizacja jest stosowana w moim natywnym kodzie.

Application.mk

APP_PROJECT_PATH := $(shell pwd) 
APP_MODULES := native_lib 
APP_OPTIM := release 
APP_BUILD_SCRIPT := Android.mk 
APP_ABI := armeabi 

Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := crypto 
LOCAL_SRC_FILES := lib/libcrypto.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := native_lib 
LOCAL_SRC_FILES := nativeC.c \ 
        AES/main.c \ 
        AES/aes.c \ 

LOCAL_C_INCLUDES := ./lib     
LOCAL_SHARED_LIBRARIES := crypto 
LOCAL_CFLAGS += -O2 
LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp 
LOCAL_LDLIBS += -ldl 
include $(BUILD_SHARED_LIBRARY) 

Mam nadzieję, że wiele komentarzy.


Ponadto

Najpierw starałem się porównać z przypadków między powyższym flagi i bez niego. (np. skompilowałem swój program za pomocą APP_OPTIM: = release w Application.mk, a następnie skompilowałem go bez niego lub z APP_OPTIM: = debug, znowu.) Ale nie widzę żadnej zmiany prędkości biegu.

Po drugie, to jest najważniejsze, mój program porównuje prędkość dwóch modułów. (Dla wygody nazywam je modułem A, B) Moduł A jest wstępnie zbudowany (co jest biblioteką libcrypto.so w Android.mk). I chcę zastosować optymalizację do Modułu B. Po pierwsze, porównałem test prędkości modułów A i B na PC (Visual Studio 2010). Kiedy wypróbowałem moduł A i B na PC, moduł B jest szybszy niż A. (Oczywiście, skompilowałem moduł A i używam go, wywołując bibliotekę.) Teraz przenoszę do niego mój program na PC dla Android. Ale w systemie Android moduł B jest zbyt wolny niż A.

Dlatego też doszedłem do wniosku, że nie jest to zoptymalizowane.

Podsumowując,

  1. porównałem prędkość pomiędzy z flagą i bez niego.
  2. Po uruchomieniu tego programu na komputerze, prekompilowany moduł A jest szybszy niż B, ale w systemie Android jest zupełnie odwrotnie.

Czy zastanawiasz się, jaki jest problem mojego programu? Z góry dziękuję.

+1

Jak rozpoznać, że skompilowany kod nie jest zoptymalizowany? – krsteeve

+0

Dodałem szczegóły w poniższej odpowiedzi. (Dodatkowo ...) – user2642459

+0

możesz edytować swoje pytanie z większą ilością szczegółów, nie powinieneś udzielać odpowiedzi, która w rzeczywistości nie jest odpowiedzią. – krsteeve

Odpowiedz

11

APP_OPTIM: = zwolnij

umieścić linię APP_OPTIM := release do swojej Application.mk złożyć

NDK-zbudować NDK_DEBUG = 0

Wystarczy zdać NDK_DEBUG=0 jako parametr skryptu do ndk-build . Nie potrzebujesz tego po zdefiniowaniu APP_OPTIM := release.

-DNDEBUG

ten powinien iść do swojego LOCAL_CFLAGS:

LOCAL_CFLAGS += -DNDEBUG 

LOCAL_CFLAGS + = -O2

To rzeczywiście nie jest wymagane, ponieważ Android NDK już definiuje -O2 optymalizacja.

+0

Nic nie wpływa na prędkość. Mówiąc wprost, zarówno Application.mk, jak i Android.mk są umieszczone w /jni /. – user2642459

+2

Co z '-O3' – xdevs23

Powiązane problemy