마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

ndk를 이용한 native code의 실행 속도를 최적화하는 방법

0 추천

Window7에서 cygwin을 이용해서 native code를 컴파일하고 있습니다. 
실행 속도가 중요하기 때문에, 최적화를 적용하여 native code를 컴파일하기위해 
Application.mk & Android.mk을 다음과 같이 적용하였는데, 최적화가 적용되는 것 같지 않습니다.

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 += -DNDEBUG
LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
LOCAL_LDLIBS += -ldl
include $(BUILD_SHARED_LIBRARY)

많은 조언 부탁드립니다.


참고1.
최적화가 적용되었는지 판단한 이유는 다음과 같습니다.

첫번째, 최적화 관련 flag를 적용했을때와 적용하지 않았을때의 속도를 비교하지만,
(e.g. Application.mk에 APP_OPTIM := release를 추가하였을때와 추가하지 않았을때 또는 APP_OPTIM := debug로 적용했을때의 속도를 비교함.) 실행속도에는 어떠한 변화가 없었습니다.

두번째, (가장 중요한 부분인데) 현재 제가 개발하고 있는 프로그램이 두가지 모듈의 속도를 비교하는 프로그램입니다.
(편의상, module A와 B로 부르겠습니다.) 
모듈A는 미리 컴파일된 라이브러리(Android.mk의 libcrypto.so)로서 라이브러리의 함수를 호출하여 실행하는 방식으로 속도를 측정하고,
모듈B는 직접 구현한 native code에 최적화를 적용하여 컴파일하려고 합니다.
현재 개발하고 있는 프로그램 이전에 PC에서 module A(PC용으로 미리 컴파일된 라이브러리)와 module B를 실행후 속도를 비교하여 module B가 빨랐기 때문에,
동일한 모듈을 안드로이드에서 실행해도 최적화가 적용된다면 동일하게 module B가 빠를 것으로 예상하고 있습니다.
그러나, 예상과 달리 안드로에서는 module A(안드로이드용으로 미리 컴파일된 라이브러리)가 훨씬 빨라서, 
최적화 적용이 안되었다고 판단하고 있습니다.

참고2. 
Application.mk & Android.mk의 경로는 모두 <project folder>/jni 입니다.
PC의 CPU 정보는 "Intel COre 2 Quad Q6600" 이고, Android의 CPU 정보는 "ARMv7 Processor rev 1 (v7l)" 입니다.

 

위의 문제와 관련해서 답변 또는 어떤 식으로 고민해야 할지,,, 등등 어떠한 코맨트도 환영합니다. 
많은 답변 부탁드립니다.

 

익명사용자 님이 2013년 8월 27일 질문

1개의 답변

0 추천
O3로 하셔야지 인라인이 제대로 동작합니다.
익명사용자 님이 2013년 8월 27일 답변
...