Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@milessabin
Last active July 26, 2017 20:42
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save milessabin/6c9c060cf5159563b722d49ce9ee103e to your computer and use it in GitHub Desktop.
Save milessabin/6c9c060cf5159563b722d49ce9ee103e to your computer and use it in GitHub Desktop.
Induction benchmark: vanilla scalac vs. scalac + proof of concept inductive solver
// Compiled with ./build/pack/bin/scalac -J-Xss4M -J-Xmx4G test/files/pos/inductive-implicits.scala
// HList scalac scalac +
// Size inductive heuristics
// 50 6 4
// 100 15 5
// 150 36 6
// 200 68 6
// 250 114 7
// 300 179 9
// 350 274 12
// 400 384 15
// 450 529 20
// 500 723 26
// Compile time in seconds
package shapeless {
sealed trait HList extends Product with Serializable
final case class ::[+H, +T <: HList](head : H, tail : T) extends HList {
def ::[HH](h : HH) : HH :: H :: T = shapeless.::(h, this)
override def toString = head match {
case _: ::[_, _] => "("+head.toString+") :: "+tail.toString
case _ => head.toString+" :: "+tail.toString
}
}
sealed trait HNil extends HList {
def ::[H](h : H) = shapeless.::(h, this)
override def toString = "HNil"
}
case object HNil extends HNil
trait Selector[L <: HList, U] {
def apply(l: L): U
}
object Selector {
def apply[L <: HList, U](implicit selector: Selector[L, U]): Selector[L, U] = selector
implicit def inHead[H, T <: HList]: Selector[H :: T, H] =
new Selector[H :: T, H] {
def apply(l : H :: T) = l.head
}
implicit def inTail[H, T <: HList, U]
(implicit st : Selector[T, U]): Selector[H :: T, U] =
new Selector[H :: T, U] {
def apply(l : H :: T) = st(l.tail)
}
}
}
import shapeless._
object Test extends App {
type L =
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
Int ::
//
Boolean ::
HNil
val sel = Selector[L, Boolean]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment