比方说,我有以下函数,它们允许我创建矩阵:
inline fun <reified T> Matrix2D(w: Int, h: Int, init: (Int, Int) -> T) =
Array(w){ x -> Array(h){ y -> init(x, y) } }
inline fun <reified T> Matrix2D(w: Int, h: Int, value: T) =
Array(w){ Array(h){ value } }
// For example:
val m = Matrix2D(400, 400) { x, y ->
Color(x.toDouble() / 400.0, y.toDouble() / 400.0, 0.0)
}我也不希望允许空性,因为稍后处理元素访问将是一件痛苦的事情。
我如何使用多个线程/协程来初始化这样一个矩阵,每个线程/协程初始化自己的矩阵块,而不允许矩阵单元的可空性?
发布于 2017-08-01 22:47:51
可以,您可以并行创建Matrix2D,例如:
val threads = Matrix2D(10, 3){x, y-> Thread.currentThread() }.flatten().distinct()
// v--- size > 1
println(threads.size)inline fun <reified T> Matrix2D(w: Int, h: Int, crossinline init: (Int, Int) -> T)=
// v--- create array in parallel
generatorOf(w){x -> Array(h) {y -> init(x, y) } }.map{ it() }.toTypedArray()
// get the final result `Matrix2D` ---^
// v--- create array generator
inline fun <reified T> generatorOf(size: Int, crossinline init:(Int) -> T) =
//v--- you can use `ForkJoinPool#commonPool`, but it will run task in work thread
ForkJoinPool(20).let {
Array(size) { i -> it.submit(Callable { init(i) }).let { { it.get() } } }
// return the lambda generator ()->T ---^
}您还可以编写一个扩展函数toArray来删除中间的map操作并提升性能,例如:
inline fun <reified T> Matrix2D(w: Int, h: Int, crossinline init: (Int, Int) -> T)=
// v--- init array elements in parallel
generatorOf(w) { x -> Array(h) { y -> init(x, y) } }.toArray{it()}
// transform to the `Matrix2D` directly ---^
// v--- convert Array<T> to Array<R>
inline fun <T,reified R> Array<T>.toArray(transform:(T)->R):Array<R>{
return Array(size){i->transform(get(i))}
}为什么会在外部数组初始化中启动Matrix2D线程,您可以进一步查看sum two double[][] with parallel stream。
https://stackoverflow.com/questions/45439765
复制相似问题