All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.twitter.algebird.benchmark.QTreeMicroBenchmark.scala Maven / Gradle / Ivy

There is a newer version: 0.12.2
Show newest version
package com.twitter.algebird.benchmark

import com.twitter.algebird._
import java.util.concurrent.TimeUnit
import org.openjdk.jmh.annotations._
import scala.util.Random

object QTreeMicroBenchmark {

  @State(Scope.Benchmark)
  class QTreeMicroState {
    @Param(Array("0", "1", "3", "5"))
    var extendToLevel: Int = 0

    @Param(Array("100", "10000"))
    var numElements: Int = 0

    var inputDataLong: Seq[QTree[Long]] = _

    @Setup(Level.Trial)
    def setup(): Unit = {
      val rng = new Random("qtree".hashCode)

      inputDataLong = (0L until numElements).map { _ =>
        QTree(rng.nextInt(1000).toLong)
      }

    }
  }

  @annotation.tailrec
  private final def extendToLevelDoubleBranch[A](q: QTree[A], n: Int)(implicit monoid: Monoid[A]): QTree[A] = {
    if (n <= q.level)
      q
    else {
      val nextLevel = q.level + 1
      val nextOffset = q.offset / 2

      val l = if (q.offset % 2 == 0) q else null
      val r = if (q.offset % 2 == 0) null else q

      val parent =
        new QTree[A](monoid.zero, nextOffset, nextLevel, q.count, l, r)

      extendToLevelDoubleBranch(parent, n)
    }
  }

  @annotation.tailrec
  private final def extendToLevelSingleBranch[A](q: QTree[A], n: Int)(implicit monoid: Monoid[A]): QTree[A] = {
    if (n <= q.level)
      q
    else {
      val nextLevel = q.level + 1
      val nextOffset = q.offset / 2

      val parent =
        if (q.offset % 2 == 0)
          new QTree[A](monoid.zero, nextOffset, nextLevel, q.count, q, null)
        else
          new QTree[A](monoid.zero, nextOffset, nextLevel, q.count, null, q)

      extendToLevelSingleBranch(parent, n)
    }
  }
}

@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Array(Mode.AverageTime))
class QTreeMicroBenchmark {
  import QTreeMicroBenchmark._

  @Benchmark
  def doubleBranch(state: QTreeMicroState) = {
    val iter = state.inputDataLong.toIterator
    while (iter.hasNext) {
      extendToLevelDoubleBranch(iter.next, state.extendToLevel)
    }
  }

  @Benchmark
  def singleBranch(state: QTreeMicroState) = {
    val iter = state.inputDataLong.toIterator
    while (iter.hasNext) {
      extendToLevelSingleBranch(iter.next, state.extendToLevel)
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy