Kotlin Coroutines: Difference between revisions

From bibbleWiki
Jump to navigation Jump to search
Created page with "=Moores Law= I am doing this because of this graph 700px"
 
Line 2: Line 2:
I am doing this because of this graph
I am doing this because of this graph
[[File:Moores law.png|700px]]
[[File:Moores law.png|700px]]
Previously there is fork/join for asynchronous but this code is far more complicated than it probably needs to be
<syntaxhighlight lang="kotlin">
    override fun compute(): Long {
        return if (high - low <= SEQUENTIAL_THRESHOLD) {
            (low until high)
                    .map { array[it].toLong() }
                    .sum()
        } else {
            val mid = low + (high - low) / 2
            val left = Sum(array, low, mid)
            val right = Sum(array, mid, high)
            left.fork()
            val rightAns = right.compute()
            val leftAns = left.join()
            leftAns + rightAns
        }
    }
</syntaxhighlight>
Using the suspend approach is far more easier to read
<syntaxhighlight lang="kotlin">
suspend fun compute(array: IntArray, low: Int, high: Int): Long {
//    println("low: $low, high: $high  on ${Thread.currentThread().name}")
    return if (high - low <= SEQUENTIAL_THRESHOLD) {
        (low until high)
                .map { array[it].toLong() }
                .sum()
    } else {
        val mid = low + (high - low) / 2
        val left = async { compute(array, low, mid) }
        val right = compute(array, mid, high)
        return left.await() + right
    }
}
</syntaxhighlight>

Revision as of 11:56, 27 December 2020

Moores Law

I am doing this because of this graph Previously there is fork/join for asynchronous but this code is far more complicated than it probably needs to be

    override fun compute(): Long {
        return if (high - low <= SEQUENTIAL_THRESHOLD) {
            (low until high)
                    .map { array[it].toLong() }
                    .sum()
        } else {
            val mid = low + (high - low) / 2
            val left = Sum(array, low, mid)
            val right = Sum(array, mid, high)
            left.fork()
            val rightAns = right.compute()
            val leftAns = left.join()
            leftAns + rightAns
        }
    }

Using the suspend approach is far more easier to read

suspend fun compute(array: IntArray, low: Int, high: Int): Long {

//    println("low: $low, high: $high  on ${Thread.currentThread().name}")

    return if (high - low <= SEQUENTIAL_THRESHOLD) {
        (low until high)
                .map { array[it].toLong() }
                .sum()
    } else {
        val mid = low + (high - low) / 2
        val left = async { compute(array, low, mid) }
        val right = compute(array, mid, high)
        return left.await() + right
    }
}