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
我刚开始为我的 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