我正在使用本地代码在Android上进行图像压缩。由于各种原因,我无法使用预编译库。
我使用android-ndk-profiler对我的代码进行了分析,并发现瓶颈是--令人惊讶的--浮点运算!以下是分析输出:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
40.37 0.44 0.44 __addsf3
11.93 0.57 0.13 7200 0.02 0.03 EncodeBlock
6.42 0.64 0.07 535001 0.00 0.00 BitsOut
6.42 0.71 0.07 __aeabi_fdiv
6.42 0.78 0.07 __gnu_mcount_nc
5.50 0.84 0.06 __aeabi_fmul
5.50 0.90 0.06 __floatdisf
...
我搜索了 __addsf3,显然它是一种软件浮点运算。可恶。我对ARMv6架构核心进行了更多的研究,除非我漏掉了什么,否则它没有硬件浮点支持。那么我该怎么做才能加速呢?定点运算?我知道这通常是用整数来实现的,但我不太确定如何转换我的代码。我是否可以设置编译器标志来实现?欢迎提出其他建议。