From 04ec90164e0697ab4314ca26e47a419334f74b16 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Mon, 3 Jun 2019 18:29:51 +0300 Subject: [PATCH] Use ThreadLocals to cache DecimalFormat instances --- libraries/stdlib/jvm/src/kotlin/time/formatToDecimals.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libraries/stdlib/jvm/src/kotlin/time/formatToDecimals.kt b/libraries/stdlib/jvm/src/kotlin/time/formatToDecimals.kt index 524cbef9bb8..6e641234387 100644 --- a/libraries/stdlib/jvm/src/kotlin/time/formatToDecimals.kt +++ b/libraries/stdlib/jvm/src/kotlin/time/formatToDecimals.kt @@ -9,9 +9,10 @@ import java.math.RoundingMode import java.text.DecimalFormat import java.text.DecimalFormatSymbols import java.util.* +import kotlin.concurrent.getOrSet private val rootFormatSymbols = DecimalFormatSymbols(Locale.ROOT).apply { exponentSeparator = "e" } -private val precisionFormats = Array(4) { null } +private val precisionFormats = Array(4) { ThreadLocal() } private fun createFormatForDecimals(decimals: Int) = DecimalFormat("0", rootFormatSymbols).apply { if (decimals > 0) minimumFractionDigits = decimals @@ -20,7 +21,7 @@ private fun createFormatForDecimals(decimals: Int) = DecimalFormat("0", rootForm internal actual fun formatToExactDecimals(value: Double, decimals: Int): String { val format = if (decimals < precisionFormats.size) { - precisionFormats[decimals] ?: createFormatForDecimals(decimals).also { precisionFormats[decimals] = it } + precisionFormats[decimals].getOrSet { createFormatForDecimals(decimals) } } else createFormatForDecimals(decimals) return format.format(value) @@ -31,6 +32,6 @@ internal actual fun formatUpToDecimals(value: Double, decimals: Int): String = .apply { maximumFractionDigits = decimals } .format(value) -private val scientificFormat = DecimalFormat("0E0", rootFormatSymbols).apply { maximumFractionDigits = 2 } +private val scientificFormat = ThreadLocal() internal actual fun formatScientific(value: Double): String = - scientificFormat.format(value) \ No newline at end of file + scientificFormat.getOrSet { DecimalFormat("0E0", rootFormatSymbols).apply { maximumFractionDigits = 2 } }.format(value) \ No newline at end of file