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
}
}
}
aW1wb3J0IHNjYWxhLnsgc3BlY2lhbGl6ZWQgPT4gc3BlYyB9CmltcG9ydCBPcmQuXwppbXBvcnQgc2NhbGEudXRpbC5SYW5kb20KaW1wb3J0IGphdmEudXRpbC5BcnJheXMKb2JqZWN0IE1haW4gewoKICBkZWYgbWFpbihhcmdzOiBBcnJheVtTdHJpbmddKTogVW5pdCA9IHsKICAgIHByaW50bG4oU29ydEJlbmNoLnRlc3RfY2xhc3NlcygKICAgICAgY2xhc3NPZltTaW1wbGVTb3J0W0ludF1dKSkKICB9Cgp9CgpvYmplY3QgU29ydEJlbmNoIHsKICB2YWwgd2FybV9ydW5zID0gMjAwMAogIHZhbCB3YXJtX2xlbmd0aCA9IDE2CiAgdmFsIHJ1bnMgPSA0CiAgdmFsIG1heF9sZW5ndGggPSAzMDAKCiAgZGVmIHdhcm11cChzOiBTb3J0SW1wbFtJbnRdLCBjb3VudDogSW50KSB7CiAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgIHMuc29ydEluUGxhY2UoQXJyYXkuZmlsbChtYXhfbGVuZ3RoKShSYW5kb20ubmV4dEludCkpKE9yZC5vcmRJbnQpCiAgICAgIHdhcm11cChzLCBjb3VudCAtIDEpCiAgICB9CiAgfQoKICBkZWYgdGVzdChzOiBTb3J0SW1wbFtJbnRdKShsZW5ndGg6IEludCkgPSB7CiAgICBkZWYgdGVzdFJ1bigpID0gewogICAgICB2YWwgc3JjID0gQXJyYXkuZmlsbChsZW5ndGgpKFJhbmRvbS5uZXh0SW50KQogICAgICB2YWwgc3JjMiA9IEFycmF5cy5jb3B5T2Yoc3JjLCBzcmMubGVuZ3RoKQogICAgICB2YWwgdGltZVN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCkKICAgICAgcy5zb3J0SW5QbGFjZShzcmMpKE9yZC5vcmRJbnQpCiAgICAgIHZhbCB0aW1lRW5kID0gU3lzdGVtLm5hbm9UaW1lKCkKICAgICAgdmFsIHJlczIgPSBzcmMyLnNvcnRCeShpZGVudGl0eSkKICAgICAgYXNzZXJ0KEFycmF5cy5lcXVhbHMocmVzMiwgc3JjKSkKICAgICAgdGltZUVuZCAtIHRpbWVTdGFydAogICAgfQogICAgdmFyIHJlcyA9IDBMCiAgICB2YXIgY291bnQgPSBydW5zCiAgICB3aGlsZSAoY291bnQgPiAwKSB7CiAgICAgIHJlcyArPSB0ZXN0UnVuKCkKICAgICAgY291bnQgLT0gMQogICAgfQogICAgcyJDbGFzcyAke2NsYXNzX25hbWUocy5nZXRDbGFzcygpKS5wYWRUbygyMCwgJyAnKX0gfCBsZW5ndGggJHtsZW5ndGgudG9TdHJpbmcucGFkVG8oOCwgJyAnKX0gfCB0aW1lICR7cmVzIC8gMTAwMDAwMC4wIC8gcnVuc31tcyIKICB9CiAgZGVmIHRlc3RfZGlmZmVyZW50X2xlbmd0aHMoc3Q6IENsYXNzW18gPDogU29ydEltcGxbSW50XV0pID0gewogICAgdmFsIHMgPSBzdC5uZXdJbnN0YW5jZSgpCiAgICB3YXJtdXAocywgd2FybV9ydW5zKQogICAgSXRlcmF0b3IuaXRlcmF0ZSg2NCkoXyAqIDIpLnRha2VXaGlsZShfIDw9IG1heF9sZW5ndGgpLm1hcCh0ZXN0KHMpKS5ta1N0cmluZygiXG4iKQogIH0KICBkZWYgdGVzdF9jbGFzc2VzKHhzOiBDbGFzc1tfIDw6IFNvcnRJbXBsW0ludF1dKikgPSB7CiAgICB4cy5tYXAodGVzdF9kaWZmZXJlbnRfbGVuZ3RocykubWtTdHJpbmcoIlxuPT09PT09PT09PT09PT1cbiIpCiAgfQoKICBkZWYgY2xhc3NfbmFtZSh4OiBDbGFzc1tfXSkgPSB7CiAgICB4LmdldE5hbWUoKS5yZXZlcnNlLnRha2VXaGlsZShfICE9ICcuJykucmV2ZXJzZQogIH0KfQoKdHJhaXQgT3JkW0BzcGVjIFRdIHsKICBkZWYgbHQoYTogVCwgYjogVCk6IEJvb2xlYW4KfQpvYmplY3QgT3JkIHsKICBpbXBsaWNpdCBvYmplY3Qgb3JkSW50IGV4dGVuZHMgT3JkW0ludF0gewogICAgZGVmIGx0KGE6IEludCwgYjogSW50KSA9IGEgPCBiCiAgfQp9Cm9iamVjdCBPcmRSZXYgewogIGltcGxpY2l0IG9iamVjdCBvcmRJbnQgZXh0ZW5kcyBPcmRbSW50XSB7CiAgICBkZWYgbHQoYTogSW50LCBiOiBJbnQpID0gYSA+IGIKICB9Cn0KCnRyYWl0IFNvcnRJbXBsW0BzcGVjIFRdIHsKICBkZWYgc29ydEluUGxhY2UoeDogQXJyYXlbVF0pKGltcGxpY2l0IG9yZDogT3JkW1RdKTogVW5pdAogIEBpbmxpbmUgZGVmIHN3YXAoeDogQXJyYXlbVF0sIGkxOiBJbnQsIGkyOiBJbnQpID0gewogICAgdmFsIHRtcCA9IHgoaTEpCiAgICB4KGkxKSA9IHgoaTIpCiAgICB4KGkyKSA9IHRtcAogIH0KfQoKY2xhc3MgU2ltcGxlU29ydFtAc3BlYyBUXSBleHRlbmRzIFNvcnRJbXBsW1RdIHsKICBkZWYgc29ydEluUGxhY2UoeDogQXJyYXlbVF0pKGltcGxpY2l0IG9yZDogT3JkW1RdKSA9IHsKICAgIHZhciBpMSA9IDAKICAgIHdoaWxlIChpMSA8IHgubGVuZ3RoKSB7CiAgICAgIHZhciBpMiA9IGkxICsgMQogICAgICB3aGlsZSAoaTIgPCB4Lmxlbmd0aCkgewogICAgICAgIGlmIChvcmQubHQoeChpMiksIHgoaTEpKSkgewogICAgICAgICAgc3dhcCh4LCBpMSwgaTIpCiAgICAgICAgfQogICAgICAgIGkyICs9IDEKICAgICAgfQogICAgICBpMSArPSAxCiAgICB9CiAgfQp9