Skip to content

Commit 93c8609

Browse files
feat(config): Optimize collection creation and memory allocation (#11616)
feat(config): Optimize collection creation and memory allocation Co-authored-by: bruce.bujon <bruce.bujon@datadoghq.com>
1 parent fd3ed8b commit 93c8609

2 files changed

Lines changed: 48 additions & 43 deletions

File tree

buildSrc/src/main/kotlin/datadog/gradle/plugin/config/ParseV2SupportedConfigurationsTask.kt

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,14 @@ abstract class ParseV2SupportedConfigurationsTask @Inject constructor(
117117
PrintWriter(outFile).use { out ->
118118
out.println("package $packageName;")
119119
out.println()
120-
out.println("import java.util.*;")
120+
out.println("import java.util.HashMap;")
121+
out.println("import java.util.List;")
122+
out.println("import java.util.Map;")
123+
out.println("import static java.util.Arrays.asList;")
124+
out.println("import static java.util.Collections.emptyList;")
125+
out.println("import static java.util.Collections.singletonList;")
126+
out.println("import static java.util.Collections.unmodifiableList;")
127+
out.println("import static java.util.Collections.unmodifiableMap;")
121128
out.println()
122129
out.println("public final class $className {")
123130
out.println()
@@ -145,7 +152,7 @@ abstract class ParseV2SupportedConfigurationsTask @Inject constructor(
145152
out.println(" Map<String, List<SupportedConfiguration>> supportedMap = new HashMap<>();")
146153
out.println(" initSupported1(supportedMap);")
147154
out.println(" initSupported2(supportedMap);")
148-
out.println(" return Collections.unmodifiableMap(supportedMap);")
155+
out.println(" return unmodifiableMap(supportedMap);")
149156
out.println(" }")
150157
out.println()
151158

@@ -155,41 +162,15 @@ abstract class ParseV2SupportedConfigurationsTask @Inject constructor(
155162
// initSupported1() - first half
156163
out.println(" private static void initSupported1(Map<String, List<SupportedConfiguration>> supportedMap) {")
157164
for ((key, configList) in sortedSupported.take(midpoint)) {
158-
out.print(" supportedMap.put(\"${esc(key)}\", Collections.unmodifiableList(Arrays.asList(")
159-
val configIter = configList.iterator()
160-
while (configIter.hasNext()) {
161-
val config = configIter.next()
162-
out.print("new SupportedConfiguration(")
163-
out.print("${escNullableString(config.version)}, ")
164-
out.print("${escNullableString(config.type)}, ")
165-
out.print("${escNullableString(config.default)}, ")
166-
out.print("Arrays.asList(${quoteList(config.aliases)}), ")
167-
out.print("Arrays.asList(${quoteList(config.propertyKeys)})")
168-
out.print(")")
169-
if (configIter.hasNext()) out.print(", ")
170-
}
171-
out.println(")));")
165+
out.println(" supportedMap.put(\"${esc(key)}\", ${supportedConfigListLiteral(configList)});")
172166
}
173167
out.println(" }")
174168
out.println()
175169

176170
// initSupported2() - second half
177171
out.println(" private static void initSupported2(Map<String, List<SupportedConfiguration>> supportedMap) {")
178172
for ((key, configList) in sortedSupported.drop(midpoint)) {
179-
out.print(" supportedMap.put(\"${esc(key)}\", Collections.unmodifiableList(Arrays.asList(")
180-
val configIter = configList.iterator()
181-
while (configIter.hasNext()) {
182-
val config = configIter.next()
183-
out.print("new SupportedConfiguration(")
184-
out.print("${escNullableString(config.version)}, ")
185-
out.print("${escNullableString(config.type)}, ")
186-
out.print("${escNullableString(config.default)}, ")
187-
out.print("Arrays.asList(${quoteList(config.aliases)}), ")
188-
out.print("Arrays.asList(${quoteList(config.propertyKeys)})")
189-
out.print(")")
190-
if (configIter.hasNext()) out.print(", ")
191-
}
192-
out.println(")));")
173+
out.println(" supportedMap.put(\"${esc(key)}\", ${supportedConfigListLiteral(configList)});")
193174
}
194175
out.println(" }")
195176
out.println()
@@ -200,12 +181,12 @@ abstract class ParseV2SupportedConfigurationsTask @Inject constructor(
200181
out.println(" Map<String, List<String>> aliasesMap = new HashMap<>();")
201182
for ((canonical, list) in aliases.toSortedMap()) {
202183
out.printf(
203-
" aliasesMap.put(\"%s\", Collections.unmodifiableList(Arrays.asList(%s)));\n",
184+
" aliasesMap.put(\"%s\", %s);\n",
204185
esc(canonical),
205-
quoteList(list)
186+
unmodifiableListLiteral(list)
206187
)
207188
}
208-
out.println(" return Collections.unmodifiableMap(aliasesMap);")
189+
out.println(" return unmodifiableMap(aliasesMap);")
209190
out.println(" }")
210191
out.println()
211192

@@ -215,7 +196,7 @@ abstract class ParseV2SupportedConfigurationsTask @Inject constructor(
215196
for ((alias, target) in aliasMapping.toSortedMap()) {
216197
out.printf(" aliasMappingMap.put(\"%s\", \"%s\");\n", esc(alias), esc(target))
217198
}
218-
out.println(" return Collections.unmodifiableMap(aliasMappingMap);")
199+
out.println(" return unmodifiableMap(aliasMappingMap);")
219200
out.println(" }")
220201
out.println()
221202

@@ -225,7 +206,7 @@ abstract class ParseV2SupportedConfigurationsTask @Inject constructor(
225206
for ((oldKey, note) in deprecated.toSortedMap()) {
226207
out.printf(" deprecatedMap.put(\"%s\", \"%s\");\n", esc(oldKey), esc(note))
227208
}
228-
out.println(" return Collections.unmodifiableMap(deprecatedMap);")
209+
out.println(" return unmodifiableMap(deprecatedMap);")
229210
out.println(" }")
230211
out.println()
231212

@@ -235,15 +216,36 @@ abstract class ParseV2SupportedConfigurationsTask @Inject constructor(
235216
for ((propertyKey, config) in reversePropertyKeysMap.toSortedMap()) {
236217
out.printf(" reversePropertyKeysMapping.put(\"%s\", \"%s\");\n", esc(propertyKey), esc(config))
237218
}
238-
out.println(" return Collections.unmodifiableMap(reversePropertyKeysMapping);")
219+
out.println(" return unmodifiableMap(reversePropertyKeysMapping);")
239220
out.println(" }")
240221
out.println("}")
241222
}
242223
}
243224

225+
private fun supportedConfigLiteral(config: SupportedConfigurationItem): String =
226+
"new SupportedConfiguration(${escNullableString(config.version)}, ${escNullableString(config.type)}, ${escNullableString(config.default)}, ${listLiteral(config.aliases)}, ${listLiteral(config.propertyKeys)})"
227+
228+
private fun supportedConfigListLiteral(configList: List<SupportedConfigurationItem>): String = when (configList.size) {
229+
0 -> "emptyList()"
230+
1 -> "singletonList(${supportedConfigLiteral(configList[0])})"
231+
else -> "unmodifiableList(asList(${configList.joinToString(", ") { supportedConfigLiteral(it) }}))"
232+
}
233+
244234
private fun quoteList(list: List<String>): String =
245235
list.joinToString(", ") { "\"${esc(it)}\"" }
246236

237+
private fun listLiteral(list: List<String>): String = when (list.size) {
238+
0 -> "emptyList()"
239+
1 -> "singletonList(${quoteList(list)})"
240+
else -> "asList(${quoteList(list)})"
241+
}
242+
243+
private fun unmodifiableListLiteral(list: List<String>): String = when (list.size) {
244+
0 -> "emptyList()"
245+
1 -> "singletonList(${quoteList(list)})"
246+
else -> "unmodifiableList(asList(${quoteList(list)}))"
247+
}
248+
247249
private fun esc(s: String): String =
248250
s.replace("\\", "\\\\").replace("\"", "\\\"")
249251

buildSrc/src/test/kotlin/datadog/gradle/plugin/config/ParseV2SupportedConfigurationsTest.kt

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ class ParseV2SupportedConfigurationsTest : GradleFixture() {
6363
aliases = listOf("DD_ALIAS")
6464
)
6565

66-
assertTrue(content.contains("""aliasesMap.put("DD_ACTION_EXECUTION_ID", Collections.unmodifiableList(Arrays.asList()))"""))
67-
assertTrue(content.contains("""aliasesMap.put("DD_AGENTLESS_LOG_SUBMISSION_ENABLED", Collections.unmodifiableList(Arrays.asList("DD_ALIAS")))"""))
66+
assertTrue(content.contains("""aliasesMap.put("DD_ACTION_EXECUTION_ID", emptyList())"""))
67+
assertTrue(content.contains("""aliasesMap.put("DD_AGENTLESS_LOG_SUBMISSION_ENABLED", singletonList("DD_ALIAS"))"""))
6868

6969
assertTrue(content.contains("""aliasMappingMap.put("DD_ALIAS", "DD_AGENTLESS_LOG_SUBMISSION_ENABLED")"""))
7070

@@ -157,9 +157,6 @@ class ParseV2SupportedConfigurationsTest : GradleFixture() {
157157
aliases: List<String>,
158158
propertyKeys: List<String> = emptyList()
159159
) {
160-
val aliasesArray = aliases.joinToString(", ") { "\"$it\"" }
161-
val propertyKeysArray = propertyKeys.joinToString(", ") { "\"$it\"" }
162-
163160
assertTrue(
164161
content.contains("""supportedMap.put("$key""""),
165162
"Should contain supportedMap.put for key: $key"
@@ -171,9 +168,9 @@ class ParseV2SupportedConfigurationsTest : GradleFixture() {
171168
append("\"$type\", ")
172169
append(if (default == "null") "null" else "\"$default\"")
173170
append(", ")
174-
append("Arrays.asList($aliasesArray)")
171+
append(listExpr(aliases))
175172
append(", ")
176-
append("Arrays.asList($propertyKeysArray)")
173+
append(listExpr(propertyKeys))
177174
append(")")
178175
}
179176

@@ -182,4 +179,10 @@ class ParseV2SupportedConfigurationsTest : GradleFixture() {
182179
"Should contain SupportedConfiguration: $expectedPattern"
183180
)
184181
}
182+
183+
private fun listExpr(items: List<String>): String = when (items.size) {
184+
0 -> "emptyList()"
185+
1 -> """singletonList("${items[0]}")"""
186+
else -> """asList(${items.joinToString(", ") { "\"$it\"" }})"""
187+
}
185188
}

0 commit comments

Comments
 (0)