You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2011/10/02 21:49:01 UTC

svn commit: r1178240 - in /incubator/jena/Experimental/JenaPerf/trunk: ./ src/main/scala/org/apache/jena/perf/

Author: andy
Date: Sun Oct  2 19:49:01 2011
New Revision: 1178240

URL: http://svn.apache.org/viewvc?rev=1178240&view=rev
Log:
Structure

Added:
    incubator/jena/Experimental/JenaPerf/trunk/ACTIONS
    incubator/jena/Experimental/JenaPerf/trunk/Q1.rq
    incubator/jena/Experimental/JenaPerf/trunk/Q2.rq
Modified:
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Actions.scala
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfMain.scala
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnit.scala
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnitLib.scala

Added: incubator/jena/Experimental/JenaPerf/trunk/ACTIONS
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/ACTIONS?rev=1178240&view=auto
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/ACTIONS (added)
+++ incubator/jena/Experimental/JenaPerf/trunk/ACTIONS Sun Oct  2 19:49:01 2011
@@ -0,0 +1,4 @@
+file:D.ttl
+Q1.rq
+Q2.rq
+

Added: incubator/jena/Experimental/JenaPerf/trunk/Q1.rq
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/Q1.rq?rev=1178240&view=auto
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/Q1.rq (added)
+++ incubator/jena/Experimental/JenaPerf/trunk/Q1.rq Sun Oct  2 19:49:01 2011
@@ -0,0 +1 @@
+SELECT * { ?s ?p ?o }

Added: incubator/jena/Experimental/JenaPerf/trunk/Q2.rq
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/Q2.rq?rev=1178240&view=auto
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/Q2.rq (added)
+++ incubator/jena/Experimental/JenaPerf/trunk/Q2.rq Sun Oct  2 19:49:01 2011
@@ -0,0 +1 @@
+SELECT (count(*) AS ?c) { ?s ?p ?o }
\ No newline at end of file

Modified: incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Actions.scala
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Actions.scala?rev=1178240&r1=1178239&r2=1178240&view=diff
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Actions.scala (original)
+++ incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Actions.scala Sun Oct  2 19:49:01 2011
@@ -6,18 +6,20 @@ import com.hp.hpl.jena.util.FileManager
 import com.hp.hpl.jena.query.QueryExecutionFactory
 import com.hp.hpl.jena.tdb.TDBFactory
 import com.hp.hpl.jena.query.Query
-import java.util.Date
 import com.hp.hpl.jena.query.QueryFactory
 import com.hp.hpl.jena.query.Syntax
 
 class Actions {}
 
-trait ActionsBuilder {
-  def actions:List[Action]
+trait ActionBuilder {
+  def build:Action
 }
 
-class ActionBuilderFile(filename: String) extends ActionsBuilder {
-  def actions: List[Action] = {
+class ActionBuilderFile(filename: String) extends ActionBuilder {
+  
+  def build:Action = new ActionSequence(actions)
+  
+  def actions: Seq[Action] = {
     import scala.io.Source;
     val lines = Source.fromFile(filename).getLines
     if ( ! lines.hasNext )
@@ -31,7 +33,7 @@ class ActionBuilderFile(filename: String
       val query = QueryFactory.read(str, Syntax.syntaxARQ)
       new ActionByScheme(str, target, query) 
     }
-    val a = lines.filter(x => !x.isEmpty && ! x.matches("^\\s*#") ).map(proc).toList
+    val a = lines.filter(x => !x.isEmpty && ! x.matches("^\\s*#") ).map(proc).toSeq
     return a;
   }
 }
@@ -39,7 +41,7 @@ class ActionBuilderFile(filename: String
 /** Inspect the URI scheme and dispatch to a specific action implementation */ 
 class ActionByScheme(val name: String, uri:String, query:Query) extends ActionQuery {
   self =>
-  def perform():Result = {
+  def perform():Outcome = {
     def action(): Action =
     {
       val scheme = self.scheme(uri) 
@@ -56,37 +58,32 @@ class ActionByScheme(val name: String, u
 
 /** Support for query on dataset */ 
 abstract class ActionQuery extends Action {
-  def exec(ds:Dataset, query:Query) : Result = { 
+  override def toString = name
+  def exec(ds:Dataset, query:Query) : Outcome = { 
     import com.hp.hpl.jena.sparql.util.QueryExecUtils
-    
-    val start = System.currentTimeMillis() ;  
-    val startDate = new Date()
+   
     val qexec = QueryExecutionFactory.create(query, ds)
     // later
     //QueryExecUtils.executeQuery(query, qexec)
-    
     val count = ResultSetFormatter.consume(qexec.execSelect())
-    
-    val finish = System.currentTimeMillis() ;
-    val finishDate = new Date()
-    
-    Result(Success, finish-start, startDate, finishDate)
+    Success
   }
 }
 
-// No - need a timing wrapper.
-
 // Sequence of actions with an overall result.
-class ActionSequence(actions: Action*) extends Action {
+class ActionSequence(actions:Seq[Action]) extends Action {
   val name = "Seq["+actions.mkString(",")+"]"
-  def perform():Result = {
-    ; null }
+  def perform():Outcome = {
+    // Check 
+    actions.foreach(_.perform)
+    Success
+  }
 }
 
 /** Action for a querying a local TDB instance */
 class ActionQueryTDB(n:String, location:String, query:Query) extends ActionQuery {
   val name = n+"["+location+"]"
-  def perform():Result = {
+  def perform():Outcome = {
     val ds = TDBFactory.createDataset(location)
     return exec(ds, query)
   }
@@ -94,7 +91,7 @@ class ActionQueryTDB(n:String, location:
 
 /** Action for a querying a local file */
 class ActionQueryFile(val name:String, filename:String, query:Query) extends ActionQuery {
-  def perform():Result = {
+  def perform():Outcome = {
     val ds = DatasetFactory.create()
     FileManager.get().readModel(ds.getDefaultModel(), filename)
     return exec(ds, query)
@@ -103,5 +100,5 @@ class ActionQueryFile(val name:String, f
 
 /** Do nothing Action */
 class ActionNone(val name: String) extends Action {
-  def perform():Result = { return ResultNone ; }
+  def perform():Outcome = { return NoOutcome ; }
 }

Modified: incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfMain.scala
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfMain.scala?rev=1178240&r1=1178239&r2=1178240&view=diff
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfMain.scala (original)
+++ incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfMain.scala Sun Oct  2 19:49:01 2011
@@ -11,11 +11,14 @@ object PerfMain {
     println("Jena SPARQL Performance test bed")
     println("Start  @ "+now())
 
+    // Structured actions : times for all.
+    
     val actionBuilder = new ActionBuilderFile("ACTIONS")
-    val actions = actionBuilder.actions 
+    val action = actionBuilder.build 
+    //val actions = actionBuilder.actions
     val collector = new Collector()
 
-    val runner = new RunnerCollect(collector)
+    val runner = new RunnerCollect(runnerRun, collector)
     val reporter = new ReporterPrint()
     
     
@@ -36,7 +39,7 @@ object PerfMain {
 //      }
 //    }
     
-    enact(actions, runner)
+    enact(action, runner)
 
     report(reporter, collector)
     
@@ -50,14 +53,14 @@ object PerfMain {
   val action1 = new ActionByScheme("Q1", "file:D.ttl", query1)
   val action2 = new ActionByScheme("Q2", "tdb:DB", query2)
   
-  object ActionBuilderTest extends ActionsBuilder
+  object ActionBuilderTest extends ActionBuilder
   {
-    def actions = List(action1, action2)
+    def build():Action = { new ActionSequence(List(action1, action2)) }
   }
 
   // Performing : Runner
-  def enact(actions: List[Action], runner:Runner): Unit =
-    actions.foreach(runner.perform(_))
+  def enact(action: Action, runner:Runner): Unit =
+    runner.perform(runner, action)
 
   // Reporting : reporter
   def report(reporter: Reporter, collector: Collector): Unit = reporter.report(collector)

Modified: incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnit.scala
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnit.scala?rev=1178240&r1=1178239&r2=1178240&view=diff
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnit.scala (original)
+++ incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnit.scala Sun Oct  2 19:49:01 2011
@@ -2,17 +2,78 @@ package org.apache.jena.perf
 import java.util.Date
 import scala.collection.mutable.ListBuffer
 import scala.collection.mutable.ArrayBuffer
+import com.hp.hpl.jena.sparql.util.Timer
 
-/** A single step in the performance suite */ 
-case class PerfUnit(name:String, action:Action, result:Option[Result] = None) 
+///** A single step in the performance suite */ 
+//case class PerfUnit(name:String, action:Action, result:Option[Result] = None) 
 
 trait Action {
   def name:String
-  // This is blocking - pass in a handler to call after .
-  // Signature
-  def perform(): Result
+  def perform() : Outcome
 }
 
+trait Runner {
+  def perform(runner:Runner, action:Action): Outcome
+}
+
+//trait ActionResultHandler {
+//    def start(a:Action)
+//    def finish(a:Action)
+//    def record(a:Action, r:Result) 
+//  }
+//
+//
+//class ActionResult(handler:ActionResultHandler) extends Runner {
+//  val timer = new Timer()
+//  timer.startTimer() ;
+//  
+//  def perform(action:Action) = {
+//      val start = timer.readTimer()
+//      handler.start(action)
+//      val outcome = action.perform()
+//      handler.finish(action)
+//      val finish = timer.readTimer()
+//      val result = Result(outcome, finish-start)
+//      handler.record(action, result)
+//  }
+//}
+  
+//
+//class Collector extends ActionResultHandler {
+//  case class RunUnit(name:String, id:Int, action:Action, result:Result)
+//    
+//  private val lock:AnyRef = new AnyRef
+//  private val resultsAcc:ArrayBuffer[RunUnit] = ArrayBuffer.empty
+//  // Cache.
+//  private var view:Option[Array[RunUnit]] = None
+//  
+//  private var active:List[(Action,Int)] = Nil
+//  
+//  def start(action:Action) = {
+//    lock.synchronized {
+//      val id = resultsAcc.size+1
+//      active = (action,id) :: active
+//    }
+//  }
+//  
+//  def finish(action:Action) = {
+//  }
+//  
+//   def record(action:Action, result:Result) = {
+//     lock.synchronized {
+//     val (action, id) = active.head
+//     active = active.tail
+//     resultsAcc += RunUnit(action.name, id, action, result) ; view = None ; }
+//  }
+//  def results:Array[RunUnit] = {
+//    lock.synchronized {
+//        if ( view.isEmpty ) view = Some(resultsAcc.toArray)
+//        view.get
+//    }
+//  }
+//}
+
+
 // Simple - but no iteration.
 sealed abstract class Outcome(val name:String)
 case object Success extends Outcome("success")
@@ -21,9 +82,6 @@ case object NoOutcome extends Outcome("n
 
 /** Details, details */ 
 case class Result(outcome:Outcome, elapsed:Long, startDT:Option[Date] = None, finishDT:Option[Date] = None )
-{
-  def this(outcome:Outcome) = this(outcome, -1, None, None)
-}
 
 object Result {
   def apply(outcome:Outcome, elapsed:Long, startDT:Date, finishDT:Date) = 
@@ -36,35 +94,7 @@ object Result {
     new Result(outcome, -1, None, None)
 }
 
-object ResultNone extends Result(NoOutcome)
-
-class Collector {
-  //type OneStep = (Action, Result)
-  case class RunUnit(name:String, id:Int, action:Action, result:Result)
-    
-private val lock:AnyRef = new AnyRef
-  private val resultsAcc:ArrayBuffer[RunUnit] = ArrayBuffer.empty
-  // Cache.
-  private var view:Option[Array[RunUnit]] = None
-  
-  def results:Array[RunUnit] = {
-    lock.synchronized {
-        if ( view.isEmpty ) view = Some(resultsAcc.toArray)
-        view.get
-    }
-  }
-  
-  def acc(action: Action, result:Result):Unit = {
-    lock.synchronized {
-      val id = resultsAcc.size+1
-      resultsAcc += RunUnit(action.name, id, action, result) ; view = None ; }
-  }
-}
-
-trait Runner {
-  def perform(action:Action)
-}
 
 trait Reporter {
-  def report(collector: Collector)
+  def report(collector: Collector):Unit
 }

Modified: incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnitLib.scala
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnitLib.scala?rev=1178240&r1=1178239&r2=1178240&view=diff
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnitLib.scala (original)
+++ incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnitLib.scala Sun Oct  2 19:49:01 2011
@@ -1,33 +1,74 @@
 package org.apache.jena.perf
+import java.util.Date
+import scala.collection.mutable.ArrayBuffer
+  import java.util.concurrent.atomic.AtomicInteger 
 
 /** A collection of commonly used implementations of PerfUnit interfaces */  
 
 // ---- Runners
 
-object LIB {
-  // alt runner
-  type run = { def perform(action:Action):Unit } 
+object PerfUnitLib {
+  def time(runner:Runner, action:Action) : Result = {
+      val start = System.currentTimeMillis() ;  
+      val startDate = new Date()
+      
+      val outcome = runner.perform(runner, action)  
+      val finish = System.currentTimeMillis() ;
+      val finishDate = new Date()
+      Result(Success, finish-start, startDate, finishDate)
+  }
+}
+
+class Collector {
+  case class RunUnit(name: String, id: Int, action: Action, result: Result)
+  private val lock: AnyRef = new AnyRef
+  private val resultsAcc: ArrayBuffer[RunUnit] = ArrayBuffer.empty
+  // Cache.
+  private var view: Option[Array[RunUnit]] = None
+
+  def acc(action: Action, id: Int, result: Result) = {
+    lock.synchronized {
+      resultsAcc += RunUnit(action.name, id, action, result); view = None;
+    }
+  }
+
+  def results: Array[RunUnit] = {
+    lock.synchronized {
+      if (view.isEmpty) view = Some(resultsAcc.toArray)
+      view.get
+    }
+  }
 }
 
 object RunnerNull extends Runner {
-  def perform(action: Action):Unit = {}
+  def perform(runner:Runner, action: Action):Outcome = { NoOutcome }
+}
+
+object runnerRun extends Runner {
+  def perform(runner:Runner, action: Action):Outcome = { action.perform() }
 }
 
 /** Run an action by printing it's name.*/
 class RunnerPrint extends Runner {
-    def perform(action: Action):Unit = println(action.name)
+    def perform(runner:Runner, action: Action):Outcome = { println(action.name) ; Success }
 }
 
 /** Run an action and collect it's results */
-class RunnerCollect(val collector:Collector) extends Runner {
-    def perform(action: Action):Unit = collector.acc(action, action.perform) 
+class RunnerCollect(realRunner:Runner, val collector:Collector) extends Runner {
+  private var counter = new AtomicInteger(0) ;
+    def perform(runner:Runner, action: Action):Outcome = {
+      val id = counter.incrementAndGet()
+      val x = PerfUnitLib.time(realRunner, action) ;
+      collector.acc(action, id, x)
+      Success
+    }
 }
 
 /** Run an action with one runner then run with another. */
 class RunnerChain(runner1:Runner, runner2:Runner) extends Runner {
-    def perform(action: Action):Unit = { 
-      runner1.perform(action)
-      runner2.perform(action)
+    def perform(runner:Runner, action: Action):Outcome = { 
+      runner1.perform(this, action)
+      runner2.perform(this, action)
     }
 }