Details
-
Improvement
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
None
-
None
Description
GString will runĀ toString() whenever its literal string is needed, e.g. methods like equals, hashCode are called, but unfortunately its literal string will be re-constructed for each time and the process costs quite a little of time.
So I propose to check whether GString values are all of immutable type, e.g. primitive types and their boxed type, String, etc. If yes, use the cached string literal, otherwise re-construct the literal string.
Here is the test script, Groovy 3.0.5 costs about 8700ms, and PR1329 costs about 290ms on my machine. About 96.7% time is reduced.
def gstr = makeGString() long b = System.currentTimeMillis() for (int i = 0; i < 10000000; i++) { gstr.toString() } long e = System.currentTimeMillis() println "${e - b}ms" //@groovy.transform.CompileStatic def makeGString() { def now = java.time.LocalDateTime.now() "integer: ${1}, double: ${1.2d}, string: ${'x'}, class: ${Map.class}, boolean: ${true}, now: ${now}" }