【发布时间】:2013-02-01 20:09:50
【问题描述】:
当我在多核设备(如 S3)和单核 android 设备上运行多线程 android 应用程序时,我试图衡量我的代码的性能改进。为了衡量性能,我按顺序运行任务而不是并行运行。我已经实现了普通的 Java 线程,这似乎没有什么不同。因此我尝试了 AsynchTask,但我只得到了一点性能提升。
您能否告诉我如何编写代码来确保我的每个任务/线程都在不同的内核上运行,而不是在单个内核上运行?如果这不可能,我如何才能最大限度地为我的应用使用多个内核?
这是执行任务的 Activity 的 onCreate 方法的代码。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_local_executor);
multiplicationTask t1 = new multiplicationTask();
t1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
multiplicationTask t2 = new multiplicationTask();
t2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
multiplicationTask t3 = new multiplicationTask();
t3.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
multiplicationTask t4 = new multiplicationTask();
t4.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
这是从 onCreate 方法运行的 AsynchTask
class multiplicationTask extends AsyncTask<Integer, Integer, String> {
protected void onPreExecute()
{
Log.v("PrintLN", "Executing Task");
}
@Override
protected String doInBackground(Integer... params) {
//Do lots of floating point operations that are independent of anything whatsoever
}
protected void onPostExecute(String result) {
Log.v("PrintLN", "Done Task: " + resulting_time);
}
}
【问题讨论】:
-
FWIW,这被称为“线程关联”,甚至在标准 Java 中都不支持 - 至少 not in the JCL。
-
您的矩阵乘法是如何实现的?我不知道 JIT 是否进行循环操作。如果不是,矩阵乘法可以由内存传输而不是处理器内计算来支配。我建议替换为纯计算的东西,很少或没有内存访问。
-
@PatriciaShanahan 出于测试目的,我将两个 8x8 浮点数组相乘 - 您还有什么建议?
-
8x8 应该足够小以适合缓存,因此如果您对它们进行足够多的操作以使其可测量,那么它应该受 CPU 限制。
标签: java android multithreading performance android-asynctask