{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/comments/43002830","id":43002830,"diff_hunk":"@@ -232,114 +229,92 @@ internal static bool HasIllegalCharacters(string path, bool checkAdditional = fa\n         /// <summary>\n         /// Only check for ? and *.\n         /// </summary>\n-        internal static bool HasAdditionalIllegalCharacters(string path)\n+        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n+        internal unsafe static bool HasAdditionalIllegalCharacters(string path)\n         {\n             int startIndex = PathInternal.IsExtended(path) ? ExtendedPathPrefix.Length : 0;\n-            return path.IndexOfAny(AdditionalInvalidPathChars, startIndex) >= 0;\n+\n+            char currentChar;\n+            for (int i = startIndex; i < path.Length; i++)\n+            {\n+                currentChar = path[i];\n+                if (currentChar == '*' || currentChar == '?') return true;\n+            }\n+            return false;","path":"src/Common/src/System/IO/PathInternal.Windows.cs","position":45,"original_position":45,"commit_id":"8105a1e41933d624cccc0b8add16bad3eabb22ec","original_commit_id":"8105a1e41933d624cccc0b8add16bad3eabb22ec","user":{"login":"stephentoub","id":2642209,"avatar_url":"https://avatars.githubusercontent.com/u/2642209?v=3","gravatar_id":"","url":"https://api.github.com/users/stephentoub","html_url":"https://github.com/stephentoub","followers_url":"https://api.github.com/users/stephentoub/followers","following_url":"https://api.github.com/users/stephentoub/following{/other_user}","gists_url":"https://api.github.com/users/stephentoub/gists{/gist_id}","starred_url":"https://api.github.com/users/stephentoub/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stephentoub/subscriptions","organizations_url":"https://api.github.com/users/stephentoub/orgs","repos_url":"https://api.github.com/users/stephentoub/repos","events_url":"https://api.github.com/users/stephentoub/events{/privacy}","received_events_url":"https://api.github.com/users/stephentoub/received_events","type":"User","site_admin":false},"body":"@ianhays made the opposite change at https://github.com/dotnet/corefx/pull/3516 in the name of improved performance.  Before we change this and go back and forth on what's most efficient for this case, can the two of you confer and understand what you're doing differently in your benchmarks?","created_at":"2015-10-26T14:52:46Z","updated_at":"2015-10-26T14:52:46Z","html_url":"https://github.com/dotnet/corefx/pull/3992#discussion_r43002830","pull_request_url":"https://api.github.com/repos/dotnet/corefx/pulls/3992","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments/43002830"},"html":{"href":"https://github.com/dotnet/corefx/pull/3992#discussion_r43002830"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3992"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/3992","id":48236079,"html_url":"https://github.com/dotnet/corefx/pull/3992","diff_url":"https://github.com/dotnet/corefx/pull/3992.diff","patch_url":"https://github.com/dotnet/corefx/pull/3992.patch","issue_url":"https://api.github.com/repos/dotnet/corefx/issues/3992","number":3992,"state":"open","locked":false,"title":"Avoid StringBuilder interop perf","user":{"login":"JeremyKuhne","id":8184940,"avatar_url":"https://avatars.githubusercontent.com/u/8184940?v=3","gravatar_id":"","url":"https://api.github.com/users/JeremyKuhne","html_url":"https://github.com/JeremyKuhne","followers_url":"https://api.github.com/users/JeremyKuhne/followers","following_url":"https://api.github.com/users/JeremyKuhne/following{/other_user}","gists_url":"https://api.github.com/users/JeremyKuhne/gists{/gist_id}","starred_url":"https://api.github.com/users/JeremyKuhne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JeremyKuhne/subscriptions","organizations_url":"https://api.github.com/users/JeremyKuhne/orgs","repos_url":"https://api.github.com/users/JeremyKuhne/repos","events_url":"https://api.github.com/users/JeremyKuhne/events{/privacy}","received_events_url":"https://api.github.com/users/JeremyKuhne/received_events","type":"User","site_admin":false},"body":"Creates an internal buffer specifically for interop purposes (NativeBuffer/StringBuffer).\r\nCaching is implicit, disposing will return the buffer to the cache immediately.\r\nBuffers resize implicitly and utilize new (non depreciated) heap APIs (which handle content\r\ncopying if needed). Buffers do not zero memory for added perf.\r\nStringBuffer can copy directly with strings and other StringBuffers.\r\n\r\nSome StringBuilder perf/functionality issues for interop:\r\n- Does not pin, but could if unchunked (creating 4x allocations for out strings with P/Invoke)\r\n- Does not allow fast copying between StringBuilders\r\n- Does not allow indexing in to skip characters with P/Invoke (char* + offset)\r\n- Cannot compare substrings without allocating or walking char indexing\r\n- Difficult to split null separated string arrays (common in Win32)\r\n- Capacity is actually +1 (doesn't include the null), most Win32 APIs want count + null\r\n\r\nStart moving String/StringBuilder/StringBuffer path internal helper methods to use core\r\nchar* helper for longer methods. Keep StringBuffer overloads in a separate file to\r\nallow inclusion just with interoping projects.","created_at":"2015-10-20T18:02:34Z","updated_at":"2015-10-26T14:52:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3784b95e4191a0e70e28246aa1c01b2a91961bc1","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/corefx/pulls/3992/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx/pulls/3992/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx/issues/3992/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/8105a1e41933d624cccc0b8add16bad3eabb22ec","head":{"label":"JeremyKuhne:StringBuffer","ref":"StringBuffer","sha":"8105a1e41933d624cccc0b8add16bad3eabb22ec","user":{"login":"JeremyKuhne","id":8184940,"avatar_url":"https://avatars.githubusercontent.com/u/8184940?v=3","gravatar_id":"","url":"https://api.github.com/users/JeremyKuhne","html_url":"https://github.com/JeremyKuhne","followers_url":"https://api.github.com/users/JeremyKuhne/followers","following_url":"https://api.github.com/users/JeremyKuhne/following{/other_user}","gists_url":"https://api.github.com/users/JeremyKuhne/gists{/gist_id}","starred_url":"https://api.github.com/users/JeremyKuhne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JeremyKuhne/subscriptions","organizations_url":"https://api.github.com/users/JeremyKuhne/orgs","repos_url":"https://api.github.com/users/JeremyKuhne/repos","events_url":"https://api.github.com/users/JeremyKuhne/events{/privacy}","received_events_url":"https://api.github.com/users/JeremyKuhne/received_events","type":"User","site_admin":false},"repo":{"id":30339123,"name":"corefx","full_name":"JeremyKuhne/corefx","owner":{"login":"JeremyKuhne","id":8184940,"avatar_url":"https://avatars.githubusercontent.com/u/8184940?v=3","gravatar_id":"","url":"https://api.github.com/users/JeremyKuhne","html_url":"https://github.com/JeremyKuhne","followers_url":"https://api.github.com/users/JeremyKuhne/followers","following_url":"https://api.github.com/users/JeremyKuhne/following{/other_user}","gists_url":"https://api.github.com/users/JeremyKuhne/gists{/gist_id}","starred_url":"https://api.github.com/users/JeremyKuhne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JeremyKuhne/subscriptions","organizations_url":"https://api.github.com/users/JeremyKuhne/orgs","repos_url":"https://api.github.com/users/JeremyKuhne/repos","events_url":"https://api.github.com/users/JeremyKuhne/events{/privacy}","received_events_url":"https://api.github.com/users/JeremyKuhne/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/JeremyKuhne/corefx","description":"This repo contains the foundational libraries that make up the .NET Core development stack.","fork":true,"url":"https://api.github.com/repos/JeremyKuhne/corefx","forks_url":"https://api.github.com/repos/JeremyKuhne/corefx/forks","keys_url":"https://api.github.com/repos/JeremyKuhne/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JeremyKuhne/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JeremyKuhne/corefx/teams","hooks_url":"https://api.github.com/repos/JeremyKuhne/corefx/hooks","issue_events_url":"https://api.github.com/repos/JeremyKuhne/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/JeremyKuhne/corefx/events","assignees_url":"https://api.github.com/repos/JeremyKuhne/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/JeremyKuhne/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/JeremyKuhne/corefx/tags","blobs_url":"https://api.github.com/repos/JeremyKuhne/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JeremyKuhne/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JeremyKuhne/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/JeremyKuhne/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JeremyKuhne/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/JeremyKuhne/corefx/languages","stargazers_url":"https://api.github.com/repos/JeremyKuhne/corefx/stargazers","contributors_url":"https://api.github.com/repos/JeremyKuhne/corefx/contributors","subscribers_url":"https://api.github.com/repos/JeremyKuhne/corefx/subscribers","subscription_url":"https://api.github.com/repos/JeremyKuhne/corefx/subscription","commits_url":"https://api.github.com/repos/JeremyKuhne/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/JeremyKuhne/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/JeremyKuhne/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/JeremyKuhne/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/JeremyKuhne/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/JeremyKuhne/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JeremyKuhne/corefx/merges","archive_url":"https://api.github.com/repos/JeremyKuhne/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JeremyKuhne/corefx/downloads","issues_url":"https://api.github.com/repos/JeremyKuhne/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/JeremyKuhne/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/JeremyKuhne/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/JeremyKuhne/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JeremyKuhne/corefx/labels{/name}","releases_url":"https://api.github.com/repos/JeremyKuhne/corefx/releases{/id}","created_at":"2015-02-05T05:16:58Z","updated_at":"2015-05-08T20:58:22Z","pushed_at":"2015-10-26T01:42:11Z","git_url":"git://github.com/JeremyKuhne/corefx.git","ssh_url":"git@github.com:JeremyKuhne/corefx.git","clone_url":"https://github.com/JeremyKuhne/corefx.git","svn_url":"https://github.com/JeremyKuhne/corefx","homepage":"","size":37409,"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":"dotnet:master","ref":"master","sha":"534ef3d25c010d910c7b791b06f9d41060ddbcf5","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":26295345,"name":"corefx","full_name":"dotnet/corefx","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others.","fork":false,"url":"https://api.github.com/repos/dotnet/corefx","forks_url":"https://api.github.com/repos/dotnet/corefx/forks","keys_url":"https://api.github.com/repos/dotnet/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/corefx/teams","hooks_url":"https://api.github.com/repos/dotnet/corefx/hooks","issue_events_url":"https://api.github.com/repos/dotnet/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/corefx/events","assignees_url":"https://api.github.com/repos/dotnet/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/corefx/tags","blobs_url":"https://api.github.com/repos/dotnet/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/corefx/languages","stargazers_url":"https://api.github.com/repos/dotnet/corefx/stargazers","contributors_url":"https://api.github.com/repos/dotnet/corefx/contributors","subscribers_url":"https://api.github.com/repos/dotnet/corefx/subscribers","subscription_url":"https://api.github.com/repos/dotnet/corefx/subscription","commits_url":"https://api.github.com/repos/dotnet/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/corefx/merges","archive_url":"https://api.github.com/repos/dotnet/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/corefx/downloads","issues_url":"https://api.github.com/repos/dotnet/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/corefx/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/corefx/releases{/id}","created_at":"2014-11-06T23:42:48Z","updated_at":"2015-10-26T13:49:38Z","pushed_at":"2015-10-26T12:34:00Z","git_url":"git://github.com/dotnet/corefx.git","ssh_url":"git@github.com:dotnet/corefx.git","clone_url":"https://github.com/dotnet/corefx.git","svn_url":"https://github.com/dotnet/corefx","homepage":"http://dotnet.github.io/core/","size":86877,"stargazers_count":8489,"watchers_count":8489,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1863,"mirror_url":null,"open_issues_count":670,"forks":1863,"open_issues":670,"watchers":8489,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3992"},"html":{"href":"https://github.com/dotnet/corefx/pull/3992"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx/issues/3992"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx/issues/3992/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3992/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3992/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx/statuses/8105a1e41933d624cccc0b8add16bad3eabb22ec"}}}}