Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve Start-Up Time with CDS / AppCDS #748

Closed
vorburger opened this issue Jun 27, 2024 · 4 comments
Closed

Improve Start-Up Time with CDS / AppCDS #748

vorburger opened this issue Jun 27, 2024 · 4 comments
Labels
distro Distribution related enhancement New feature or request help wanted Extra attention is needed performance Enola's runtime performance

Comments

@vorburger
Copy link
Member

but TL;DR it's, apparently, as simple as:

java -XX:+AutoCreateSharedArchive -XX:SharedArchiveFile=enola.jsa -cp enola.jar Main

This seems like a likely lower-hanging and higher priority than e.g. #391 and #337 and #335.

PS: -XX:+UseCompressedClassPointers -XX:+UseCompressedOops ?

@vorburger vorburger added enhancement New feature or request help wanted Extra attention is needed distro Distribution related performance Enola's runtime performance labels Jun 27, 2024
@vorburger
Copy link
Member Author

vorburger commented Jun 27, 2024

NOTA BENE: I keep forgetting that the main cost of the ./enola launch script, which is used during development but not for (eventual) end-users https://docs.enola.dev/use/, is NOT the java but the "does it need to be rebuilt" check (which (a) finds a JDK and (b) launch Bazel; each time!), note:

$ time ./enola -V
https://enola.dev
Version: 3be00753 <https://github.com/enola-dev/enola/tree/3be00753>
Copyright 2023-2024 The Enola <https://enola.dev> Authors
JVM: 21.0.2 (Azul Systems, Inc. OpenJDK 64-Bit Server VM 21.0.2+13-LTS) on OS: Linux 6.9.5-200.fc40.x86_64 amd64

________________________________________________________
Executed in  804.47 millis    fish           external
   usr time  447.66 millis    0.00 micros  447.66 millis
   sys time   83.83 millis  981.00 micros   82.85 millis


$ time ./enola -V
https://enola.dev
Version: 3be00753 <https://github.com/enola-dev/enola/tree/3be00753>
Copyright 2023-2024 The Enola <https://enola.dev> Authors
JVM: 21.0.2 (Azul Systems, Inc. OpenJDK 64-Bit Server VM 21.0.2+13-LTS) on OS: Linux 6.9.5-200.fc40.x86_64 amd64

________________________________________________________
Executed in  754.96 millis    fish           external
   usr time  439.17 millis    0.31 millis  438.86 millis
   sys time   83.18 millis    1.13 millis   82.05 millis


$ time java --enable-preview -jar bazel-bin/java/dev/enola/cli/enola_deploy.jar -V
https://enola.dev
Version: 3be00753 <https://github.com/enola-dev/enola/tree/3be00753>
Copyright 2023-2024 The Enola <https://enola.dev> Authors
JVM: 21.0.3 (Red Hat, Inc. OpenJDK 64-Bit Server VM 21.0.3+9) on OS: Linux 6.9.5-200.fc40.x86_64 amd64

________________________________________________________
Executed in  245.80 millis    fish           external
   usr time  416.84 millis    0.00 micros  416.84 millis
   sys time   49.08 millis  955.00 micros   48.12 millis


$ time java --enable-preview -jar bazel-bin/java/dev/enola/cli/enola_deploy.jar -V
https://enola.dev
Version: 3be00753 <https://github.com/enola-dev/enola/tree/3be00753>
Copyright 2023-2024 The Enola <https://enola.dev> Authors
JVM: 21.0.3 (Red Hat, Inc. OpenJDK 64-Bit Server VM 21.0.3+9) on OS: Linux 6.9.5-200.fc40.x86_64 amd64

________________________________________________________
Executed in  274.37 millis    fish           external
   usr time  486.14 millis    0.35 millis  485.79 millis
   sys time   51.26 millis    1.08 millis   50.18 millis

@vorburger
Copy link
Member Author

java -XX:+AutoCreateSharedArchive -XX:SharedArchiveFile=enola.jsa -cp enola.jar Main

This doesn't actually make a significant difference, check this out:

$ time java -XX:+AutoCreateSharedArchive -XX:SharedArchiveFile=enola.jsa --enable-preview -jar bazel-bin/java/dev/enola/cli/enola_deploy.jar -V
https://enola.dev
Version: 3be00753 <https://github.com/enola-dev/enola/tree/3be00753>
Copyright 2023-2024 The Enola <https://enola.dev> Authors
JVM: 21.0.3 (Red Hat, Inc. OpenJDK 64-Bit Server VM 21.0.3+9) on OS: Linux 6.9.5-200.fc40.x86_64 amd64
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$IOrdered: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$OptionSpec: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$OptionSpec$Builder: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$TimeZoneConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$3: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$IParseResultHandler: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$ByteOrderConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$NoOpParameterPreprocessor: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$ArgGroup: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$AutoHelpMixin: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$AbstractHandler: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$ClassConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Parameters: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$CharsetConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$RegexTransformer$Builder: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Help$ColorScheme: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$FieldBinding: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Option: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$19: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$BigIntegerConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$Interpolator$1: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$ArgSpec$Builder: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Help$ColorScheme$1: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$18: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$IParameterExceptionHandler: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$BigDecimalConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Help$Ansi$Style: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$Interpolator$ILookup: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Tracer: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$InitialValueState: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$ISO8601DateConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$IParseResultHandler2: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$Interpolator: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$UUIDConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$IExecutionStrategy: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$ParserSpec: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$IHelpSectionRenderer: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Help$Ansi$IStyle: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Range: Old class has been linked
[0.290s][warning][cds] Skipping dev/enola/cli/VersionProvider: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$PatternConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$2: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$ArgGroupSpec$Builder: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Help$Ansi: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$Interpolator$2: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$InetAddressConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$RuntimeTypeInfo: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$DefaultFactory: Old class has been linked
[0.290s][warning][cds] Skipping jdk/proxy1/$Proxy0: Unsupported location
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$Interpolator$3: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$LongConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$IHelpCommandInitializable2: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$ITypeInfo: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$ParseResult$GroupMatchContainer: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$CaseAwareLinkedMap$CaseAwareKeySet: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Interpreter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$FloatConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$Interpolator$4: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$2: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$IHelpCommandInitializable: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$TraceLevel: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$ParseResult$Builder: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec: Old class has been linked
[0.290s][warning][cds] Skipping picocli/AutoComplete$GenerateCompletion: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$1: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$IntegerConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$8: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$CaseAwareLinkedMap: Old class has been linked
[0.290s][warning][cds] Skipping jdk/proxy2/$Proxy4: Unsupported location
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$ArgGroupSpec: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$IAnnotatedElement: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$HelpCommand: Old class has been linked
[0.290s][warning][cds] Skipping dev/enola/cli/EnolaCLI$QuietExecutionExceptionHandler: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Mixin: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$7: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$CommandUserObject: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Help$Ansi$Text: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$URIConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Spec: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$RunLast: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$10: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$AbstractParseResultHandler: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$CommandReflection$1: Old class has been linked
[0.290s][warning][cds] Skipping jdk/proxy2/$Proxy7: Unsupported location
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$URLConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$Predicate: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Help$Ansi$StyledSection: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$9: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$ScopeType: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Command: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$DoubleConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$LookBehind: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$4: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$StringBuilderConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Help$Visibility: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$ArgSpec: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$ParseResult$GroupMatch: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$FileConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$ISetter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$3: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$PositionalParamSpec: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$IParameterPreprocessor: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$StringConverter: Old class has been linked
[0.290s][warning][cds] Skipping com/sun/proxy/jdk/proxy1/$Proxy2: Unsupported location
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$IScope: Old class has been linked
[0.290s][warning][cds] Skipping jdk/proxy2/$Proxy8: Unsupported location
[0.290s][warning][cds] Skipping picocli/CommandLine$IVersionProvider: Old class has been linked
[0.290s][warning][cds] Skipping jdk/proxy2/$Proxy3: Unsupported location
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$6: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$CharSequenceConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$IGetter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Help: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$16: Old class has been linked
[0.290s][warning][cds] Skipping jdk/proxy1/$Proxy1: Unsupported location
[0.290s][warning][cds] Skipping picocli/CommandLine$NoVersionProvider: interface picocli/CommandLine$IVersionProvider is excluded
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$5: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$IExitCodeExceptionMapper: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$CharArrayConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$CommandReflection: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$IFactory: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$BooleanConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$17: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$IExecutionExceptionHandler: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$ByteConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$ObjectScope: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$14: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$ShortConverter: Old class has been linked
[0.290s][warning][cds] Skipping dev/enola/cli/EnolaCLI$$Lambda+0x00007f47f002ac20: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$CommandSpec: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$PositionalParametersSorter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$15: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$CharacterConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$12: Old class has been linked
[0.290s][warning][cds] Skipping dev/enola/cli/EnolaCLI$KnownExitCodeExceptionMapper: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$ParseResult: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$13: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Help$ShortestFirst: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$PositionalParamSpec$Builder: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Assert: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$Messages: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$UsageMessageSpec$11: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$NetworkInterfaceConverter: Old class has been linked
[0.290s][warning][cds] Skipping jdk/proxy2/$Proxy5: Unsupported location
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Help$ColorScheme$Builder: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Spec$Target: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$MethodBinding: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$ISO8601TimeConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$RegexTransformer: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$ObjectBinding: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$ITypeConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$ReflectionConverter: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$IExtensible: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$IScoped: Old class has been linked
[0.290s][warning][cds] Skipping jdk/proxy2/$Proxy6: Unsupported location
[0.290s][warning][cds] Skipping picocli/CommandLine$Model$TypedMember: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$INegatableOptionTransformer: Old class has been linked
[0.290s][warning][cds] Skipping picocli/CommandLine$BuiltIn$CurrencyConverter: Old class has been linked

________________________________________________________
Executed in  347.15 millis    fish           external
   usr time  633.58 millis    1.76 millis  631.82 millis
   sys time   66.39 millis    1.21 millis   65.19 millis


$ time java -XX:+AutoCreateSharedArchive -XX:SharedArchiveFile=enola.jsa --enable-preview -jar bazel-bin/java/dev/enola/cli/enola_deploy.jar -V
https://enola.dev
Version: 3be00753 <https://github.com/enola-dev/enola/tree/3be00753>
Copyright 2023-2024 The Enola <https://enola.dev> Authors
JVM: 21.0.3 (Red Hat, Inc. OpenJDK 64-Bit Server VM 21.0.3+9) on OS: Linux 6.9.5-200.fc40.x86_64 amd64

________________________________________________________
Executed in  221.05 millis    fish           external
   usr time  399.07 millis    0.44 millis  398.64 millis
   sys time   49.95 millis    1.10 millis   48.85 millis


$ time java -XX:+AutoCreateSharedArchive -XX:SharedArchiveFile=enola.jsa --enable-preview -jar bazel-bin/java/dev/enola/cli/enola_deploy.jar -V
https://enola.dev
Version: 3be00753 <https://github.com/enola-dev/enola/tree/3be00753>
Copyright 2023-2024 The Enola <https://enola.dev> Authors
JVM: 21.0.3 (Red Hat, Inc. OpenJDK 64-Bit Server VM 21.0.3+9) on OS: Linux 6.9.5-200.fc40.x86_64 amd64

________________________________________________________
Executed in  216.13 millis    fish           external
   usr time  356.81 millis    0.00 micros  356.81 millis
   sys time   58.47 millis  976.00 micros   57.50 millis

@vorburger
Copy link
Member Author

This doesn't actually make a significant difference, check this out:

Just to recap why I'm closing this without using CDS: So -XX:+AutoCreateSharedArchive -XX:SharedArchiveFile=enola.jsa brings java ... (not ./enola) down from ~257ms to ~247ms - at the cost of ~360ms first time, with confusing ugly messages (see above); that's not worth it!

So #751 fixing by #752 is (much) more impactful, here. (What would also be fun would be not to launch Bazel if Java sources, and models, haven't changed!)

@vorburger
Copy link
Member Author

What would also be fun would be not to launch Bazel if Java sources, and models, haven't changed!

=> #753

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
distro Distribution related enhancement New feature or request help wanted Extra attention is needed performance Enola's runtime performance
Projects
None yet
Development

No branches or pull requests

1 participant