1

LG LG P990 optimus の速度をいじっていたところ、複数のスレッドを使用しても速度がまったく向上しないことに気付きました。

次のコードを使用して、一部の計算に必要な時間を測定しました。

public class 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 は複数の 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 に、2 つの CPU を使用できるという事実は、単一のスレッドを使用するアプリケーションでも利用できます。これは、アプリケーションが単一のプロセッサで実行されている場合でも、他のアプリケーションが他のアプリケーションからの他のタスクを処理しているため、最初のプロセッサがより多くの時間フリーのままになり、アプリケーションのより継続的な処理が可能になるためです。

いずれにせよ、特定の時間にどのアプリケーションを処理し、どのプロセッサで処理するかを決定するのはオペレーティング システムです。

しかし、これらの理由により、スレッドセーフな他のメソッドを使用している場合でも、特にデバイスで処理する必要がある場合に、オーバーヘッドが得られない場合があります。ただし、(Math.random() とは異なり) スレッドセーフなメソッドを使用すると、最悪の場合でも、たとえ小さくても利益が得られるはずです。

于 2011-05-03T18:50:21.217 に答える