import scala.
{ specialized
=> spec
}
def main
(args
: Array
[String
]): Unit
= { println(SortBench.test_classes(
classOf[SimpleSort[Int]]))
}
}
def warmup
(s
: SortImpl
[Int
], count
: Int
) { s.sortInPlace(Array.fill(max_length)(Random.nextInt))(Ord.ordInt)
warmup(s, count - 1)
}
}
def test
(s
: SortImpl
[Int
])(length
: Int
) = { val src
= Array.
fill(length
)(Random.
nextInt) val src2
= Arrays.
copyOf(src, src.
length) val timeStart
= System.
nanoTime() s.sortInPlace(src)(Ord.ordInt)
val timeEnd
= System.
nanoTime() val res2
= src2.
sortBy(identity
) assert(Arrays.equals(res2, src))
timeEnd - timeStart
}
res += testRun()
count -= 1
}
s"Class ${class_name(s.getClass()).padTo(20, ' ')} | length ${length.toString.padTo(8, ' ')} | time ${res / 1000000.0 / runs}ms"
}
def test
_different
_lengths
(st
: Class
[_ <: SortImpl
[Int
]]) = { warmup(s, warm_runs)
Iterator.iterate(64)(_ * 2).takeWhile(_ <= max_length).map(test(s)).mkString("\n")
}
def test
_classes
(xs
: Class
[_ <: SortImpl
[Int
]]*) = { xs.map(test_different_lengths).mkString("\n==============\n")
}
def class
_name
(x
: Class
[_]) = { x.getName().reverse.takeWhile(_ != '.').reverse
}
}
def lt
(a
: T, b
: T
): Boolean
}
def lt
(a
: Int, b
: Int
) = a
< b
}
}
def lt
(a
: Int, b
: Int
) = a
> b
}
}
trait SortImpl
[@spec T
] { def sortInPlace
(x
: Array
[T
])(implicit ord
: Ord
[T
]): Unit
@inline
def swap
(x
: Array
[T
], i1
: Int, i2
: Int
) = { x(i1) = x(i2)
x(i2) = tmp
}
}
if (ord.
lt(x
(i2
), x
(i1
))) { swap(x, i1, i2)
}
i2 += 1
}
i1 += 1
}
}
}
aW1wb3J0IHNjYWxhLnsgc3BlY2lhbGl6ZWQgPT4gc3BlYyB9CmltcG9ydCBPcmQuXwppbXBvcnQgc2NhbGEudXRpbC5SYW5kb20KaW1wb3J0IGphdmEudXRpbC5BcnJheXMKb2JqZWN0IE1haW4gewoKICBkZWYgbWFpbihhcmdzOiBBcnJheVtTdHJpbmddKTogVW5pdCA9IHsKICAgIHByaW50bG4oU29ydEJlbmNoLnRlc3RfY2xhc3NlcygKICAgICAgY2xhc3NPZltTaW1wbGVTb3J0W0ludF1dKSkKICB9Cgp9CgpvYmplY3QgU29ydEJlbmNoIHsKICB2YWwgd2FybV9ydW5zID0gMjAwMAogIHZhbCB3YXJtX2xlbmd0aCA9IDE2CiAgdmFsIHJ1bnMgPSAyMAogIHZhbCBtYXhfbGVuZ3RoID0gMjAwCgogIGRlZiB3YXJtdXAoczogU29ydEltcGxbSW50XSwgY291bnQ6IEludCkgewogICAgaWYgKGNvdW50ID4gMCkgewogICAgICBzLnNvcnRJblBsYWNlKEFycmF5LmZpbGwobWF4X2xlbmd0aCkoUmFuZG9tLm5leHRJbnQpKShPcmQub3JkSW50KQogICAgICB3YXJtdXAocywgY291bnQgLSAxKQogICAgfQogIH0KCiAgZGVmIHRlc3QoczogU29ydEltcGxbSW50XSkobGVuZ3RoOiBJbnQpID0gewogICAgZGVmIHRlc3RSdW4oKSA9IHsKICAgICAgdmFsIHNyYyA9IEFycmF5LmZpbGwobGVuZ3RoKShSYW5kb20ubmV4dEludCkKICAgICAgdmFsIHNyYzIgPSBBcnJheXMuY29weU9mKHNyYywgc3JjLmxlbmd0aCkKICAgICAgdmFsIHRpbWVTdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpCiAgICAgIHMuc29ydEluUGxhY2Uoc3JjKShPcmQub3JkSW50KQogICAgICB2YWwgdGltZUVuZCA9IFN5c3RlbS5uYW5vVGltZSgpCiAgICAgIHZhbCByZXMyID0gc3JjMi5zb3J0QnkoaWRlbnRpdHkpCiAgICAgIGFzc2VydChBcnJheXMuZXF1YWxzKHJlczIsIHNyYykpCiAgICAgIHRpbWVFbmQgLSB0aW1lU3RhcnQKICAgIH0KICAgIHZhciByZXMgPSAwTAogICAgdmFyIGNvdW50ID0gcnVucwogICAgd2hpbGUgKGNvdW50ID4gMCkgewogICAgICByZXMgKz0gdGVzdFJ1bigpCiAgICAgIGNvdW50IC09IDEKICAgIH0KICAgIHMiQ2xhc3MgJHtjbGFzc19uYW1lKHMuZ2V0Q2xhc3MoKSkucGFkVG8oMjAsICcgJyl9IHwgbGVuZ3RoICR7bGVuZ3RoLnRvU3RyaW5nLnBhZFRvKDgsICcgJyl9IHwgdGltZSAke3JlcyAvIDEwMDAwMDAuMCAvIHJ1bnN9bXMiCiAgfQogIGRlZiB0ZXN0X2RpZmZlcmVudF9sZW5ndGhzKHN0OiBDbGFzc1tfIDw6IFNvcnRJbXBsW0ludF1dKSA9IHsKICAgIHZhbCBzID0gc3QubmV3SW5zdGFuY2UoKQogICAgd2FybXVwKHMsIHdhcm1fcnVucykKICAgIEl0ZXJhdG9yLml0ZXJhdGUoNjQpKF8gKiAyKS50YWtlV2hpbGUoXyA8PSBtYXhfbGVuZ3RoKS5tYXAodGVzdChzKSkubWtTdHJpbmcoIlxuIikKICB9CiAgZGVmIHRlc3RfY2xhc3Nlcyh4czogQ2xhc3NbXyA8OiBTb3J0SW1wbFtJbnRdXSopID0gewogICAgeHMubWFwKHRlc3RfZGlmZmVyZW50X2xlbmd0aHMpLm1rU3RyaW5nKCJcbj09PT09PT09PT09PT09XG4iKQogIH0KCiAgZGVmIGNsYXNzX25hbWUoeDogQ2xhc3NbX10pID0gewogICAgeC5nZXROYW1lKCkucmV2ZXJzZS50YWtlV2hpbGUoXyAhPSAnLicpLnJldmVyc2UKICB9Cn0KCnRyYWl0IE9yZFtAc3BlYyBUXSB7CiAgZGVmIGx0KGE6IFQsIGI6IFQpOiBCb29sZWFuCn0Kb2JqZWN0IE9yZCB7CiAgaW1wbGljaXQgb2JqZWN0IG9yZEludCBleHRlbmRzIE9yZFtJbnRdIHsKICAgIGRlZiBsdChhOiBJbnQsIGI6IEludCkgPSBhIDwgYgogIH0KfQpvYmplY3QgT3JkUmV2IHsKICBpbXBsaWNpdCBvYmplY3Qgb3JkSW50IGV4dGVuZHMgT3JkW0ludF0gewogICAgZGVmIGx0KGE6IEludCwgYjogSW50KSA9IGEgPiBiCiAgfQp9Cgp0cmFpdCBTb3J0SW1wbFtAc3BlYyBUXSB7CiAgZGVmIHNvcnRJblBsYWNlKHg6IEFycmF5W1RdKShpbXBsaWNpdCBvcmQ6IE9yZFtUXSk6IFVuaXQKICBAaW5saW5lIGRlZiBzd2FwKHg6IEFycmF5W1RdLCBpMTogSW50LCBpMjogSW50KSA9IHsKICAgIHZhbCB0bXAgPSB4KGkxKQogICAgeChpMSkgPSB4KGkyKQogICAgeChpMikgPSB0bXAKICB9Cn0KCmNsYXNzIFNpbXBsZVNvcnRbQHNwZWMgVF0gZXh0ZW5kcyBTb3J0SW1wbFtUXSB7CiAgZGVmIHNvcnRJblBsYWNlKHg6IEFycmF5W1RdKShpbXBsaWNpdCBvcmQ6IE9yZFtUXSkgPSB7CiAgICB2YXIgaTEgPSAwCiAgICB3aGlsZSAoaTEgPCB4Lmxlbmd0aCkgewogICAgICB2YXIgaTIgPSBpMSArIDEKICAgICAgd2hpbGUgKGkyIDwgeC5sZW5ndGgpIHsKICAgICAgICBpZiAob3JkLmx0KHgoaTIpLCB4KGkxKSkpIHsKICAgICAgICAgIHN3YXAoeCwgaTEsIGkyKQogICAgICAgIH0KICAgICAgICBpMiArPSAxCiAgICAgIH0KICAgICAgaTEgKz0gMQogICAgfQogIH0KfQ==