我一直在 Android 上执行一些测试,以验证如果并行化算法(如 FFT)的性能可以提高到什么程度。我通过将 pthread 与 JNI (FFTW) 和 Java 线程(来自 JTransforms)结合使用来实现这些算法。我没有像预期的那样通过使用线程获得更好的性能,而是使用串行算法获得了更好的结果。我不清楚为什么会得到这些结果,因为我在多核设备上执行了这些测试。看来 Android 系统使用的调度算法与 Linux 使用的有点不同,如果你想在 Android 上使用多个 CPU 进行多处理,你就不走运了。
FFTW 示例: JNI 代码在 https://github.com/maxrosan/DspBenchmarking/blob/master/jni/fftw_jni.c 中它的界面是https://github.com/maxrosan/DspBenchmarking/blob/master/src/br/usp/ime/dspbenchmarking/algorithms/fftw/FFTW.java .
测试中调用的方法是'execute'。
这里调用的方法是'perform'。
'execute' 和 'perform' 在另一个线程中被调用。
最佳答案
如果您的程序有多个 CPU 密集型线程持续运行,内核会将线程转移到单独的内核。否则,内核由两件事驱动:
- 在内核之间转移线程的成本很高(在性能方面)。
- 开启核心的成本很高(电池方面)。
Android 会尽可能关闭内核,并且仅在 CPU 需求需要时才启用它们。 “持续时间”的确切构成因设备而异。
我将两段示例代码放在一起,演示了多个内核的使用(C version、Java version)。
使用具有 systrace 的 root 设备支持您实际上可以图形化地看到每个内核上正在运行哪个线程。
更新: 我认为有一个例子可能会有所帮助,所以我将我的 MultiCore.java 测试包装在一个示例应用程序中,并在 4.3 Nexus 4 上的 systrace 下运行它。我创建了一个页面 explains the results .
关于java - Android 上的多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17842864/