Skip to content

Commit 515d0a7

Browse files
committed
ICU-22773 Faster generation (4x) with multithreading
1 parent 2fa8a09 commit 515d0a7

File tree

6 files changed

+42
-5
lines changed

6 files changed

+42
-5
lines changed

tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/Cldr2Icu.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ private void convert() {
2323
convert.setLocaleIdFilter(options.localeIdFilter);
2424
convert.setIncludePseudoLocales(options.includePseudoLocales);
2525
convert.setEmitReport(options.emitReport);
26+
convert.setParallel(options.parallel);
2627

2728
convert.init();
2829
convert.execute();

tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/Cldr2IcuCliOptions.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ class Cldr2IcuCliOptions {
144144
private static final String XML_CONFIG_DEFAULT = "${icuDir}/tools/cldr/cldr-to-icu/config.xml";
145145
String xmlConfig;
146146

147+
private static final String PARALLEL = "parallel";
148+
private static final String PARALLEL_DESC = "Run the generation in parallel (multithreaded), to make it faster.";
149+
private static final String PARALLEL_DEFAULT = "false";
150+
boolean parallel;
151+
147152
// These must be kept in sync with getOptions().
148153
private static final Options options = new Options()
149154
.addOption(Option.builder()
@@ -254,6 +259,10 @@ class Cldr2IcuCliOptions {
254259
.argName("path")
255260
.desc(descWithDefault(XML_CONFIG_DESC, XML_CONFIG_DEFAULT))
256261
.build())
262+
.addOption(Option.builder()
263+
.longOpt(PARALLEL)
264+
.desc(descWithDefault(PARALLEL_DESC, PARALLEL_DEFAULT))
265+
.build())
257266
;
258267

259268
void processArgs(String[] args) {
@@ -288,6 +297,7 @@ void processArgs(String[] args) {
288297
emitReport = cli.hasOption(EMIT_REPORT);
289298
forceDelete = cli.hasOption(FORCE_DELETE);
290299
xmlConfig = cli.getOptionValue(XML_CONFIG, expandFolders(XML_CONFIG_DEFAULT));
300+
parallel = cli.hasOption(PARALLEL);
291301

292302
if (cli.hasOption(OUTPUT_TYPES_LIST)) {
293303
OutputType[] outTypesToSort = OutputType.values();

tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/IcuConverterConfig.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public static final class Builder {
4747
private Optional<String> cldrVersion = Optional.empty();
4848
private CldrDraftStatus minimumDraftStatus = CldrDraftStatus.CONTRIBUTED;
4949
private boolean emitReport = false;
50+
private boolean parallel = false;
5051
private final SetMultimap<IcuLocaleDir, String> localeIdsMap = TreeMultimap.create();
5152
private final Table<IcuLocaleDir, String, String> forcedAliases = TreeBasedTable.create();
5253
private final Table<IcuLocaleDir, String, String> forcedParents = TreeBasedTable.create();
@@ -111,6 +112,11 @@ public Builder setEmitReport(boolean emitReport) {
111112
return this;
112113
}
113114

115+
public Builder setParallel(boolean parallel) {
116+
this.parallel = parallel;
117+
return this;
118+
}
119+
114120
public Builder addLocaleIds(IcuLocaleDir dir, Iterable<String> localeIds) {
115121
localeIdsMap.putAll(dir, localeIds);
116122
return this;
@@ -138,6 +144,7 @@ public LdmlConverterConfig build() {
138144
private final IcuVersionInfo versionInfo;
139145
private final CldrDraftStatus minimumDraftStatus;
140146
private final boolean emitReport;
147+
private final boolean parallel;
141148
private final ImmutableSet<String> allLocaleIds;
142149
private final ImmutableSetMultimap<IcuLocaleDir, String> localeIdsMap;
143150
private final ImmutableTable<IcuLocaleDir, String, String> forcedAliases;
@@ -161,6 +168,7 @@ private IcuConverterConfig(Builder builder) {
161168
builder.cldrVersion.orElse(CldrDataSupplier.getCldrVersionString()));
162169
this.minimumDraftStatus = checkNotNull(builder.minimumDraftStatus);
163170
this.emitReport = builder.emitReport;
171+
this.parallel = builder.parallel;
164172
// getAllLocaleIds() returns the union of all the specified IDs in the map.
165173
this.allLocaleIds = ImmutableSet.copyOf(builder.localeIdsMap.values());
166174
this.localeIdsMap = ImmutableSetMultimap.copyOf(builder.localeIdsMap);
@@ -202,6 +210,11 @@ public boolean emitReport() {
202210
return emitReport;
203211
}
204212

213+
@Override
214+
public boolean parallel() {
215+
return parallel;
216+
}
217+
205218
@Override
206219
public ImmutableMap<String, String> getForcedAliases(IcuLocaleDir dir) {
207220
return forcedAliases.row(dir);

tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/LdmlConverter.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,22 +288,26 @@ private void processLdml() {
288288
Path baseDir = config.getOutputDir();
289289

290290
System.out.println("processing standard ldml files");
291-
for (String id : config.getAllLocaleIds()) {
291+
Stream<String> localeStream = config.getAllLocaleIds().stream();
292+
if (config.parallel()) {
293+
localeStream = localeStream.parallel();
294+
}
295+
localeStream.forEach(id -> {
292296
// Skip "target" IDs that are aliases (they are handled later).
293297
if (!availableIds.contains(id)) {
294-
continue;
298+
return;
295299
}
296300
// TODO: Remove the following skip when ICU-20997 is fixed
297301
if (id.contains("VALENCIA") || id.contains("TARASK")) {
298302
System.out.println("(skipping " + id + " until ICU-20997 is fixed)");
299-
continue;
303+
return;
300304
}
301305
// Now that former CLDR see locales are in common, there are some language
302306
// variants that are not at a high enough coverage level to pick up.
303307
// TODO need a better way of handling this.
304308
if (id.contains("POLYTON")) {
305309
System.out.println("(skipping " + id + ", insufficient coverage level)");
306-
continue;
310+
return;
307311
}
308312

309313
IcuData icuData = new IcuData(id, true);
@@ -365,7 +369,7 @@ private void processLdml() {
365369
writtenLocaleIds.put(dir, id);
366370
}
367371
}
368-
}
372+
});
369373

370374
System.out.println("processing alias ldml files");
371375
for (IcuLocaleDir dir : splitDirs) {

tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/LdmlConverterConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,9 @@ public String getCldrVersion() {
148148
* Whether to emit a summary report for debug purposes after conversion is complete.
149149
*/
150150
boolean emitReport();
151+
152+
/**
153+
* Whether to generate data in parallel (using multithreading).
154+
*/
155+
boolean parallel();
151156
}

tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/ConvertIcuDataTask.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,10 @@ public void setEmitReport(boolean emit) {
136136
config.setEmitReport(emit);
137137
}
138138

139+
public void setParallel(boolean parallel) {
140+
config.setParallel(parallel);
141+
}
142+
139143
public static final class LocaleIds extends Task {
140144
private ImmutableSet<String> ids;
141145

0 commit comments

Comments
 (0)