Skip to content

Commit 05c4467

Browse files
Blazor Hybrid iOS & Mac Catalyst Performance Profiling (#68685)
* [MAUI][Blazor][PERF] Add APK file usage for Android Maui Blazor SOD * Update android_scenarios.proj * Call ReportFullyDrawn * Add --use-fully-drawn-time --fully-drawn-extra-delay * Add System.Console.WriteLine for non-android platforms * Add 6 second delay * Missing `;` * Add back Directory.Build.{props, targets} (cherry picked from commit 28d9ef3ab4ac53b947dd435e6494428238b4dea5) * Fixes based on CI 1729796 https://dev.azure.com/dnceng/internal/_build/results?buildId=1729796&view=logs&j=4d93e3ae-0b8e-5532-bed2-af5c8a7c58d3&t=b13dec14-3eb2-5f1a-4501-8a9fdadb0e3a (cherry picked from commit d470655576d3abe6a6fec478c221c4d9de698ba9) * [REVERT THIS] Temporarily skip other jobs (cherry picked from commit df51582df9e7bb9d1ca82759d664823c76823c29) * [MAUI][Blazor][PERF] Add IPA file usage for iOS/MacCatalyst Maui Blazor SOD (cherry picked from commit b1aaaf2) * Remove / restore nuget.config * Escape quotes * Fix typo * Replicate changes from #67670 * use-fully-drawn-time * Use akoeplinger/performance * Fix misplaced quote character * Revert "Use akoeplinger/performance" This reverts commit 12358b6. The change was merged to dotnet/performance. * Add ` --startup-iterations 7` * Revert "[REVERT THIS] Temporarily skip other jobs" This reverts commit 54fa30d. * Remove SOD Startup Iterations Co-authored-by: Alexander Köplinger <[email protected]>
1 parent a4f2109 commit 05c4467

File tree

5 files changed

+173
-30
lines changed

5 files changed

+173
-30
lines changed

eng/pipelines/coreclr/templates/build-perf-maui-apps.yml

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ steps:
236236
var activity = MainActivity.Context as Activity;
237237
activity.ReportFullyDrawn();
238238
#else
239-
System.Console.WriteLine("__MAUI_Blazor_WebView_OnAfterRender__");
239+
System.Console.WriteLine(\"__MAUI_Blazor_WebView_OnAfterRender__\");
240240
#endif
241241
}
242242
}
@@ -256,6 +256,40 @@ steps:
256256
displayName: Build MAUI Blazor Android
257257
workingDirectory: $(Build.SourcesDirectory)/MauiBlazorTesting
258258
259+
- script: |
260+
chmod -R a+r .
261+
# remove net6.0-maccatalyst to work around https://github.com/dotnet/sdk/issues/21877
262+
cp MauiBlazorTesting.csproj MauiBlazorTesting.csproj.bak
263+
sed -i'' -e 's/net6.0-ios;net6.0-maccatalyst/net6.0-ios/g' MauiBlazorTesting.csproj
264+
265+
# NuGet.config file cannot be in the build directory currently due to https://github.com/dotnet/aspnetcore/issues/41397
266+
rm NuGet.config
267+
268+
../dotnet publish -bl:MauiBlazoriOS.binlog -f net6.0-ios --self-contained -r ios-arm64 -c Release /p:_RequireCodeSigning=false /p:ApplicationId=net.dot.mauiblazortesting
269+
mv ./bin/Release/net6.0-ios/ios-arm64/publish/MauiBlazorTesting.ipa ./MauiBlazoriOSDefault.ipa
270+
271+
# Restore NuGet.config
272+
cp $(Build.SourcesDirectory)/NuGet.config ./NuGet.config
273+
274+
cp MauiBlazorTesting.csproj.bak MauiBlazorTesting.csproj
275+
displayName: Build MAUI Blazor iOS
276+
workingDirectory: $(Build.SourcesDirectory)/MauiBlazorTesting
277+
278+
- script: |
279+
chmod -R a+r .
280+
281+
# NuGet.config file cannot be in the build directory currently due to https://github.com/dotnet/aspnetcore/issues/41397
282+
rm NuGet.config
283+
284+
../dotnet publish -bl:MauiBlazorMacCatalyst.binlog -f net6.0-maccatalyst -c Release
285+
286+
# Restore NuGet.config
287+
cp $(Build.SourcesDirectory)/NuGet.config ./NuGet.config
288+
289+
mv ./bin/Release/net6.0-maccatalyst/maccatalyst-x64/MauiBlazorTesting.app ./MauiBlazorMacCatalystDefault.app
290+
displayName: Build MAUI Blazor MacCatalyst
291+
workingDirectory: $(Build.SourcesDirectory)/MauiBlazorTesting
292+
259293
- task: PublishBuildArtifacts@1
260294
displayName: 'Publish MauiAndroid binlog'
261295
condition: always()
@@ -284,6 +318,27 @@ steps:
284318
pathtoPublish: $(Build.SourcesDirectory)/MauiTesting/MauiMacCatalyst.binlog
285319
artifactName: ${{ parameters.artifactName }}
286320

321+
- task: PublishBuildArtifacts@1
322+
displayName: 'Publish MauiBlazorAndroid binlog'
323+
condition: always()
324+
inputs:
325+
pathtoPublish: $(Build.SourcesDirectory)/MauiBlazorTesting/MauiBlazorAndroid.binlog
326+
artifactName: ${{ parameters.artifactName }}
327+
328+
- task: PublishBuildArtifacts@1
329+
displayName: 'Publish MauiBlazoriOS binlog'
330+
condition: always()
331+
inputs:
332+
pathtoPublish: $(Build.SourcesDirectory)/MauiBlazorTesting/MauiBlazoriOS.binlog
333+
artifactName: ${{ parameters.artifactName }}
334+
335+
- task: PublishBuildArtifacts@1
336+
displayName: 'Publish MauiBlazorMacCatalyst binlog'
337+
condition: always()
338+
inputs:
339+
pathtoPublish: $(Build.SourcesDirectory)/MauiBlazorTesting/MauiBlazorMacCatalyst.binlog
340+
artifactName: ${{ parameters.artifactName }}
341+
287342
- task: PublishBuildArtifacts@1
288343
displayName: 'Publish MauiiOSPodcast binlog'
289344
condition: always()
@@ -331,6 +386,16 @@ steps:
331386
archiveType: tar
332387
tarCompression: gz
333388

389+
- template: /eng/pipelines/common/upload-artifact-step.yml
390+
parameters:
391+
rootFolder: $(Build.SourcesDirectory)/MauiBlazorTesting/MauiBlazoriOSDefault.ipa
392+
includeRootFolder: true
393+
displayName: Maui Blazor iOS IPA
394+
artifactName: MauiBlazoriOSDefaultIPA
395+
archiveExtension: '.tar.gz'
396+
archiveType: tar
397+
tarCompression: gz
398+
334399
- template: /eng/pipelines/common/upload-artifact-step.yml
335400
parameters:
336401
rootFolder: $(Build.SourcesDirectory)/dotnet-podcasts/src/Mobile/MauiiOSPodcast.ipa
@@ -351,6 +416,16 @@ steps:
351416
archiveType: tar
352417
tarCompression: gz
353418

419+
- template: /eng/pipelines/common/upload-artifact-step.yml
420+
parameters:
421+
rootFolder: $(Build.SourcesDirectory)/MauiBlazorTesting/MauiBlazorMacCatalystDefault.app
422+
includeRootFolder: true
423+
displayName: Maui Blazor MacCatalyst App
424+
artifactName: MauiBlazorMacCatalystDefault
425+
archiveExtension: '.tar.gz'
426+
archiveType: tar
427+
tarCompression: gz
428+
354429
- script: rm -r -f ./bin
355430
workingDirectory: $(Build.SourcesDirectory)/MauiTesting
356431
displayName: Clean MauiTesting bin directory

eng/pipelines/coreclr/templates/perf-job.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,20 @@ jobs:
255255
artifactFileName: 'MauiiOSPodcastIPA.tar.gz'
256256
artifactName: 'MauiiOSPodcastIPA'
257257
displayName: 'Maui iOS Podcast IPA'
258+
- template: /eng/pipelines/common/download-artifact-step.yml
259+
parameters:
260+
unpackFolder: $(Build.SourcesDirectory)/MauiBlazoriOSDefaultIPA
261+
cleanUnpackFolder: false
262+
artifactFileName: 'MauiBlazoriOSDefaultIPA.tar.gz'
263+
artifactName: 'MauiBlazoriOSDefaultIPA'
264+
displayName: 'Maui Blazor iOS IPA'
265+
- template: /eng/pipelines/common/download-artifact-step.yml
266+
parameters:
267+
unpackFolder: $(Build.SourcesDirectory)/MauiBlazorMacCatalystDefault
268+
cleanUnpackFolder: false
269+
artifactFileName: 'MauiBlazorMacCatalystDefault.tar.gz'
270+
artifactName: 'MauiBlazorMacCatalystDefault'
271+
displayName: 'Maui Blazor MacCatalyst App'
258272

259273
# Create Core_Root
260274
- script: $(Build.SourcesDirectory)/src/tests/build$(scriptExt) $(buildConfig) $(archType) generatelayoutonly $(librariesOverrideArg)

eng/testing/performance/ios_scenarios.proj

Lines changed: 72 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,21 @@
1818
<LlvmPath>nollvm</LlvmPath>
1919
<LlvmPath Condition="'$(iOSLlvmBuild)' == 'True'">llvm</LlvmPath>
2020
</PropertyGroup>
21-
21+
2222
<PropertyGroup Condition="'$(AGENT_OS)' == 'Windows_NT'">
2323
<ScenarioDirectory>%HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\</ScenarioDirectory>
24-
24+
2525
</PropertyGroup>
2626
<PropertyGroup Condition="'$(AGENT_OS)' != 'Windows_NT'">
2727
<ScenarioDirectory>$HELIX_CORRELATION_PAYLOAD/performance/src/scenarios/</ScenarioDirectory>
2828
</PropertyGroup>
2929

3030
<ItemGroup>
3131
<HelixWorkItem Include="SOD - iOS HelloWorld .app Size">
32-
<PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
33-
<PreCommands>cd $(ScenarioDirectory)helloios;cp -rf $HELIX_CORRELATION_PAYLOAD/iosHelloWorld/$(LlvmPath) ./app;$(Python) pre.py --name app</PreCommands>
34-
<Command>$(Python) test.py sod --scenario-name &quot;%(Identity)&quot;</Command>
35-
<PostCommands>$(Python) post.py</PostCommands>
32+
<PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
33+
<PreCommands>cd $(ScenarioDirectory)helloios;cp -rf $HELIX_CORRELATION_PAYLOAD/iosHelloWorld/$(LlvmPath) ./app;$(Python) pre.py --name app</PreCommands>
34+
<Command>$(Python) test.py sod --scenario-name &quot;%(Identity)&quot;</Command>
35+
<PostCommands>$(Python) post.py</PostCommands>
3636
</HelixWorkItem>
3737
<HelixWorkItem Include="SOD - iOS HelloWorld Mono Zip Size $(LlvmPath)">
3838
<PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
@@ -84,6 +84,24 @@
8484
<Command>$(Python) test.py sod --scenario-name &quot;%(Identity)&quot;</Command>
8585
<PostCommands>$(Python) post.py</PostCommands>
8686
</HelixWorkItem>
87+
<HelixWorkItem Include="SOD - Maui Blazor iOS IPA Size" Condition="'$(iOSLlvmBuild)' == 'False'">
88+
<PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
89+
<PreCommands>cd $(ScenarioDirectory)mauiblazorios;cp $HELIX_CORRELATION_PAYLOAD/MauiBlazoriOSDefault.ipa .;$(Python) pre.py --name MauiBlazoriOSDefault.ipa</PreCommands>
90+
<Command>$(Python) test.py sod --scenario-name &quot;%(Identity)&quot;</Command>
91+
<PostCommands>$(Python) post.py</PostCommands>
92+
</HelixWorkItem>
93+
<HelixWorkItem Include="SOD - Maui Blazor iOS IPA Size Unzipped" Condition="'$(iOSLlvmBuild)' == 'False'">
94+
<PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
95+
<PreCommands>cd $(ScenarioDirectory)mauiblazorios;cp $HELIX_CORRELATION_PAYLOAD/MauiBlazoriOSDefault.ipa .;$(Python) pre.py --unzip --name MauiBlazoriOSDefault.ipa</PreCommands>
96+
<Command>$(Python) test.py sod --scenario-name &quot;%(Identity)&quot;</Command>
97+
<PostCommands>$(Python) post.py</PostCommands>
98+
</HelixWorkItem>
99+
<HelixWorkItem Include="SOD - Maui Blazor MacCatalyst .app Size" Condition="'$(iOSLlvmBuild)' == 'False'">
100+
<PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
101+
<PreCommands>cd $(ScenarioDirectory)mauiblazorios;cp -rf $HELIX_CORRELATION_PAYLOAD/MauiBlazorMacCatalystDefault ./app;$(Python) pre.py --name app</PreCommands>
102+
<Command>$(Python) test.py sod --scenario-name &quot;%(Identity)&quot;</Command>
103+
<PostCommands>$(Python) post.py</PostCommands>
104+
</HelixWorkItem>
87105
<HelixWorkItem Include="SOD - Maui iOS Podcast IPA Size" Condition="'$(iOSLlvmBuild)' == 'False'">
88106
<PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
89107
<PreCommands>cd $(ScenarioDirectory)mauiios;cp $HELIX_CORRELATION_PAYLOAD/MauiiOSPodcast.ipa .;$(Python) pre.py --name MauiiOSPodcast.ipa</PreCommands>
@@ -96,38 +114,63 @@
96114
<Command>$(Python) test.py sod --scenario-name &quot;%(Identity)&quot;</Command>
97115
<PostCommands>$(Python) post.py</PostCommands>
98116
</HelixWorkItem>
99-
<XHarnessAppBundleToTest Include="Device Startup - iOS Maui Default" Condition="'$(iOSLlvmBuild)' == 'False'">
100-
<AppBundlePath>$(WorkItemDirectory).zip</AppBundlePath>
101-
<WorkItemTimeout>00:15:00</WorkItemTimeout>
102-
<TestTarget>ios-device</TestTarget>
103-
<CustomCommands>
104-
<![CDATA[
117+
<XHarnessAppBundleToTest Include="Device Startup - iOS Maui Default" Condition="'$(iOSLlvmBuild)' == 'False'">
118+
<AppBundlePath>$(WorkItemDirectory).zip</AppBundlePath>
119+
<WorkItemTimeout>00:15:00</WorkItemTimeout>
120+
<TestTarget>ios-device</TestTarget>
121+
<CustomCommands>
122+
<![CDATA[
123+
# PreCommands
124+
export XHARNESSPATH=$XHARNESS_CLI_PATH
125+
126+
cp -r $HELIX_CORRELATION_PAYLOAD/MauiTesting.app $(ScenarioDirectory)mauiios/MauiTesting.app
127+
cp -f embedded.mobileprovision $(ScenarioDirectory)mauiios/MauiTesting.app
128+
cd $(ScenarioDirectory)mauiios
129+
sign MauiTesting.app
130+
131+
$(Python) pre.py --name MauiTesting.app
132+
133+
# Testing commands
134+
$(Python) test.py devicestartup --device-type ios --package-path MauiTesting.app --package-name net.dot.mauitesting --scenario-name "%(Identity)"
135+
((result=$?))
136+
137+
# Post commands
138+
$(Python) post.py
139+
exit $result
140+
]]>
141+
</CustomCommands>
142+
</XHarnessAppBundleToTest>
143+
<XHarnessAppBundleToTest Include="Device Startup - iOS Maui Blazor Default" Condition="'$(iOSLlvmBuild)' == 'False'">
144+
<AppBundlePath>$(WorkItemDirectory).zip</AppBundlePath>
145+
<WorkItemTimeout>00:15:00</WorkItemTimeout>
146+
<TestTarget>ios-device</TestTarget>
147+
<CustomCommands>
148+
<![CDATA[
105149
# PreCommands
106150
export XHARNESSPATH=$XHARNESS_CLI_PATH
107151
108-
cp -r $HELIX_CORRELATION_PAYLOAD/MauiTesting.app $(ScenarioDirectory)mauiios/MauiTesting.app
109-
cp -f embedded.mobileprovision $(ScenarioDirectory)mauiios/MauiTesting.app
110-
cd $(ScenarioDirectory)mauiios
111-
sign MauiTesting.app
152+
cp -r $HELIX_CORRELATION_PAYLOAD/MauiBlazorTesting.app $(ScenarioDirectory)mauiblazorios/MauiBlazorTesting.app
153+
cp -f embedded.mobileprovision $(ScenarioDirectory)mauiblazorios/MauiBlazorTesting.app
154+
cd $(ScenarioDirectory)mauiblazorios
155+
sign MauiBlazorTesting.app
112156
113-
$(Python) pre.py --name MauiTesting.app
157+
$(Python) pre.py --name MauiBlazorTesting.app
114158
115159
# Testing commands
116-
$(Python) test.py devicestartup --device-type ios --package-path MauiTesting.app --package-name net.dot.mauitesting --scenario-name "%(Identity)"
117-
((result=$?))
118-
160+
$(Python) test.py devicestartup --device-type ios --package-path MauiBlazorTesting.app --package-name net.dot.mauiblazortesting --scenario-name "%(Identity)" --use-fully-drawn-time --fully-drawn-magic-string __MAUI_Blazor_WebView_OnAfterRender__ --startup-iterations 7
161+
119162
# Post commands
120163
$(Python) post.py
121164
exit $result
122165
]]>
123-
</CustomCommands>
124-
</XHarnessAppBundleToTest>
166+
</CustomCommands>
167+
</XHarnessAppBundleToTest>
125168
<XHarnessAppBundleToTest Include="Device Startup - iOS Maui Podcast" Condition="'$(iOSLlvmBuild)' == 'False'">
126-
<AppBundlePath>$(WorkItemDirectory).zip</AppBundlePath>
127-
<WorkItemTimeout>00:15:00</WorkItemTimeout>
128-
<TestTarget>ios-device</TestTarget>
129-
<CustomCommands>
130-
<![CDATA[
169+
<AppBundlePath>$(WorkItemDirectory).zip</AppBundlePath>
170+
<WorkItemTimeout>00:15:00</WorkItemTimeout>
171+
<TestTarget>ios-device</TestTarget>
172+
<CustomCommands>
173+
<![CDATA[
131174
# PreCommands
132175
export XHARNESSPATH=$XHARNESS_CLI_PATH
133176
@@ -146,8 +189,8 @@
146189
$(Python) post.py
147190
exit $result
148191
]]>
149-
</CustomCommands>
150-
</XHarnessAppBundleToTest>
192+
</CustomCommands>
193+
</XHarnessAppBundleToTest>
151194
</ItemGroup>
152195
<!--
153196
This target is to work around the XHarness command that depend on scripts in ORIGPYPATH

eng/testing/performance/performance-setup.ps1

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ if ($iOSMono) {
174174
Copy-Item -path "$SourceDirectory\iosHelloWorld\nollvm" $PayloadDirectory\iosHelloWorld\nollvm -Recurse
175175
Copy-Item -path "$SourceDirectory\MauiiOSDefaultIPA" $PayloadDirectory\MauiiOSDefaultIPA -Recurse
176176
Copy-Item -path "$SourceDirectory\MauiMacCatalystDefault\MauiMacCatalystDefault.app" $PayloadDirectory\MauiMacCatalystDefault -Recurse
177+
Copy-Item -path "$SourceDirectory\MauiBlazoriOSDefaultIPA" $PayloadDirectory\MauiBlazoriOSDefaultIPA -Recurse
178+
Copy-Item -path "$SourceDirectory\MauiBlazorMacCatalystDefault\MauiBlazorMacCatalystDefault.app" $PayloadDirectory\MauiBlazorMacCatalystDefault -Recurse
177179
Copy-Item -path "$SourceDirectory\MauiiOSPodcastIPA" $PayloadDirectory\MauiiOSPodcastIPA -Recurse
178180
}
179181

eng/testing/performance/performance-setup.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,12 +359,21 @@ if [[ "$iosmono" == "true" ]]; then
359359
mkdir -p $payload_directory/iosHelloWorld && cp -rv $source_directory/iosHelloWorld/nollvm $payload_directory/iosHelloWorld
360360
mkdir -p $payload_directory/iosHelloWorldZip/nollvmzip && cp -rv $source_directory/iosHelloWorldZip/nollvmzip $payload_directory/iosHelloWorldZip
361361
mkdir -p $payload_directory/MauiMacCatalystDefault && cp -rv $source_directory/MauiMacCatalystDefault/MauiMacCatalystDefault.app $payload_directory/MauiMacCatalystDefault
362+
mkdir -p $payload_directory/MauiBlazorMacCatalystDefault && cp -rv $source_directory/MauiBlazorMacCatalystDefault/MauiBlazorMacCatalystDefault.app $payload_directory/MauiBlazorMacCatalystDefault
362363
cp -v $source_directory/MauiiOSDefaultIPA/MauiiOSDefault.ipa $payload_directory/MauiiOSDefault.ipa
364+
cp -v $source_directory/MauiBlazoriOSDefaultIPA/MauiBlazoriOSDefault.ipa $payload_directory/MauiBlazoriOSDefault.ipa
363365
cp -v $source_directory/MauiiOSPodcastIPA/MauiiOSPodcast.ipa $payload_directory/MauiiOSPodcast.ipa
366+
364367
# Get the .app so we can resign in the xharness item
365368
cp -v $source_directory/MauiiOSDefaultIPA/MauiiOSDefault.ipa $source_directory/MauiiOSDefaultIPA/MauiiOSDefault.zip
366369
unzip -d $source_directory/MauiiOSDefaultIPA $source_directory/MauiiOSDefaultIPA/MauiiOSDefault.zip
367370
mv $source_directory/MauiiOSDefaultIPA/Payload/MauiTesting.app $payload_directory/
371+
372+
# Get the .app so we can resign in the xharness item for Maui Blazor
373+
cp -v $source_directory/MauiBlazoriOSDefaultIPA/MauiBlazoriOSDefault.ipa $source_directory/MauiBlazoriOSDefaultIPA/MauiBlazoriOSDefault.zip
374+
unzip -d $source_directory/MauiBlazoriOSDefaultIPA $source_directory/MauiBlazoriOSDefaultIPA/MauiBlazoriOSDefault.zip
375+
mv $source_directory/MauiBlazoriOSDefaultIPA/Payload/MauiBlazorTesting.app $payload_directory/
376+
368377
# Get the .app so we can resign in the xharness item for podcast
369378
cp -v $source_directory/MauiiOSPodcastIPA/MauiiOSPodcast.ipa $source_directory/MauiiOSPodcastIPA/MauiiOSPodcast.zip
370379
unzip -d $source_directory/MauiiOSPodcastIPA $source_directory/MauiiOSPodcastIPA/MauiiOSPodcast.zip

0 commit comments

Comments
 (0)