2

クラスTestClassStringは、文字列のjava.util.Listを返します。

オブジェクトTestViewPerformanceは、メソッドTestViewController.iterateListの呼び出しにかかった時間を記録します。

iterateList内では、並列処理を削除すると、この小さなプログラムの実行にかかる時間は一貫して少なくとも100ミリ秒速くなります。

mySeq.parからmySeq

ここで指定されているように、scalaのパフォーマンスを測定するために使用されるベンチマークツールがあることを認識しています:http: //docs.scala-lang.org/overviews/parallel-collections/performance.html

しかし、それでも、現在のミリ秒時間に基づく並列処理を使用して、このプログラムがより高速に実行されることを期待しますか?.parループ内のすべてのコードは複数のコアに分散していますか?

コード全体は次のとおりです。

package testpackage

import java.util.Calendar

object TestViewPerformance {

  def main(args:Array[String]) = {

      val before = Calendar.getInstance().getTimeInMillis()

      val testViewController = new TestViewController();
      val testClassString : TestClassString = new TestClassString()

      val folderList = testClassString.getStringList()
      var buffer = new scala.collection.mutable.ListBuffer[String]
      val seq = scala.collection.JavaConversions.asScalaBuffer(folderList);

      /*
       * this method (iterateList) is where the parallelism occurs
       */
      testViewController.iterateList(seq)

      val after = Calendar.getInstance().getTimeInMillis()

      println(before)
      println(after)
      println(after-before)

  }

  class TestViewController {

      def iterateList(mySeq : Seq[String]) = {

        for (seqVal<- mySeq) {
            if(seqVal.equalsIgnoreCase("test")){            

            }
        }   
}

}

}

package testpackage;

import java.util.ArrayList;
import java.util.List;

public class TestClassString {

    public List<String> getStringList(){

        List<String> l = new ArrayList<String>();

        for(int i = 0; i < 1000000; ++i){
            String test = ""+Math.random();
            l.add(test);
        } 

        return l;
    }

}
4

2 に答える 2

8

ベンチマークはスレッドスイッチングと量子ゆらぎのオーバーヘッドを測定しているためです。少なくともThread.sleep(1)ループに追加して、何が起こるかを確認してください。

scala> val strings = (1 to 10000).map(_ + Math.random().toString)
strings: scala.collection.immutable.IndexedSeq[String] = Vector(10.8907863042670979, 20.2871957696184603, 30.20011325237932742, 40.7490949002788928, 50.5073228980632211...
scala> val time = System.currentTimeMillis; 
       | for (str <- strings.par) {Thread.sleep(1)}; 
       | System.currentTimeMillis - time
res0: Long = 1398

scala> val time = System.currentTimeMillis; 
       | for (str <- strings) {Thread.sleep(1)}; 
       | System.currentTimeMillis - time
res3: Long = 11129
于 2013-02-23T11:16:44.367 に答える
3

これはおそらく、各反復のほとんどの時間がに印刷に費やされてSystem.outいるためです。これは同期された操作であるため、並列化できません。したがって、スレッドを開始し、それらをスケジュールし、それらを同期することによって引き起こされるコストは、並列反復を順次反復よりも遅くします。

于 2013-02-23T10:44:04.480 に答える