c++ - 如何使用 android-ndk 优化 native 代码(速度优化)

标签 c++ optimization gcc android-ndk clang

我正在使用 cygwin 和 Windows7 编译 native 代码。 我在网上得到了很多优化技巧。

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

但我不明白如何在 Application.mk 和 Android.mk 上设置这些。 我通过应用上述技巧尝试了很多案例。 但是,我不认为优化应用于我的 native 代码。

应用程序.mk

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

安卓.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)

希望多多指教。


此外,

首先,我尝试比较了带有上述标志和没有它的情况。 (例如,我在 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 中,模块 B 比 A 慢太多。

因此,我断定这是没有优化的。

总而言之,

  1. 我比较了有旗帜和没有旗帜的速度。
  2. 在PC上运行这个程序时,预编译模块A比 B, 但在 Android 中,则完全相反。

你觉得我的程序有什么问题吗?提前谢谢你。

最佳答案

APP_OPTIM := 发布

将行 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 优化。

关于c++ - 如何使用 android-ndk 优化 native 代码(速度优化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18426710/

相关文章:

c++ - 改进此搜索的性能?

c++ - 解决此模板分辨率歧义的正确方法是什么?

c++ - 无法理解 kern.osversion ‘14.5.0

c++ - 其他文件中的静态函数访问

c++ - 带有 decltype : bug in clang or gcc? 的 sfinae

c++ - 如何正确包含头文件和实现文件?

c++ - 如何使用指向结构体 vector 的迭代器 C++?

c++ - 遍历对象集合的最快方法

c++ - C 和 C++ 的优化工具

haskell - 长度索引链表的融合