java - Android 上的多处理

标签 java android c multithreading java-native-interface

我一直在 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'。

纯 Java 示例: https://github.com/maxrosan/DspBenchmarking/blob/master/src/br/usp/ime/dspbenchmarking/algorithms/jtransforms/fft/DoubleFFT_1D2TAlgorithm.java

这里调用的方法是'perform'。

'execute' 和 'perform' 在另一个线程中被调用。

最佳答案

如果您的程序有多个 CPU 密集型线程持续运行,内核会将线程转移到单独的内核。否则,内核由两件事驱动:

  • 在内核之间转移线程的成本很高(在性能方面)。
  • 开启核心的成本很高(电池方面)。

Android 会尽可能关闭内核,并且仅在 CPU 需求需要时才启用它们。 “持续时间”的确切构成因设备而异。

我将两段示例代码放在一起,演示了多个内核的使用(C versionJava version)。

使用具有 systrace 的 root 设备支持您实际上可以图形化地看到每个内核上正在运行哪个线程。

更新: 我认为有一个例子可能会有所帮助,所以我将我的 MultiCore.java 测试包装在一个示例应用程序中,并在 4.3 Nexus 4 上的 systrace 下运行它。我创建了一个页面 explains the results .

关于java - Android 上的多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17842864/

相关文章:

java - BlackBerry OS 中的自定义日期解析

java - 为什么 Java 中的 LinkedList 不是真正的链表?

android - RecyclerView里面的Grid,哪一列是左边还是右边

android - 需要帮助在 Google 的 Android 开发者网站上找出适配器 "tutorial"

c# - 如何将数据行中的所有单元格复制到 session 中?

c++ - 函数可以访问传递给 main() 的参数吗?

c - 如何在 C 中正确地重新分配一个位数组

java - 如何在 java 中提取 .Z 文件?

Java: Swing 计时器等待

java - 在 Java/Android 中提取 3GP 视频文件的持续时间