使用Java线程在Android DualCore Handy LG Optimus Speed上没有加速?

时间:2011-05-03 18:38:09

标签: java android multithreading performance lg

我正在玩LG LG P990的最佳速度,并注意到我无法使用多线程获得任何加速。

我使用以下代码来测量某些计算所需的时间。

public class TestThreads扩展了Thread {

public void run()
{
double temp;
    for(int i = 0; i < 5000000 ;i++)
    {
        temp = Math.random()*Math.random();
    }
}

}

    long start = System.currentTimeMillis();
    Thread t1 = new TestThreads();
    Thread t2 = new TestThreads();
    t1.start();
    t2.start();
t1.join();
t2.join();

我得到的时间与计算所需的时间相比

    for(int i = 0; i < 10000000 ;i++)
    {
        temp = Math.random()*Math.random();
    }

由于2 Threaded Version计算相同数量的循环但分布在2个可能并行运行的Threads上,我预计这个版本要快得多。然而,根本没有加速,在某些情况下,螺纹版甚至更慢。我的想法/代码有问题,还是Android没有在多个CPU内核上分配多个线程?

2 个答案:

答案 0 :(得分:2)

Math.random()不是线程安全的,它有一个控制访问的互斥锁,这会增加开销并减慢线程速度。你可以在这里阅读http://code-o-matic.blogspot.com/2009/01/beware-of-hidden-contention-of.html

尝试做一些线程安全的事情。

答案 1 :(得分:0)

首先,无论何时使用线程,都会增加内存开销,因为您创建的其他对象以及必须在Java虚拟机中为它们分配的内存。

其次,即使在具有单个线程的应用程序中,也可以使用并拥有2个CPU的事实。这是正确的,因为即使应用程序在单个处理器中执行,另一个将处理来自其他应用程序的其他任务,从而使第一个任务在更长时间内自由,并允许更连续地处理您的应用程序。

在任何情况下,操作系统都决定在给定时间处理哪个应用程序,以及处理它的处理器。

但由于这些原因,在某些情况下,即使使用其他线程安全的方法,特别是当设备中有大量处理时,开销可能也不值得获得。但是,使用线程安全方法(与Math.random()不同),在最坏的情况下应该有增益,即使很小。