{"action":"created","comment":{"url":"https://api.github.com/repos/aspnet/Mvc/pulls/comments/60980216","id":60980216,"diff_hunk":"@@ -74,15 +74,15 @@ public RazorPageFactoryResult CreateFactory(string relativePath)\n         /// <summary>\n         /// Creates a factory for <see cref=\"IRazorPage\"/>.\n         /// </summary>\n-        /// <param name=\"compiledType\">The <see cref=\"Type\"/> to produce an instance of <see cref=\"IRazorPage\"/>\n+        /// <param name=\"pageCreate\">The <see cref=\"Func{Object}\"/> to produce an instance of <see cref=\"IRazorPage\"/>\n         /// from.</param>\n         /// <param name=\"relativePath\">The application relative path of the page.</param>\n-        /// <returns>A factory for <paramref name=\"compiledType\"/>.</returns>\n-        protected virtual Func<IRazorPage> GetPageFactory(Type compiledType, string relativePath)\n+        /// <returns>A factory for <see cref=\"IRazorPage\"/>.</returns>\n+        protected virtual Func<IRazorPage> GetPageFactory(Func<object> pageCreate, string relativePath)\n         {\n             return () =>\n             {\n-                var page = (IRazorPage)Activator.CreateInstance(compiledType);\n+                var page = (IRazorPage)pageCreate();\n                 page.Path = relativePath;\n                 return page;\n             };","path":"src/Microsoft.AspNetCore.Mvc.Razor/Internal/DefaultRazorPageFactoryProvider.cs","position":28,"original_position":28,"commit_id":"f97be3c681d894b8d99398d3ce3be0e330401edc","original_commit_id":"f97be3c681d894b8d99398d3ce3be0e330401edc","user":{"login":"rynowak","id":1430011,"avatar_url":"https://avatars.githubusercontent.com/u/1430011?v=3","gravatar_id":"","url":"https://api.github.com/users/rynowak","html_url":"https://github.com/rynowak","followers_url":"https://api.github.com/users/rynowak/followers","following_url":"https://api.github.com/users/rynowak/following{/other_user}","gists_url":"https://api.github.com/users/rynowak/gists{/gist_id}","starred_url":"https://api.github.com/users/rynowak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rynowak/subscriptions","organizations_url":"https://api.github.com/users/rynowak/orgs","repos_url":"https://api.github.com/users/rynowak/repos","events_url":"https://api.github.com/users/rynowak/events{/privacy}","received_events_url":"https://api.github.com/users/rynowak/received_events","type":"User","site_admin":false},"body":"/cc @pranavkm - should we simplify this further now that the compilation result has a `Func<object>`","created_at":"2016-04-25T20:13:38Z","updated_at":"2016-04-25T20:13:38Z","html_url":"https://github.com/aspnet/Mvc/pull/4524#discussion_r60980216","pull_request_url":"https://api.github.com/repos/aspnet/Mvc/pulls/4524","_links":{"self":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/comments/60980216"},"html":{"href":"https://github.com/aspnet/Mvc/pull/4524#discussion_r60980216"},"pull_request":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/4524"}}},"pull_request":{"url":"https://api.github.com/repos/aspnet/Mvc/pulls/4524","id":67586290,"html_url":"https://github.com/aspnet/Mvc/pull/4524","diff_url":"https://github.com/aspnet/Mvc/pull/4524.diff","patch_url":"https://github.com/aspnet/Mvc/pull/4524.patch","issue_url":"https://api.github.com/repos/aspnet/Mvc/issues/4524","number":4524,"state":"open","locked":false,"title":"[Perf] Replace Activator.CreateInstance with cached delegate","user":{"login":"mnltejaswini","id":8011073,"avatar_url":"https://avatars.githubusercontent.com/u/8011073?v=3","gravatar_id":"","url":"https://api.github.com/users/mnltejaswini","html_url":"https://github.com/mnltejaswini","followers_url":"https://api.github.com/users/mnltejaswini/followers","following_url":"https://api.github.com/users/mnltejaswini/following{/other_user}","gists_url":"https://api.github.com/users/mnltejaswini/gists{/gist_id}","starred_url":"https://api.github.com/users/mnltejaswini/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mnltejaswini/subscriptions","organizations_url":"https://api.github.com/users/mnltejaswini/orgs","repos_url":"https://api.github.com/users/mnltejaswini/repos","events_url":"https://api.github.com/users/mnltejaswini/events{/privacy}","received_events_url":"https://api.github.com/users/mnltejaswini/received_events","type":"User","site_admin":false},"body":"Fixes #4470 \r\nPlaces that are fixed are \r\n1. ControllerActionExecutor.cs(61):\r\n2.DefaultRazorPageFactoryProvider.cs\r\n3.ComplexTypeModelBinder.cs(348):\r\n4.CollectionModelBinder.cs(150):\r\n\r\n1. Benefit in using the cached delegate in .DefaultRazorPageFactoryProvider.cs\r\nScenario: https://github.com/aspnet/Performance/tree/dev/testapp/HelloWorldMvc \r\nBefore Optimization\r\n--------------------------\r\n![image](https://cloud.githubusercontent.com/assets/8011073/14792823/fbbc40d0-0ad0-11e6-92e8-57c6146fe87c.png)\r\n\r\n\r\nAfter Optimization\r\n-----------------------\r\n\r\n![image](https://cloud.githubusercontent.com/assets/8011073/14793013/e9d08fa6-0ad1-11e6-8339-11039f7f4a92.png)\r\n\r\n\r\n2. Benefit in using cached delegate in ComplexTypeModelBinder.cs and ControllerActionExecutor.cs(61):\r\nScenario: https://github.com/aspnet/Performance/tree/dev/testapp/BigModelBinding (slight change in the controller to accept a value type argument with no default value)\r\n\r\nBefore Optimization\r\n-------------------------\r\n![image](https://cloud.githubusercontent.com/assets/8011073/14792787/c293e0a6-0ad0-11e6-91db-38d14b00fb52.png)\r\n\r\nAfter Optimization\r\n------------------------\r\n![image](https://cloud.githubusercontent.com/assets/8011073/14792799/d104b2c8-0ad0-11e6-98d4-8c6320a494f1.png)\r\n\r\n\r\nIn most cases, we do invoke default constructor which is relatively inexpensive as compared to parameterized constructors. However, Activator does have a ActivatorCache with size limit as 16. With large number of views or arguments/models there is a possibility of not hitting the cache and going through the slow path of security checks etc. This fix proactively prevents those costs.","created_at":"2016-04-22T23:30:34Z","updated_at":"2016-04-25T20:13:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"99aed55f5ec333ee4aa4226983509ab622defead","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/aspnet/Mvc/pulls/4524/commits","review_comments_url":"https://api.github.com/repos/aspnet/Mvc/pulls/4524/comments","review_comment_url":"https://api.github.com/repos/aspnet/Mvc/pulls/comments{/number}","comments_url":"https://api.github.com/repos/aspnet/Mvc/issues/4524/comments","statuses_url":"https://api.github.com/repos/aspnet/Mvc/statuses/f97be3c681d894b8d99398d3ce3be0e330401edc","head":{"label":"aspnet:naduggar/Issue4470","ref":"naduggar/Issue4470","sha":"f97be3c681d894b8d99398d3ce3be0e330401edc","user":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"repo":{"id":15126429,"name":"Mvc","full_name":"aspnet/Mvc","owner":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/aspnet/Mvc","description":"ASP.NET Core MVC is a model view controller framework for building dynamic web sites with clean separation of concerns, including the merged MVC, Web API, and Web Pages w/ Razor.","fork":false,"url":"https://api.github.com/repos/aspnet/Mvc","forks_url":"https://api.github.com/repos/aspnet/Mvc/forks","keys_url":"https://api.github.com/repos/aspnet/Mvc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aspnet/Mvc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aspnet/Mvc/teams","hooks_url":"https://api.github.com/repos/aspnet/Mvc/hooks","issue_events_url":"https://api.github.com/repos/aspnet/Mvc/issues/events{/number}","events_url":"https://api.github.com/repos/aspnet/Mvc/events","assignees_url":"https://api.github.com/repos/aspnet/Mvc/assignees{/user}","branches_url":"https://api.github.com/repos/aspnet/Mvc/branches{/branch}","tags_url":"https://api.github.com/repos/aspnet/Mvc/tags","blobs_url":"https://api.github.com/repos/aspnet/Mvc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aspnet/Mvc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aspnet/Mvc/git/refs{/sha}","trees_url":"https://api.github.com/repos/aspnet/Mvc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aspnet/Mvc/statuses/{sha}","languages_url":"https://api.github.com/repos/aspnet/Mvc/languages","stargazers_url":"https://api.github.com/repos/aspnet/Mvc/stargazers","contributors_url":"https://api.github.com/repos/aspnet/Mvc/contributors","subscribers_url":"https://api.github.com/repos/aspnet/Mvc/subscribers","subscription_url":"https://api.github.com/repos/aspnet/Mvc/subscription","commits_url":"https://api.github.com/repos/aspnet/Mvc/commits{/sha}","git_commits_url":"https://api.github.com/repos/aspnet/Mvc/git/commits{/sha}","comments_url":"https://api.github.com/repos/aspnet/Mvc/comments{/number}","issue_comment_url":"https://api.github.com/repos/aspnet/Mvc/issues/comments{/number}","contents_url":"https://api.github.com/repos/aspnet/Mvc/contents/{+path}","compare_url":"https://api.github.com/repos/aspnet/Mvc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aspnet/Mvc/merges","archive_url":"https://api.github.com/repos/aspnet/Mvc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aspnet/Mvc/downloads","issues_url":"https://api.github.com/repos/aspnet/Mvc/issues{/number}","pulls_url":"https://api.github.com/repos/aspnet/Mvc/pulls{/number}","milestones_url":"https://api.github.com/repos/aspnet/Mvc/milestones{/number}","notifications_url":"https://api.github.com/repos/aspnet/Mvc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aspnet/Mvc/labels{/name}","releases_url":"https://api.github.com/repos/aspnet/Mvc/releases{/id}","deployments_url":"https://api.github.com/repos/aspnet/Mvc/deployments","created_at":"2013-12-12T03:54:00Z","updated_at":"2016-04-25T17:34:19Z","pushed_at":"2016-04-25T20:04:35Z","git_url":"git://github.com/aspnet/Mvc.git","ssh_url":"git@github.com:aspnet/Mvc.git","clone_url":"https://github.com/aspnet/Mvc.git","svn_url":"https://github.com/aspnet/Mvc","homepage":"","size":54515,"stargazers_count":2995,"watchers_count":2995,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1201,"mirror_url":null,"open_issues_count":324,"forks":1201,"open_issues":324,"watchers":2995,"default_branch":"dev"}},"base":{"label":"aspnet:dev","ref":"dev","sha":"74a74fb3a8ca9742fdeb4f7a30816e20cf783050","user":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"repo":{"id":15126429,"name":"Mvc","full_name":"aspnet/Mvc","owner":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/aspnet/Mvc","description":"ASP.NET Core MVC is a model view controller framework for building dynamic web sites with clean separation of concerns, including the merged MVC, Web API, and Web Pages w/ Razor.","fork":false,"url":"https://api.github.com/repos/aspnet/Mvc","forks_url":"https://api.github.com/repos/aspnet/Mvc/forks","keys_url":"https://api.github.com/repos/aspnet/Mvc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aspnet/Mvc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aspnet/Mvc/teams","hooks_url":"https://api.github.com/repos/aspnet/Mvc/hooks","issue_events_url":"https://api.github.com/repos/aspnet/Mvc/issues/events{/number}","events_url":"https://api.github.com/repos/aspnet/Mvc/events","assignees_url":"https://api.github.com/repos/aspnet/Mvc/assignees{/user}","branches_url":"https://api.github.com/repos/aspnet/Mvc/branches{/branch}","tags_url":"https://api.github.com/repos/aspnet/Mvc/tags","blobs_url":"https://api.github.com/repos/aspnet/Mvc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aspnet/Mvc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aspnet/Mvc/git/refs{/sha}","trees_url":"https://api.github.com/repos/aspnet/Mvc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aspnet/Mvc/statuses/{sha}","languages_url":"https://api.github.com/repos/aspnet/Mvc/languages","stargazers_url":"https://api.github.com/repos/aspnet/Mvc/stargazers","contributors_url":"https://api.github.com/repos/aspnet/Mvc/contributors","subscribers_url":"https://api.github.com/repos/aspnet/Mvc/subscribers","subscription_url":"https://api.github.com/repos/aspnet/Mvc/subscription","commits_url":"https://api.github.com/repos/aspnet/Mvc/commits{/sha}","git_commits_url":"https://api.github.com/repos/aspnet/Mvc/git/commits{/sha}","comments_url":"https://api.github.com/repos/aspnet/Mvc/comments{/number}","issue_comment_url":"https://api.github.com/repos/aspnet/Mvc/issues/comments{/number}","contents_url":"https://api.github.com/repos/aspnet/Mvc/contents/{+path}","compare_url":"https://api.github.com/repos/aspnet/Mvc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aspnet/Mvc/merges","archive_url":"https://api.github.com/repos/aspnet/Mvc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aspnet/Mvc/downloads","issues_url":"https://api.github.com/repos/aspnet/Mvc/issues{/number}","pulls_url":"https://api.github.com/repos/aspnet/Mvc/pulls{/number}","milestones_url":"https://api.github.com/repos/aspnet/Mvc/milestones{/number}","notifications_url":"https://api.github.com/repos/aspnet/Mvc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aspnet/Mvc/labels{/name}","releases_url":"https://api.github.com/repos/aspnet/Mvc/releases{/id}","deployments_url":"https://api.github.com/repos/aspnet/Mvc/deployments","created_at":"2013-12-12T03:54:00Z","updated_at":"2016-04-25T17:34:19Z","pushed_at":"2016-04-25T20:04:35Z","git_url":"git://github.com/aspnet/Mvc.git","ssh_url":"git@github.com:aspnet/Mvc.git","clone_url":"https://github.com/aspnet/Mvc.git","svn_url":"https://github.com/aspnet/Mvc","homepage":"","size":54515,"stargazers_count":2995,"watchers_count":2995,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1201,"mirror_url":null,"open_issues_count":324,"forks":1201,"open_issues":324,"watchers":2995,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/4524"},"html":{"href":"https://github.com/aspnet/Mvc/pull/4524"},"issue":{"href":"https://api.github.com/repos/aspnet/Mvc/issues/4524"},"comments":{"href":"https://api.github.com/repos/aspnet/Mvc/issues/4524/comments"},"review_comments":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/4524/comments"},"review_comment":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/4524/commits"},"statuses":{"href":"https://api.github.com/repos/aspnet/Mvc/statuses/f97be3c681d894b8d99398d3ce3be0e330401edc"}}}}