API 初始使用期间 ReactiveUI 性能下降

ReactiveUI slow performance during initial use of the API

我刚开始为我的 Xamarin Android 和 iOS 项目使用 ReactiveUI。我注意到我的 Android 使用 ReactiveUI 的片段最初需要很长时间才能加载。例如,在我的应用程序中第一次调用 ReactiveCommand.Create 时,大约需要 250 毫秒。第一次调用 OneWayBind、WhenAny、BindCommand 时类似的事情。但是,如果我再次重新实例化视图和视图模型,这些方法 return 几乎立即(< 3 毫秒)。

public ReactiveCommand<Unit, Unit> ButtonCommand { get; }


System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();

ButtonCommand = ReactiveCommand.Create(() => Console.WriteLine("test"));

long test = sw.ElapsedMilliseconds;
Console.WriteLine(test);

为了解决这个问题,我在启动画面期间随机调用主线程中的 ReactiveUI API。我是否错过了我在文档中错过的 ReactiveUI 初始化步骤?还有其他人有这个问题吗?这是 Android,我还没试过 iOS。

更新 感谢格伦的回复,你是对的。我将尝试调查我的项目设置是否正确。视图模型位于 .NET Standard 2.0 项目中,该项目具有 ReactiveUI 和 Fody 包引用。我的 Android 项目和 Android 库有 ReactiveUI 和 RxUI.AndroidSupport。以下是调用 ReactiveCommand.Create 时的日志。不确定为什么它甚至正在探测 WinForm、WPF、XamForms...

06-30 17:39:39.178 I/mono-stdout(28083): XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - start
06-30 17:39:39.222 D/Mono    (28083): Loading reference 1 of System.Core.dll asmctx DEFAULT, looking for System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.222 D/Mono    (28083): Assembly Ref addref System.Core[0x7c76e09880] -> System[0x7c76dbbf80]: 8
06-30 17:39:39.239 D/Mono    (28083): Loading reference 0 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/Splat.dll asmctx DEFAULT, looking for mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.239 D/Mono    (28083): Assembly Ref addref Splat[0x7cd15ab900] -> mscorlib[0x7cd15a1480]: 29
06-30 17:39:39.244 D/Mono    (28083): Loading reference 4 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/Splat.dll asmctx DEFAULT, looking for System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.244 D/Mono    (28083): Assembly Ref addref Splat[0x7cd15ab900] -> System.Core[0x7c76e09880]: 6
06-30 17:39:39.284 D/Mono    (28083): Loading reference 3 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/ReactiveUI.dll asmctx DEFAULT, looking for System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.284 D/Mono    (28083): Assembly Ref addref ReactiveUI[0x7cd15ab600] -> System.Core[0x7c76e09880]: 7
06-30 17:39:39.287 D/Mono    (28083): Loading reference 2 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/Splat.dll asmctx DEFAULT, looking for System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.287 D/Mono    (28083): Assembly Ref addref Splat[0x7cd15ab900] -> System[0x7c76dbbf80]: 9
06-30 17:39:39.294 D/Mono    (28083): Loading reference 7 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/ReactiveUI.dll asmctx DEFAULT, looking for Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065
06-30 17:39:39.294 D/Mono    (28083): Assembly Ref addref ReactiveUI[0x7cd15ab600] -> Mono.Android[0x7c76dbbd00]: 17
06-30 17:39:39.347 D/Mono    (28083): DllImport searching in: '__Internal' ('(null)').
06-30 17:39:39.347 D/Mono    (28083): Searching for 'java_interop_jnienv_call_long_method_a'.
06-30 17:39:39.347 D/Mono    (28083): Probing 'java_interop_jnienv_call_long_method_a'.
06-30 17:39:39.347 D/Mono    (28083): Found as 'java_interop_jnienv_call_long_method_a'.
06-30 17:39:39.360 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.XamForms.dll'.
06-30 17:39:39.360 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.XamForms.exe'.
06-30 17:39:39.366 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Winforms.dll'.
06-30 17:39:39.366 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Winforms.exe'.
06-30 17:39:39.367 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Wpf.dll'.
06-30 17:39:39.367 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Wpf.exe'.
06-30 17:39:39.368 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Uno.dll'.
06-30 17:39:39.368 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Uno.exe'.
06-30 17:39:39.489 I/mono-stdout(28083): XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - end
06-30 17:39:39.490 I/mono-stdout(28083): Elapsed 323

目前 RxUI 加载依赖 DLL 的方式是使用以下 class.

它有一个硬编码字符串列表,与我们拥有的 NuGet 包的 DLL 相匹配。然后它将尝试加载列表中列出的 DLL,然后如果找到,运行 IWantsToRegisterStuff 接口包含在 class.

我相信你的速度变慢是因为这个 DLL 注册。

作为此工作的一部分,计划很快就会替换 task 计划是为了让您在 DLL 包的命名空间中针对 RxApp 实例调用 Init 方法。这项工作将出现在 ReactiveUI 11 中。