1

我在玩 LG LG P990 Optimus 速度,发现使用多线程根本无法获得任何加速。

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

公共类 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 版本计算了相同数量的循环,但分布在 2 个可能并行运行的线程上,我预计这个版本会明显更快。然而,根本没有加速,在某些情况下,线程版本甚至更慢。我的想法/代码有问题还是 Android 没有跨多个 CPU 内核分配多个线程?

4

2 回答 2

2

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

尝试做其他线程安全的事情。

于 2011-05-03T18:42:41.907 回答
0

首先,每当您使用线程时,您都会增加内存开销,因为您创建的附加对象以及必须在 java 虚拟机中为它们分配的内存。

其次,即使在具有单个线程的应用程序中也可以使用和利用您拥有 2 个 CPU 的事实。这是真的,因为即使应用程序在单个处理器中执行,另一个处理器也会处理来自其他应用程序的其他任务,因此在更长的时间内让第一个任务空闲,并允许更连续地处理您的应用程序。

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

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

于 2011-05-03T18:50:21.217 回答