{"action":"opened","number":117,"pull_request":{"url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/pulls/117","id":62682901,"html_url":"https://github.com/PerfDotNet/BenchmarkDotNet/pull/117","diff_url":"https://github.com/PerfDotNet/BenchmarkDotNet/pull/117.diff","patch_url":"https://github.com/PerfDotNet/BenchmarkDotNet/pull/117.patch","issue_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/issues/117","number":117,"state":"open","locked":false,"title":"Executing single Benchmark for multiple Runtimes [with Diagnoser attached]","user":{"login":"adamsitnik","id":6011991,"avatar_url":"https://avatars.githubusercontent.com/u/6011991?v=3","gravatar_id":"","url":"https://api.github.com/users/adamsitnik","html_url":"https://github.com/adamsitnik","followers_url":"https://api.github.com/users/adamsitnik/followers","following_url":"https://api.github.com/users/adamsitnik/following{/other_user}","gists_url":"https://api.github.com/users/adamsitnik/gists{/gist_id}","starred_url":"https://api.github.com/users/adamsitnik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adamsitnik/subscriptions","organizations_url":"https://api.github.com/users/adamsitnik/orgs","repos_url":"https://api.github.com/users/adamsitnik/repos","events_url":"https://api.github.com/users/adamsitnik/events{/privacy}","received_events_url":"https://api.github.com/users/adamsitnik/received_events","type":"User","site_admin":false},"body":"project.json files allows us to target multiple frameworks. The master process of BenchmarkDotNet always generates, builds and executes new program that executes single benchmark. Master process monitors and parses the output of the the child process. When any diagnoser is used, it also attaches to the child process.\r\n\r\nWhat I have noticed is that the runtime and framework of the child and master process do NOT have to be the same. The only limitation is for some Diagnosers the processor architecture must be the same for both processes.\r\n\r\nSo with project.json files and dotnet cli we can build and execute single program for different runtimes/frameworks configuration. Currently diagnosers do not support Core, but if our master process is not Core, and the child is, then we can simply attach to it (only on Windows) and use existing diagnosers.\r\n\r\nI am not a native english speaker, but I hope that my explanation is good enough to understand it. Please ask questions if something is unclear.\r\n\r\nThe mandatory thing is to set Framework for Runtime.Clr in explicit way. The app that contains the benchmarks must also be targeting all the frameworks. Just like BenchmarkDotNet.Samples does.\r\n\r\nSample config:\r\n```\r\ninternal class MultipleRuntimesConfig : ManualConfig\r\n{\r\n\tpublic MultipleRuntimesConfig()\r\n\t{\r\n\t\tAdd(Job.Default.With(Runtime.Dnx).With(Jit.Host));\r\n\t\tAdd(Job.Default.With(Runtime.Core).With(Jit.Host));\r\n\t\tAdd(Job.Default.With(Runtime.Clr).With(Jit.Host).With(Jobs.Framework.V40));\r\n\t}\r\n}\r\n```\r\n\r\nSample results:\r\n![image](https://cloud.githubusercontent.com/assets/6011991/13699089/78ab047c-e778-11e5-9218-3bc274f25d02.png)\r\n\r\nSample results for GCDiagnoser:\r\n![image](https://cloud.githubusercontent.com/assets/6011991/13731279/6666e210-e965-11e5-92bd-666fe4cc8872.png)","created_at":"2016-03-13T20:52:35Z","updated_at":"2016-03-13T20:52:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"90fa9e13e0706a6bbdf5bd54cc6dcdc33d1f9efc","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/pulls/117/commits","review_comments_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/pulls/117/comments","review_comment_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/pulls/comments{/number}","comments_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/issues/117/comments","statuses_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/statuses/2f6c7c41db551a5614197f5735578158aee6802e","head":{"label":"adamsitnik:develop","ref":"develop","sha":"2f6c7c41db551a5614197f5735578158aee6802e","user":{"login":"adamsitnik","id":6011991,"avatar_url":"https://avatars.githubusercontent.com/u/6011991?v=3","gravatar_id":"","url":"https://api.github.com/users/adamsitnik","html_url":"https://github.com/adamsitnik","followers_url":"https://api.github.com/users/adamsitnik/followers","following_url":"https://api.github.com/users/adamsitnik/following{/other_user}","gists_url":"https://api.github.com/users/adamsitnik/gists{/gist_id}","starred_url":"https://api.github.com/users/adamsitnik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adamsitnik/subscriptions","organizations_url":"https://api.github.com/users/adamsitnik/orgs","repos_url":"https://api.github.com/users/adamsitnik/repos","events_url":"https://api.github.com/users/adamsitnik/events{/privacy}","received_events_url":"https://api.github.com/users/adamsitnik/received_events","type":"User","site_admin":false},"repo":{"id":40985887,"name":"BenchmarkDotNet","full_name":"adamsitnik/BenchmarkDotNet","owner":{"login":"adamsitnik","id":6011991,"avatar_url":"https://avatars.githubusercontent.com/u/6011991?v=3","gravatar_id":"","url":"https://api.github.com/users/adamsitnik","html_url":"https://github.com/adamsitnik","followers_url":"https://api.github.com/users/adamsitnik/followers","following_url":"https://api.github.com/users/adamsitnik/following{/other_user}","gists_url":"https://api.github.com/users/adamsitnik/gists{/gist_id}","starred_url":"https://api.github.com/users/adamsitnik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adamsitnik/subscriptions","organizations_url":"https://api.github.com/users/adamsitnik/orgs","repos_url":"https://api.github.com/users/adamsitnik/repos","events_url":"https://api.github.com/users/adamsitnik/events{/privacy}","received_events_url":"https://api.github.com/users/adamsitnik/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/adamsitnik/BenchmarkDotNet","description":" .NET library for benchmarking","fork":true,"url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet","forks_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/forks","keys_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/keys{/key_id}","collaborators_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/teams","hooks_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/hooks","issue_events_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/issues/events{/number}","events_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/events","assignees_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/assignees{/user}","branches_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/branches{/branch}","tags_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/tags","blobs_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/git/refs{/sha}","trees_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/git/trees{/sha}","statuses_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/statuses/{sha}","languages_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/languages","stargazers_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/stargazers","contributors_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/contributors","subscribers_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/subscribers","subscription_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/subscription","commits_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/commits{/sha}","git_commits_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/git/commits{/sha}","comments_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/comments{/number}","issue_comment_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/issues/comments{/number}","contents_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/contents/{+path}","compare_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/compare/{base}...{head}","merges_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/merges","archive_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/downloads","issues_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/issues{/number}","pulls_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/pulls{/number}","milestones_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/milestones{/number}","notifications_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/labels{/name}","releases_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/releases{/id}","deployments_url":"https://api.github.com/repos/adamsitnik/BenchmarkDotNet/deployments","created_at":"2015-08-18T17:11:13Z","updated_at":"2016-01-19T18:03:07Z","pushed_at":"2016-03-13T20:24:04Z","git_url":"git://github.com/adamsitnik/BenchmarkDotNet.git","ssh_url":"git@github.com:adamsitnik/BenchmarkDotNet.git","clone_url":"https://github.com/adamsitnik/BenchmarkDotNet.git","svn_url":"https://github.com/adamsitnik/BenchmarkDotNet","homepage":"https://www.nuget.org/packages/BenchmarkDotNet/","size":4505,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"PerfDotNet:develop","ref":"develop","sha":"a4d0b85d8b9358b0d4f421e6c332b9d649099212","user":{"login":"PerfDotNet","id":12517848,"avatar_url":"https://avatars.githubusercontent.com/u/12517848?v=3","gravatar_id":"","url":"https://api.github.com/users/PerfDotNet","html_url":"https://github.com/PerfDotNet","followers_url":"https://api.github.com/users/PerfDotNet/followers","following_url":"https://api.github.com/users/PerfDotNet/following{/other_user}","gists_url":"https://api.github.com/users/PerfDotNet/gists{/gist_id}","starred_url":"https://api.github.com/users/PerfDotNet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PerfDotNet/subscriptions","organizations_url":"https://api.github.com/users/PerfDotNet/orgs","repos_url":"https://api.github.com/users/PerfDotNet/repos","events_url":"https://api.github.com/users/PerfDotNet/events{/privacy}","received_events_url":"https://api.github.com/users/PerfDotNet/received_events","type":"Organization","site_admin":false},"repo":{"id":12191244,"name":"BenchmarkDotNet","full_name":"PerfDotNet/BenchmarkDotNet","owner":{"login":"PerfDotNet","id":12517848,"avatar_url":"https://avatars.githubusercontent.com/u/12517848?v=3","gravatar_id":"","url":"https://api.github.com/users/PerfDotNet","html_url":"https://github.com/PerfDotNet","followers_url":"https://api.github.com/users/PerfDotNet/followers","following_url":"https://api.github.com/users/PerfDotNet/following{/other_user}","gists_url":"https://api.github.com/users/PerfDotNet/gists{/gist_id}","starred_url":"https://api.github.com/users/PerfDotNet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PerfDotNet/subscriptions","organizations_url":"https://api.github.com/users/PerfDotNet/orgs","repos_url":"https://api.github.com/users/PerfDotNet/repos","events_url":"https://api.github.com/users/PerfDotNet/events{/privacy}","received_events_url":"https://api.github.com/users/PerfDotNet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/PerfDotNet/BenchmarkDotNet","description":"Powerful .NET library for benchmarking","fork":false,"url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet","forks_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/forks","keys_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/teams","hooks_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/hooks","issue_events_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/issues/events{/number}","events_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/events","assignees_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/assignees{/user}","branches_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/branches{/branch}","tags_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/tags","blobs_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/git/refs{/sha}","trees_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/statuses/{sha}","languages_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/languages","stargazers_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/stargazers","contributors_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/contributors","subscribers_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/subscribers","subscription_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/subscription","commits_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/commits{/sha}","git_commits_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/git/commits{/sha}","comments_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/comments{/number}","issue_comment_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/issues/comments{/number}","contents_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/contents/{+path}","compare_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/merges","archive_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/downloads","issues_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/issues{/number}","pulls_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/pulls{/number}","milestones_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/milestones{/number}","notifications_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/labels{/name}","releases_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/releases{/id}","deployments_url":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/deployments","created_at":"2013-08-18T06:17:48Z","updated_at":"2016-03-13T17:49:38Z","pushed_at":"2016-03-13T20:52:35Z","git_url":"git://github.com/PerfDotNet/BenchmarkDotNet.git","ssh_url":"git@github.com:PerfDotNet/BenchmarkDotNet.git","clone_url":"https://github.com/PerfDotNet/BenchmarkDotNet.git","svn_url":"https://github.com/PerfDotNet/BenchmarkDotNet","homepage":"https://www.nuget.org/packages/BenchmarkDotNet/","size":4618,"stargazers_count":848,"watchers_count":848,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":61,"mirror_url":null,"open_issues_count":38,"forks":61,"open_issues":38,"watchers":848,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/pulls/117"},"html":{"href":"https://github.com/PerfDotNet/BenchmarkDotNet/pull/117"},"issue":{"href":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/issues/117"},"comments":{"href":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/issues/117/comments"},"review_comments":{"href":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/pulls/117/comments"},"review_comment":{"href":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/pulls/117/commits"},"statuses":{"href":"https://api.github.com/repos/PerfDotNet/BenchmarkDotNet/statuses/2f6c7c41db551a5614197f5735578158aee6802e"}},"merged":false,"mergeable":true,"mergeable_state":"clean","merged_by":null,"comments":0,"review_comments":0,"commits":2,"additions":188,"deletions":47,"changed_files":11}}