多核处理器的多线程

时间:2013-04-30 15:51:47

标签: android multithreading multicore

我有三星Galaxy S3,它使用自己的Exynos 4 Quad处理器。 所以我想优化我的应用程序,它可以使用所有4核处理器。

所以我做了一些测试:

  1. 在一个线程中运行任务。处理时间 - 8秒。

  2. 在四个线程中运行任务。处理时间 - 仍然是8秒。

     new Thread() {
        public void run() {
                        // do 1/4 of task
        }
    }.start();
    
    new Thread() {
        public void run() {
                        // do 1/4 of task
        }
    }.start();
    
    new Thread() {
        public void run() {
                        // do 1/4 of task
        }
    }.start();
    
    new Thread() {
        public void run() {
                        // do 1/4 of task
        }
    }.start();
    
  3. 在ExecutorService中运行任务。和处理时间 - 仍然是8秒。

    ExecutorService threadPool = null;
    threadPool = Executors.newFixedThreadPool(4);
    
    threadPool.execute(new Runnable() {
        @Override
        public void run() {
             // do 1/4 of task
                          }});
    threadPool.execute(new Runnable() {
        @Override
        public void run() {
             // do 1/4 of task
                          }});
    threadPool.execute(new Runnable() {
        @Override
        public void run() {
             // do 1/4 of task
                          }});
    threadPool.execute(new Runnable() {
        @Override
        public void run() {
             // do 1/4 of task
                          }});
    
  4. 看起来所有工作都是同步完成的。为什么它不平行?

1 个答案:

答案 0 :(得分:3)

您可以在C或Java中尝试我的测试:

http://bigflake.com/cpu-spinner.c.txt
  http://bigflake.com/MultiCore.java.txt

当在Nexus 4上运行MultiCore.java时,我看到:

Thread 1 finished in 1516ms (1267234688)
Thread 3 finished in 1494ms (1519485328)
Thread 0 finished in 1530ms (51099776)
Thread 2 finished in 1543ms (-1106614992)
All threads finished in 1550ms

<强>更新 使用systrace观察测试很有用。作为回答类似question的一部分,我为此测试设置了shows the systrace output的页面。您可以看到如何调度线程,并观察其他两个核心是否已启动。