如何使用Android-NDK优化本地代码(速度优化)

7

我正在使用Cygwin和Windows7编译本地代码。

我在互联网上得到了许多优化提示。

APP_OPTIM := release
ndk-build NDK_DEBUG=0
-DNDEBUG
LOCAL_CFLAGS += -O2

但我不太明白如何在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 += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
LOCAL_LDLIBS += -ldl
include $(BUILD_SHARED_LIBRARY)

我希望有很多评论。


此外,

首先,我尝试比较使用APP_OPTIM := release标志和不使用该标志的情况。 (例如,我在Application.mk中编译程序时使用了APP_OPTIM := release,然后我再次编译时没有使用它或使用APP_OPTIM := debug。)但是,我看不到运行速度的任何变化。

其次,这是最重要的,我的程序比较了两个模块的速度。 (为方便起见,我称它们为模块A、B)模块A是预构建的(在Android.mk中是libcrypto.so)。我想将优化应用于模块B。首先,我在PC(Visual Studio 2010)上比较了模块A和B的速度测试。当我在PC上尝试模块A和B时,模块B比A快。(当然,我预编译了模块A,并通过调用库来使用它。)现在我正在将我的程序从PC移植到Android。但是在Android上,模块B比A慢得太多了。

因此,我得出结论:这并没有进行优化。

总之,

  1. 我比较了使用标志和不使用标志的速度。
  2. 在PC上运行此程序时,预编译的模块A比B快,但在Android上完全相反。

您认为我的程序有什么问题吗?提前感谢您。


1
你如何判断编译后的代码是否经过优化? - krsteeve
我在下面的答案中添加了细节。(此外...) - user2642459
您可以编辑问题以提供更多详细信息,不应该提供实际上不是答案的回答。 - krsteeve
1
你的电脑是一台Intel机器,而手机则是一台ARM机器。如果你没有编写那段代码,如果你不知道细节,你就不能声称“因此,我得出结论这不是优化的”。 - auselen
我的电脑CPU是“Intel Core 2 Quad Q6600”,而手机的CPU是“ARMv7 Processor rev 1 (v7l)”。如果您需要其他信息来解决我的问题,我可以提供任何信息。 - user2642459
优化并不保证速度的提升。至于@auselen的建议——你正在比较在不同架构上运行的两个库,它们的性能可能会有所不同。你正在比较的预编译库甚至可能在每个平台上都使用了不同的优化方式进行编译。除非你能控制所有这些变量,否则这不是一个有效的测试。 - krsteeve
1个回答

13

APP_OPTIM := release

将这行代码APP_OPTIM := release放入您的Application.mk文件中。

ndk-build NDK_DEBUG=0

只需将NDK_DEBUG=0作为参数传递给ndk-build脚本即可。一旦定义了APP_OPTIM := release,您就不需要它。

-DNDEBUG

这应该放入您的LOCAL_CFLAGS中:

LOCAL_CFLAGS += -DNDEBUG

LOCAL_CFLAGS += -O2

实际上这并不是必要的,因为Android NDK已经定义了-O2优化。


任何事情都不会影响速度。引用地,Application.mk和Android.mk都放在<project folder>/jni/中。 - user2642459

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接