Нет ускорения на Android DualCore Handy LG Optimus Speed ​​с потоками Java? - PullRequest
1 голос
/ 03 мая 2011

Я поигрался с оптимальной скоростью LG LG P990 и заметил, что не могу вообще добиться ускорения при использовании нескольких потоков.

Я использовал следующий код для измерения времени, необходимого для некоторых вычислений.

открытый класс TestThreads extends 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-поточная версия рассчитывает такое же количество циклов, но распределяется по 2 потокам, которые могут работать параллельно, я ожидал, что эта версия будет значительно быстрее.Однако никакого ускорения не было, а в некоторых случаях многопоточная версия была еще медленнее.есть ли проблема с моей идеей / кодом или Android не распределяет несколько потоков по нескольким ядрам процессора?

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Math.random () не является потокобезопасным, у него есть мьютекс, который контролирует доступ, который добавляет издержки и замедляет потоки. Вы можете прочитать об этом здесь http://code -o-matic.blogspot.com / 2009/01 / beware-of-hidden-contention-of.html

Попробуйте сделать что-то еще, что потокобезопасно.

0 голосов
/ 03 мая 2011

Прежде всего, когда вы используете потоки, вы увеличиваете объем памяти, из-за дополнительных объектов, которые вы создаете, и памяти, которая должна быть выделена для них в виртуальной машине Java.

Во-вторых,тот факт, что у вас есть 2 процессора, может использоваться и использоваться даже в приложении с одним потоком.Это верно, потому что даже если приложение выполняется в одном процессоре, другое будет обрабатывать другие задачи из других приложений, в результате чего первое из них будет свободным в течение более длительного времени и будет разрешать более непрерывную обработку вашего приложения.

В любом случае, именно операционная система решает, какое приложение будет обработано в данный момент времени, и в каком процессоре оно будет обработано.

Но по этим причинам в некоторых случаях возможны накладные расходы.может не стоить выигрыша, даже при использовании других методов, которые являются поточно-ориентированными, особенно когда в устройстве требуется много обработки.Тем не менее, с помощью многопоточного метода (в отличие от Math.random ()) в худшем случае должны быть выигрыши, даже если они небольшие.

...