我正在玩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内核上分配多个线程?
答案 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()不同),在最坏的情况下应该有增益,即使很小。