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

[Enhancement] Calendar initialization is very slow #9

Open
FabriBertani opened this issue Jan 2, 2024 · 9 comments
Open

[Enhancement] Calendar initialization is very slow #9

FabriBertani opened this issue Jan 2, 2024 · 9 comments

Comments

@FabriBertani
Copy link

FabriBertani commented Jan 2, 2024

Hi @yurkinh, thank you for porting this plugin.

I want to point to this issue with the delay of the calendar initialization on mobile platforms, Android and iOS, this does not happen on Windows (I haven't tried on MacCatalyst yet).
I guess that this happens due to how the Grid is filled up with items in the ViewLayoutBase or something related to the MonthDaysView.

Currently, I don't have enough time to deep dive into this issue, but I noticed a few things, just using the SampleApp (I'm using SimplePage, WeekViewPage and AdvancedPage to run some tests):

  • When the calendar is initialized, there are multiple calls to the garbage collector and lots of frames are skipped.
    • SimplePage (Android):
      imagen

    • WeekViewPage (Android):
      imagen

    • AdvancedPage (Android):
      imagen

  • When the calendar is initialized, it takes over 5 seconds to load the screen, even without the events list:
    • SimplePage (Android):
      imagen

    • WeekViewPage (Android):
      imagen

    • AdvancedPage (Android):
      imagen

Also, worth mentioning that in the original plugin, there was a similar issue reported: [Bug] Calendar initializes very slow #101, but it seems that they fixed it because I've tested the Xamarin SampleApp and the load works really fast.

Thank you!

@yurkinh
Copy link
Owner

yurkinh commented Jan 3, 2024

Hi @FabriBertani
Yes. I have noticed it too. Recently I have profiled it a bit with a freshly baked VScode extension .NET meteor 4 with profiler.
Yes, it takes time in layout engines when adding a day's view to the grid (and probably recalculating size).
I have no specific idea how to fix it but I want to play more with this profiler and days init

@yurkinh
Copy link
Owner

yurkinh commented Jan 5, 2024

@FabriBertani Check please latest version(1.1.0)
I have improved performance and have few ideas how to improve it event more but it will require additional refactorings so stay tuned.

@FabriBertani
Copy link
Author

Hey @yurkinh, I've tested it on Android but unfortunately, the issue remains.

@yurkinh
Copy link
Owner

yurkinh commented Jan 5, 2024

@FabriBertani Are you testing it in Release mode?
performance improvements are not finished but I got much better numbers with speedscope including interesting insights where I can improve it even more

@FabriBertani
Copy link
Author

@yurkinh Oh sorry my bad, I hadn't tried it in release mode, it works much better on release mode now.

@yurkinh
Copy link
Owner

yurkinh commented Jan 5, 2024

@FabriBertani Great!
In debug mode Interpreter(needed for the hotreload stuff) is enabled by default hence it will be much slower and won't show true numbers.
While it is much better that it was before I still have a few ideas on how to improve it even more so tuned for the next updates)

@usefulBeeing
Copy link

usefulBeeing commented Jul 14, 2024

Any news about performance optimizations coming soon @yurkinh ?? I can observe this initial lag even with a totally stripped out implementation:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:controls="clr-namespace:Plugin.Maui.Calendar.Controls;assembly=Plugin.Maui.Calendar" 
             xmlns:local="clr-namespace:MauiApp1"
             x:Class="MauiApp1.PageOne">
    
    <controls:Calendar HeaderSectionVisible="False"  />

</ContentPage>

I tried to implement it in a FlyoutItem scenario, once I click on the Calendar item, the lag happens and freezes the Flyout menu midway for a sec. I was able to capture this in a screenshot:

FlyoutCalItem

In VS Output window, I get the following:

[WindowOnBackDispatcher] OnBackInvokedCallback is not enabled for the application.
[WindowOnBackDispatcher] Set 'android:enableOnBackInvokedCallback="true"' in the application manifest.
[EGL_emulation] app_time_stats: avg=135.58ms min=1.61ms max=5320.69ms count=40
[TabLayout] MODE_SCROLLABLE + GRAVITY_FILL is not supported, GRAVITY_START will be used instead
[monodroid-assembly] open_from_bundles: failed to load assembly Plugin.Maui.Calendar.dll
Loaded assembly: /data/data/com.companyname.mauiapp1/files/.override/Plugin.Maui.Calendar.dll [External]
[monodroid-assembly] open_from_bundles: failed to load assembly CommunityToolkit.Mvvm.dll
Loaded assembly: /data/data/com.companyname.mauiapp1/files/.override/CommunityToolkit.Mvvm.dll [External]
[nyname.mauiapp1] Explicit concurrent copying GC freed 4445(337KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 4253KB/8506KB, paused 272us,41us total 9.246ms
[Choreographer] Skipped 33 frames! The application may be doing too much work on its main thread.
[MaterialButton] MaterialButton manages its own background to control elevation, shape, color and states. Consider using backgroundTint, shapeAppearance and other attributes where available. A custom background will ignore these attributes and you should consider handling interaction states such as pressed, focused and disabled
[MaterialButton] MaterialButton manages its own background to control elevation, shape, color and states. Consider using backgroundTint, shapeAppearance and other attributes where available. A custom background will ignore these attributes and you should consider handling interaction states such as pressed, focused and disabled
[MaterialButton] MaterialButton manages its own background to control elevation, shape, color and states. Consider using backgroundTint, shapeAppearance and other attributes where available. A custom background will ignore these attributes and you should consider handling interaction states such as pressed, focused and disabled
[MaterialButton] MaterialButton manages its own background to control elevation, shape, color and states. Consider using backgroundTint, shapeAppearance and other attributes where available. A custom background will ignore these attributes and you should consider handling interaction states such as pressed, focused and disabled
[nyname.mauiapp1] Explicit concurrent copying GC freed 4756(202KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 4783KB/9566KB, paused 387us,48us total 11.374ms
[nyname.mauiapp1] Explicit concurrent copying GC freed 3543(120KB) AllocSpace objects, 1(108KB) LOS objects, 49% free, 5019KB/10038KB, paused 333us,39us total 12.025ms
[Choreographer] Skipped 60 frames! The application may be doing too much work on its main thread.
[EGL_emulation] app_time_stats: avg=1616.77ms min=1616.77ms max=1616.77ms count=1
[OpenGLRenderer] Davey! duration=1609ms; Flags=0, FrameTimelineVsyncId=37453623, IntendedVsync=1898138819349616, Vsync=1898139369349594, InputEventId=0, HandleInputStart=1898139379196380, AnimationStart=1898139379226080, PerformTraversalsStart=1898139379515080, DrawStart=1898140295918680, FrameDeadline=1898138852682948, FrameInterval=1898139378569980, FrameStartTime=16666666, SyncQueued=1898140387040580, SyncStart=1898140387254480, IssueDrawCommandsStart=1898140387662280, SwapBuffers=1898140427279980, FrameCompleted=1898140428822680, DequeueBufferDuration=25100, QueueBufferDuration=248500, GpuCompleted=1898140428010880, SwapBuffersCompleted=1898140428822680, DisplayPresentTime=144115222452438154, CommandSubmissionCompleted=1898140427279980,
[OpenGLRenderer] Davey! duration=1083ms; Flags=0, FrameTimelineVsyncId=37453637, IntendedVsync=1898139386016260, Vsync=1898140386016220, InputEventId=0, HandleInputStart=1898140391760180, AnimationStart=1898140391780480, PerformTraversalsStart=1898140437463780, DrawStart=1898140438257780, FrameDeadline=1898140452682884, FrameInterval=1898140391076880, FrameStartTime=16666666, SyncQueued=1898140463933380, SyncStart=1898140464097780, IssueDrawCommandsStart=1898140464341180, SwapBuffers=1898140467937680, FrameCompleted=1898140469218380, DequeueBufferDuration=19200, QueueBufferDuration=593400, GpuCompleted=1898140469137480, SwapBuffersCompleted=1898140469218380, DisplayPresentTime=0, CommandSubmissionCompleted=1898140467937680,

While doing a little research, I found the following discussions to be interesting:

@yurkinh
Copy link
Owner

yurkinh commented Jul 16, 2024

Hi @usefulBeeing
Are you testing it in Release or debug mode?
Cause in debug mode it will be much - much slower.
I have done a few optimizations since this ticket was opened and plan a few more. Currently, I want first to fix the most critical and urgent issues and then I will come back to the perf optimisations

@usefulBeeing
Copy link

Thank you @yurkinh. Glad to hear you have a plan and not abandoning this great plugin! Except for the lag I described, which happens in both debug and release mode alike, I find your plugin to be very light weight compared to other products I tried in the past.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants