diff --git a/.gitignore b/.gitignore
index 642b10ac0c..7560c1805a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,3 +56,6 @@ src/BenchmarkDotNet/Disassemblers/net461/*
# Cake
tools/**
.dotnet
+
+# Xamarin
+Resource.designer.cs
\ No newline at end of file
diff --git a/BenchmarkDotNet.Xamarin.sln b/BenchmarkDotNet.Xamarin.sln
new file mode 100644
index 0000000000..3ec33b36d6
--- /dev/null
+++ b/BenchmarkDotNet.Xamarin.sln
@@ -0,0 +1,125 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29920.165
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkDotNet", "src\BenchmarkDotNet\BenchmarkDotNet.csproj", "{6A3481EC-78A3-4A2E-994D-ED16778D83BB}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkDotNet.Samples.Forms", "samples\BenchmarkDotNet.Samples.Forms\BenchmarkDotNet.Samples.Forms.csproj", "{34358E9C-7048-43F5-AA66-4F9060081178}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BenchmarkDotNet.Samples.Android", "samples\BenchmarkDotNet.Samples.Android\BenchmarkDotNet.Samples.Android.csproj", "{F8547E13-AE77-44CC-9F1D-1717921C4B86}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BenchmarkDotNet.Samples.iOS", "samples\BenchmarkDotNet.Samples.iOS\BenchmarkDotNet.Samples.iOS.csproj", "{0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkDotNet.Disassembler.x64", "src\BenchmarkDotNet.Disassembler.x64\BenchmarkDotNet.Disassembler.x64.csproj", "{78BD1D11-7841-4079-8ED7-CD253A71FD33}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkDotNet.Disassembler.x86", "src\BenchmarkDotNet.Disassembler.x86\BenchmarkDotNet.Disassembler.x86.csproj", "{6E54F07F-5B12-465A-ADA2-39879DB704C1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkDotNet.Annotations", "src\BenchmarkDotNet.Annotations\BenchmarkDotNet.Annotations.csproj", "{FA360486-97B1-4BA9-BCB2-78F86EA0F881}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|Any CPU = Release|Any CPU
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Release|iPhone.Build.0 = Release|Any CPU
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {6A3481EC-78A3-4A2E-994D-ED16778D83BB}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Release|Any CPU.Build.0 = Release|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Release|iPhone.Build.0 = Release|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {34358E9C-7048-43F5-AA66-4F9060081178}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Debug|iPhone.Deploy.0 = Debug|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Release|iPhone.Build.0 = Release|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Release|iPhone.Deploy.0 = Release|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}.Debug|Any CPU.ActiveCfg = Debug|iPhone
+ {0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}.Debug|iPhone.Build.0 = Debug|iPhone
+ {0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}.Release|iPhone.ActiveCfg = Release|iPhone
+ {0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}.Release|iPhone.Build.0 = Release|iPhone
+ {0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Release|Any CPU.Build.0 = Release|Any CPU
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Release|iPhone.Build.0 = Release|Any CPU
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {78BD1D11-7841-4079-8ED7-CD253A71FD33}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Release|iPhone.Build.0 = Release|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {6E54F07F-5B12-465A-ADA2-39879DB704C1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Release|iPhone.Build.0 = Release|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {FA360486-97B1-4BA9-BCB2-78F86EA0F881}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {36B462DE-57CC-423E-855A-F3B19FE99549}
+ EndGlobalSection
+EndGlobal
diff --git a/docs/articles/samples/IntroXamarin.md b/docs/articles/samples/IntroXamarin.md
new file mode 100644
index 0000000000..4484063e97
--- /dev/null
+++ b/docs/articles/samples/IntroXamarin.md
@@ -0,0 +1,29 @@
+---
+uid: BenchmarkDotNet.Samples.Xamarin
+---
+
+## Sample: IntroXamarin
+
+To use BenchmarkDotNet with Xamarin, you will need to build a small UI for running Benchmarks and displaying the results so you can actually read them.
+Using [Xamarin.Forms](https://dotnet.microsoft.com/apps/xamarin/xamarin-forms) is a simple way to be able to run your benchmarks on iOS or Android.
+
+Other notes:
+
+* Use `Release` builds when running actual benchmarks.
+* Disable the linker via the `Don't Link` or `None`.
+
+### Source code
+
+[!code-csharp[MainPage.xaml.cs](../../../samples/BenchmarkDotNet.Samples.Forms/MainPage.xaml.cs)]
+
+### Output
+
+
+
+### Links
+
+* [Xamarin.Android linker settings](https://docs.microsoft.com/xamarin/android/deploy-test/linker#linker-behavior)
+* [Xamarin.iOS linker settings](https://docs.microsoft.com/xamarin/ios/deploy-test/linker#dont-link)
+* The permanent link to this sample: @BenchmarkDotNet.Samples.Xamarin
+
+---
\ No newline at end of file
diff --git a/docs/images/xamarin-screenshot.png b/docs/images/xamarin-screenshot.png
new file mode 100644
index 0000000000..fb9670de10
Binary files /dev/null and b/docs/images/xamarin-screenshot.png differ
diff --git a/samples/BenchmarkDotNet.Samples.Android/BenchmarkDotNet.Samples.Android.csproj b/samples/BenchmarkDotNet.Samples.Android/BenchmarkDotNet.Samples.Android.csproj
new file mode 100644
index 0000000000..b49ff23616
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Android/BenchmarkDotNet.Samples.Android.csproj
@@ -0,0 +1,97 @@
+
+
+
+ Debug
+ AnyCPU
+ {F8547E13-AE77-44CC-9F1D-1717921C4B86}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {c9e5eea5-ca05-42a1-839b-61506e0a37df}
+ Library
+ BenchmarkDotNet.Samples.Forms.Droid
+ BenchmarkDotNet.Samples.Forms.Android
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Properties\AndroidManifest.xml
+ Resources
+ Assets
+ false
+ v9.0
+ true
+ true
+ Xamarin.Android.Net.AndroidClientHandler
+
+
+
+
+ true
+ portable
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+
+
+ true
+ portable
+ true
+ bin\Release
+ prompt
+ 4
+ true
+ false
+ armeabi-v7a;x86;x86_64;arm64-v8a
+ None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {EF54613D-8A3D-42DB-BF98-AD95C582FEF3}
+ BenchmarkDotNet.Samples.Forms
+
+
+
+
\ No newline at end of file
diff --git a/samples/BenchmarkDotNet.Samples.Android/MainActivity.cs b/samples/BenchmarkDotNet.Samples.Android/MainActivity.cs
new file mode 100644
index 0000000000..de4472c639
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Android/MainActivity.cs
@@ -0,0 +1,33 @@
+using System;
+
+using Android.App;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+namespace BenchmarkDotNet.Samples.Forms.Droid
+{
+ [Activity(Label = "BenchmarkDotNet.Samples.Forms", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
+ public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
+ {
+ protected override void OnCreate(Bundle savedInstanceState)
+ {
+ TabLayoutResource = Resource.Layout.Tabbar;
+ ToolbarResource = Resource.Layout.Toolbar;
+
+ base.OnCreate(savedInstanceState);
+
+ Xamarin.Essentials.Platform.Init(this, savedInstanceState);
+ global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
+ LoadApplication(new App());
+ }
+ public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
+ {
+ Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
+
+ base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/BenchmarkDotNet.Samples.Android/Properties/AndroidManifest.xml b/samples/BenchmarkDotNet.Samples.Android/Properties/AndroidManifest.xml
new file mode 100644
index 0000000000..54785ba51b
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/samples/BenchmarkDotNet.Samples.Android/Properties/AssemblyInfo.cs b/samples/BenchmarkDotNet.Samples.Android/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..07737969cd
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,34 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using Android.App;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BenchmarkDotNet.Samples.Forms.Android")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("BenchmarkDotNet.Samples.Forms.Android")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: ComVisible(false)]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+
+// Add some common permissions, these can be removed if not needed
+[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
+[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/layout/Tabbar.xml b/samples/BenchmarkDotNet.Samples.Android/Resources/layout/Tabbar.xml
new file mode 100644
index 0000000000..ad1f87d817
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Android/Resources/layout/Tabbar.xml
@@ -0,0 +1,11 @@
+
+
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/layout/Toolbar.xml b/samples/BenchmarkDotNet.Samples.Android/Resources/layout/Toolbar.xml
new file mode 100644
index 0000000000..aabd0a3b74
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Android/Resources/layout/Toolbar.xml
@@ -0,0 +1,9 @@
+
+
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-anydpi-v26/icon.xml b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-anydpi-v26/icon.xml
new file mode 100644
index 0000000000..88d1d0a16c
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-anydpi-v26/icon.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-anydpi-v26/icon_round.xml b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-anydpi-v26/icon_round.xml
new file mode 100644
index 0000000000..88d1d0a16c
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-anydpi-v26/icon_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-hdpi/icon.png b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-hdpi/icon.png
new file mode 100644
index 0000000000..4623ca2c42
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-hdpi/icon.png differ
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-hdpi/launcher_foreground.png b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-hdpi/launcher_foreground.png
new file mode 100644
index 0000000000..a89e5bbce6
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-hdpi/launcher_foreground.png differ
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-mdpi/icon.png b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-mdpi/icon.png
new file mode 100644
index 0000000000..9b1d25e25d
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-mdpi/icon.png differ
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-mdpi/launcher_foreground.png b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-mdpi/launcher_foreground.png
new file mode 100644
index 0000000000..431a8a053d
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-mdpi/launcher_foreground.png differ
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xhdpi/icon.png b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xhdpi/icon.png
new file mode 100644
index 0000000000..844dfe544e
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xhdpi/icon.png differ
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xhdpi/launcher_foreground.png b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xhdpi/launcher_foreground.png
new file mode 100644
index 0000000000..9e9e4f8e4c
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xhdpi/launcher_foreground.png differ
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxhdpi/icon.png b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxhdpi/icon.png
new file mode 100644
index 0000000000..e20ec9ae22
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxhdpi/icon.png differ
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxhdpi/launcher_foreground.png b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxhdpi/launcher_foreground.png
new file mode 100644
index 0000000000..5f1e1356eb
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxhdpi/launcher_foreground.png differ
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxxhdpi/icon.png b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxxhdpi/icon.png
new file mode 100644
index 0000000000..8a08bf75e7
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxxhdpi/icon.png differ
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png
new file mode 100644
index 0000000000..aca9f8d1c0
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png differ
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/values/colors.xml b/samples/BenchmarkDotNet.Samples.Android/Resources/values/colors.xml
new file mode 100644
index 0000000000..d9f6e0baf9
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Android/Resources/values/colors.xml
@@ -0,0 +1,7 @@
+
+
+ #FFFFFF
+ #3F51B5
+ #303F9F
+ #FF4081
+
diff --git a/samples/BenchmarkDotNet.Samples.Android/Resources/values/styles.xml b/samples/BenchmarkDotNet.Samples.Android/Resources/values/styles.xml
new file mode 100644
index 0000000000..17a2eb0e97
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Android/Resources/values/styles.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
diff --git a/samples/BenchmarkDotNet.Samples.Forms/App.xaml b/samples/BenchmarkDotNet.Samples.Forms/App.xaml
new file mode 100644
index 0000000000..31593fa9ed
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Forms/App.xaml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/BenchmarkDotNet.Samples.Forms/App.xaml.cs b/samples/BenchmarkDotNet.Samples.Forms/App.xaml.cs
new file mode 100644
index 0000000000..ae28171078
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Forms/App.xaml.cs
@@ -0,0 +1,16 @@
+using System;
+using Xamarin.Forms;
+using Xamarin.Forms.Xaml;
+
+namespace BenchmarkDotNet.Samples.Forms
+{
+ public partial class App : Application
+ {
+ public App()
+ {
+ InitializeComponent();
+
+ MainPage = new MainPage();
+ }
+ }
+}
diff --git a/samples/BenchmarkDotNet.Samples.Forms/AssemblyInfo.cs b/samples/BenchmarkDotNet.Samples.Forms/AssemblyInfo.cs
new file mode 100644
index 0000000000..c859952e34
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Forms/AssemblyInfo.cs
@@ -0,0 +1,3 @@
+using Xamarin.Forms.Xaml;
+
+[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
\ No newline at end of file
diff --git a/samples/BenchmarkDotNet.Samples.Forms/BenchmarkDotNet.Samples.Forms.csproj b/samples/BenchmarkDotNet.Samples.Forms/BenchmarkDotNet.Samples.Forms.csproj
new file mode 100644
index 0000000000..ddec326433
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Forms/BenchmarkDotNet.Samples.Forms.csproj
@@ -0,0 +1,22 @@
+
+
+
+ netstandard2.0
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/BenchmarkDotNet.Samples.Forms/MainPage.xaml b/samples/BenchmarkDotNet.Samples.Forms/MainPage.xaml
new file mode 100644
index 0000000000..80f1caa3ba
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Forms/MainPage.xaml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/BenchmarkDotNet.Samples.Forms/MainPage.xaml.cs b/samples/BenchmarkDotNet.Samples.Forms/MainPage.xaml.cs
new file mode 100644
index 0000000000..b686d4d673
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.Forms/MainPage.xaml.cs
@@ -0,0 +1,62 @@
+using BenchmarkDotNet.Analysers;
+using BenchmarkDotNet.Exporters;
+using BenchmarkDotNet.Loggers;
+using BenchmarkDotNet.Running;
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using Xamarin.Forms;
+
+namespace BenchmarkDotNet.Samples.Forms
+{
+ public partial class MainPage : ContentPage
+ {
+ public MainPage()
+ {
+ InitializeComponent();
+ }
+
+ async void Button_Clicked(object sender, EventArgs e)
+ {
+ SetIsRunning(true);
+ try
+ {
+ var logger = new AccumulationLogger();
+ await Task.Run(() =>
+ {
+ var summary = BenchmarkRunner.Run();
+ MarkdownExporter.Console.ExportToLog(summary, logger);
+ ConclusionHelper.Print(logger,
+ summary.BenchmarksCases
+ .SelectMany(benchmark => benchmark.Config.GetCompositeAnalyser().Analyse(summary))
+ .Distinct()
+ .ToList());
+ });
+ SetSummary(logger.GetLog());
+ }
+ catch (Exception exc)
+ {
+ await DisplayAlert("Error", exc.Message, "Ok");
+ }
+ finally
+ {
+ SetIsRunning(false);
+ }
+ }
+
+ void SetIsRunning(bool isRunning)
+ {
+ Indicator.IsRunning = isRunning;
+ Run.IsVisible =
+ Summary.IsVisible = !isRunning;
+ }
+
+ void SetSummary(string text)
+ {
+ Summary.Text = text;
+ var size = Summary.Measure(double.MaxValue, double.MaxValue).Request;
+ Summary.WidthRequest = size.Width;
+ Summary.HeightRequest = size.Height;
+ }
+ }
+}
diff --git a/samples/BenchmarkDotNet.Samples.iOS/AppDelegate.cs b/samples/BenchmarkDotNet.Samples.iOS/AppDelegate.cs
new file mode 100644
index 0000000000..2589df72e9
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.iOS/AppDelegate.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace BenchmarkDotNet.Samples.Forms.iOS
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register("AppDelegate")]
+ public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
+ {
+ //
+ // This method is invoked when the application has loaded and is ready to run. In this
+ // method you should instantiate the window, load the UI into it and then make the window
+ // visible.
+ //
+ // You have 17 seconds to return from this method, or iOS will terminate your application.
+ //
+ public override bool FinishedLaunching(UIApplication app, NSDictionary options)
+ {
+ global::Xamarin.Forms.Forms.Init();
+ LoadApplication(new App());
+
+ return base.FinishedLaunching(app, options);
+ }
+ }
+}
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000000..98f4d035c8
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,117 @@
+{
+ "images": [
+ {
+ "scale": "2x",
+ "size": "20x20",
+ "idiom": "iphone",
+ "filename": "Icon40.png"
+ },
+ {
+ "scale": "3x",
+ "size": "20x20",
+ "idiom": "iphone",
+ "filename": "Icon60.png"
+ },
+ {
+ "scale": "2x",
+ "size": "29x29",
+ "idiom": "iphone",
+ "filename": "Icon58.png"
+ },
+ {
+ "scale": "3x",
+ "size": "29x29",
+ "idiom": "iphone",
+ "filename": "Icon87.png"
+ },
+ {
+ "scale": "2x",
+ "size": "40x40",
+ "idiom": "iphone",
+ "filename": "Icon80.png"
+ },
+ {
+ "scale": "3x",
+ "size": "40x40",
+ "idiom": "iphone",
+ "filename": "Icon120.png"
+ },
+ {
+ "scale": "2x",
+ "size": "60x60",
+ "idiom": "iphone",
+ "filename": "Icon120.png"
+ },
+ {
+ "scale": "3x",
+ "size": "60x60",
+ "idiom": "iphone",
+ "filename": "Icon180.png"
+ },
+ {
+ "scale": "1x",
+ "size": "20x20",
+ "idiom": "ipad",
+ "filename": "Icon20.png"
+ },
+ {
+ "scale": "2x",
+ "size": "20x20",
+ "idiom": "ipad",
+ "filename": "Icon40.png"
+ },
+ {
+ "scale": "1x",
+ "size": "29x29",
+ "idiom": "ipad",
+ "filename": "Icon29.png"
+ },
+ {
+ "scale": "2x",
+ "size": "29x29",
+ "idiom": "ipad",
+ "filename": "Icon58.png"
+ },
+ {
+ "scale": "1x",
+ "size": "40x40",
+ "idiom": "ipad",
+ "filename": "Icon40.png"
+ },
+ {
+ "scale": "2x",
+ "size": "40x40",
+ "idiom": "ipad",
+ "filename": "Icon80.png"
+ },
+ {
+ "scale": "1x",
+ "size": "76x76",
+ "idiom": "ipad",
+ "filename": "Icon76.png"
+ },
+ {
+ "scale": "2x",
+ "size": "76x76",
+ "idiom": "ipad",
+ "filename": "Icon152.png"
+ },
+ {
+ "scale": "2x",
+ "size": "83.5x83.5",
+ "idiom": "ipad",
+ "filename": "Icon167.png"
+ },
+ {
+ "scale": "1x",
+ "size": "1024x1024",
+ "idiom": "ios-marketing",
+ "filename": "Icon1024.png"
+ }
+ ],
+ "properties": {},
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png
new file mode 100644
index 0000000000..9174c989a9
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png
new file mode 100644
index 0000000000..9c60a1761d
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png
new file mode 100644
index 0000000000..448d6efb57
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png
new file mode 100644
index 0000000000..8524768f8d
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png
new file mode 100644
index 0000000000..60a64703c0
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png
new file mode 100644
index 0000000000..45268a641c
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png
new file mode 100644
index 0000000000..6a6c77a8b4
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png
new file mode 100644
index 0000000000..cc7edcf5cb
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png
new file mode 100644
index 0000000000..1ad04f004b
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png
new file mode 100644
index 0000000000..2dd52620a8
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png
new file mode 100644
index 0000000000..b058cae2f4
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png
new file mode 100644
index 0000000000..02e47a2611
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png
new file mode 100644
index 0000000000..4954a4bd33
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/BenchmarkDotNet.Samples.iOS.csproj b/samples/BenchmarkDotNet.Samples.iOS/BenchmarkDotNet.Samples.iOS.csproj
new file mode 100644
index 0000000000..5a67c5d154
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.iOS/BenchmarkDotNet.Samples.iOS.csproj
@@ -0,0 +1,135 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ 8.0.30703
+ 2.0
+ {0A63C8A0-F7EB-47D7-8057-0C87C77C02A4}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {6143fdea-f3c2-4a09-aafa-6e230626515e}
+ Exe
+ BenchmarkDotNet.Samples.Forms.iOS
+ Resources
+ BenchmarkDotNet.Samples.Forms.iOS
+ true
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG
+ prompt
+ 4
+ x86_64
+ None
+ true
+
+
+ none
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ None
+ x86_64
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG
+ prompt
+ 4
+ ARM64
+ iPhone Developer
+ true
+ Entitlements.plist
+ None
+ -all
+
+
+ none
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ ARM64
+ iPhone Developer
+ Entitlements.plist
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {EF54613D-8A3D-42DB-BF98-AD95C582FEF3}
+ BenchmarkDotNet.Samples.Forms
+
+
+
\ No newline at end of file
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Entitlements.plist b/samples/BenchmarkDotNet.Samples.iOS/Entitlements.plist
new file mode 100644
index 0000000000..9ae599370b
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.iOS/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Info.plist b/samples/BenchmarkDotNet.Samples.iOS/Info.plist
new file mode 100644
index 0000000000..7e1c9196e5
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.iOS/Info.plist
@@ -0,0 +1,38 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ MinimumOSVersion
+ 8.0
+ CFBundleDisplayName
+ BenchmarkDotNet.Samples
+ CFBundleIdentifier
+ com.benchmarkdotnet.samples
+ CFBundleVersion
+ 1.0
+ UILaunchStoryboardName
+ LaunchScreen
+ CFBundleName
+ BenchmarkDotNet.Samples.Forms
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+
+
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Main.cs b/samples/BenchmarkDotNet.Samples.iOS/Main.cs
new file mode 100644
index 0000000000..7ee87d5830
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.iOS/Main.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace BenchmarkDotNet.Samples.Forms.iOS
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Properties/AssemblyInfo.cs b/samples/BenchmarkDotNet.Samples.iOS/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..281fd261bb
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.iOS/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BenchmarkDotNet.Samples.Forms.iOS")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("BenchmarkDotNet.Samples.Forms.iOS")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Resources/Default-568h@2x.png b/samples/BenchmarkDotNet.Samples.iOS/Resources/Default-568h@2x.png
new file mode 100644
index 0000000000..26c6461e50
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Resources/Default-568h@2x.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Resources/Default-Portrait.png b/samples/BenchmarkDotNet.Samples.iOS/Resources/Default-Portrait.png
new file mode 100644
index 0000000000..5d0d1ab4c6
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Resources/Default-Portrait.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Resources/Default-Portrait@2x.png b/samples/BenchmarkDotNet.Samples.iOS/Resources/Default-Portrait@2x.png
new file mode 100644
index 0000000000..0ee2688e8f
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Resources/Default-Portrait@2x.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Resources/Default.png b/samples/BenchmarkDotNet.Samples.iOS/Resources/Default.png
new file mode 100644
index 0000000000..b74643c0aa
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Resources/Default.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Resources/Default@2x.png b/samples/BenchmarkDotNet.Samples.iOS/Resources/Default@2x.png
new file mode 100644
index 0000000000..dbd6bd3e86
Binary files /dev/null and b/samples/BenchmarkDotNet.Samples.iOS/Resources/Default@2x.png differ
diff --git a/samples/BenchmarkDotNet.Samples.iOS/Resources/LaunchScreen.storyboard b/samples/BenchmarkDotNet.Samples.iOS/Resources/LaunchScreen.storyboard
new file mode 100644
index 0000000000..a639c2f1a5
--- /dev/null
+++ b/samples/BenchmarkDotNet.Samples.iOS/Resources/LaunchScreen.storyboard
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/BenchmarkDotNet/Configs/DefaultConfig.cs b/src/BenchmarkDotNet/Configs/DefaultConfig.cs
index 5f5933e9b5..98f79665ae 100644
--- a/src/BenchmarkDotNet/Configs/DefaultConfig.cs
+++ b/src/BenchmarkDotNet/Configs/DefaultConfig.cs
@@ -77,7 +77,18 @@ public IEnumerable GetValidators()
public SummaryStyle SummaryStyle => SummaryStyle.Default;
- public string ArtifactsPath => Path.Combine(Directory.GetCurrentDirectory(), "BenchmarkDotNet.Artifacts");
+ public string ArtifactsPath
+ {
+ get
+ {
+ var root = Directory.GetCurrentDirectory();
+ if (root == "/")
+ {
+ root = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
+ }
+ return Path.Combine(root, "BenchmarkDotNet.Artifacts");
+ }
+ }
public IEnumerable GetJobs() => Array.Empty();
diff --git a/src/BenchmarkDotNet/Environments/Runtimes/MonoRuntime.cs b/src/BenchmarkDotNet/Environments/Runtimes/MonoRuntime.cs
index ba73051940..e849bcdd02 100644
--- a/src/BenchmarkDotNet/Environments/Runtimes/MonoRuntime.cs
+++ b/src/BenchmarkDotNet/Environments/Runtimes/MonoRuntime.cs
@@ -13,8 +13,14 @@ public class MonoRuntime : Runtime, IEquatable
public string MonoBclPath { get; }
+ public bool IsXamarinAndroid { get; }
+
+ public bool IsXamariniOS { get; }
+
private MonoRuntime(string name) : base(RuntimeMoniker.Mono, "mono", name)
{
+ IsXamarinAndroid = Type.GetType("Java.Lang.Object, Mono.Android") != null;
+ IsXamariniOS = !IsXamarinAndroid && Type.GetType("Foundation.NSObject, Xamarin.iOS") != null;
}
public MonoRuntime(string name, string customPath) : this(name) => CustomPath = customPath;
diff --git a/src/BenchmarkDotNet/Helpers/ConsoleExitHandler.cs b/src/BenchmarkDotNet/Helpers/ConsoleExitHandler.cs
index b038ba51f3..6fe273626c 100644
--- a/src/BenchmarkDotNet/Helpers/ConsoleExitHandler.cs
+++ b/src/BenchmarkDotNet/Helpers/ConsoleExitHandler.cs
@@ -23,14 +23,28 @@ internal ConsoleExitHandler(Process process, ILogger logger)
private void Attach()
{
process.Exited += ProcessOnExited;
- Console.CancelKeyPress += CancelKeyPressHandlerCallback;
+ try
+ {
+ Console.CancelKeyPress += CancelKeyPressHandlerCallback;
+ }
+ catch (PlatformNotSupportedException)
+ {
+ // Thrown when running in Xamarin
+ }
AppDomain.CurrentDomain.ProcessExit += ProcessExitEventHandlerHandlerCallback;
}
private void Detach()
{
process.Exited -= ProcessOnExited;
- Console.CancelKeyPress -= CancelKeyPressHandlerCallback;
+ try
+ {
+ Console.CancelKeyPress -= CancelKeyPressHandlerCallback;
+ }
+ catch (PlatformNotSupportedException)
+ {
+ // Thrown when running in Xamarin
+ }
AppDomain.CurrentDomain.ProcessExit -= ProcessExitEventHandlerHandlerCallback;
}
diff --git a/src/BenchmarkDotNet/Toolchains/Toolchain.cs b/src/BenchmarkDotNet/Toolchains/Toolchain.cs
index a980dff45c..0e9da89bb8 100644
--- a/src/BenchmarkDotNet/Toolchains/Toolchain.cs
+++ b/src/BenchmarkDotNet/Toolchains/Toolchain.cs
@@ -37,7 +37,7 @@ public virtual bool IsSupported(BenchmarkCase benchmarkCase, ILogger logger, IRe
return false;
}
- if (runtime is MonoRuntime mono)
+ if (runtime is MonoRuntime mono && !benchmarkCase.GetToolchain().IsInProcess)
{
if (string.IsNullOrEmpty(mono.CustomPath) && !HostEnvironmentInfo.GetCurrent().IsMonoInstalled.Value)
{
diff --git a/src/BenchmarkDotNet/Toolchains/ToolchainExtensions.cs b/src/BenchmarkDotNet/Toolchains/ToolchainExtensions.cs
index 1525883bf3..8008321f07 100644
--- a/src/BenchmarkDotNet/Toolchains/ToolchainExtensions.cs
+++ b/src/BenchmarkDotNet/Toolchains/ToolchainExtensions.cs
@@ -6,7 +6,9 @@
using BenchmarkDotNet.Running;
using BenchmarkDotNet.Toolchains.CoreRt;
using BenchmarkDotNet.Toolchains.CsProj;
+using BenchmarkDotNet.Toolchains.InProcess;
using BenchmarkDotNet.Toolchains.InProcess.Emit;
+using BenchmarkDotNet.Toolchains.InProcess.NoEmit;
using BenchmarkDotNet.Toolchains.Mono;
using BenchmarkDotNet.Toolchains.Roslyn;
@@ -39,6 +41,10 @@ internal static IToolchain GetToolchain(this Runtime runtime, Descriptor descrip
return RoslynToolchain.Instance;
case MonoRuntime mono:
+ if (mono.IsXamarinAndroid)
+ return InProcessEmitToolchain.Instance;
+ if (mono.IsXamariniOS)
+ return InProcessNoEmitToolchain.Instance;
if (!string.IsNullOrEmpty(mono.AotArgs))
return MonoAotToolchain.Instance;