From 663c7917d04a3bfdab464896b38a6657956178eb Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 10 Nov 2015 10:26:06 +0100 Subject: [PATCH 1/3] Changed string.Format to StringBuilder --- .../UriHelper.cs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 28d89de253..02a3356c38 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Text; namespace Microsoft.AspNet.Http.Extensions { @@ -10,6 +11,8 @@ namespace Microsoft.AspNet.Http.Extensions /// public static class UriHelper { + private const string SchemeDelimiter = "://"; + /// /// Combines the given URI components into a string that is properly encoded for use in HTTP headers. /// @@ -48,7 +51,15 @@ namespace Microsoft.AspNet.Http.Extensions FragmentString fragment = new FragmentString()) { string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return $"{scheme}://{host.ToString()}{combinePath}{query.ToString()}{fragment.ToString()}"; + + return new StringBuilder() + .Append(scheme) + .Append(SchemeDelimiter) + .Append(host.ToString()) + .Append(combinePath) + .Append(query.ToString()) + .Append(fragment.ToString()) + .ToString(); } /// @@ -93,7 +104,14 @@ namespace Microsoft.AspNet.Http.Extensions /// public static string GetDisplayUrl(this HttpRequest request) { - return request.Scheme + "://" + request.Host.Value + request.PathBase.Value + request.Path.Value + request.QueryString.Value; + return new StringBuilder() + .Append(request.Scheme) + .Append(SchemeDelimiter) + .Append(request.Host.Value) + .Append(request.PathBase.Value) + .Append(request.Path.Value) + .Append(request.QueryString.Value) + .ToString(); } } } \ No newline at end of file From 7b35b2e1b98bc750ddd6353890421d0213ef22ab Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 10 Nov 2015 11:03:51 +0100 Subject: [PATCH 2/3] Pass length to StringBuilder --- .../UriHelper.cs | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 02a3356c38..4e1d8f7687 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -50,15 +50,22 @@ namespace Microsoft.AspNet.Http.Extensions QueryString query = new QueryString(), FragmentString fragment = new FragmentString()) { - string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; + var combinedPath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return new StringBuilder() + var encodedHost = host.ToString(); + var encodedQuery = query.ToString(); + var encodedFragment = fragment.ToString(); + + var length = scheme.Length + SchemeDelimiter.Length + encodedHost.Length + + combinedPath.Length + encodedQuery.Length + encodedFragment.Length; + + return new StringBuilder(length) .Append(scheme) .Append(SchemeDelimiter) - .Append(host.ToString()) - .Append(combinePath) - .Append(query.ToString()) - .Append(fragment.ToString()) + .Append(encodedHost) + .Append(combinedPath) + .Append(encodedQuery) + .Append(encodedFragment) .ToString(); } @@ -104,13 +111,21 @@ namespace Microsoft.AspNet.Http.Extensions /// public static string GetDisplayUrl(this HttpRequest request) { - return new StringBuilder() + var host = request.Host.Value; + var pathBase = request.PathBase.Value; + var path = request.Path.Value; + var queryString = request.QueryString.Value; + + var length = request.Scheme.Length + SchemeDelimiter.Length + host.Length + + pathBase.Length + path.Length + queryString.Length; + + return new StringBuilder(length) .Append(request.Scheme) .Append(SchemeDelimiter) - .Append(request.Host.Value) - .Append(request.PathBase.Value) - .Append(request.Path.Value) - .Append(request.QueryString.Value) + .Append(host) + .Append(pathBase) + .Append(path) + .Append(queryString) .ToString(); } } From f726b7b5913233f525f7aaf7899e31400446df6a Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 10 Nov 2015 19:55:14 +0100 Subject: [PATCH 3/3] Added PERF comment --- src/Microsoft.AspNet.Http.Extensions/UriHelper.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 4e1d8f7687..f121ffa1d6 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -56,6 +56,7 @@ namespace Microsoft.AspNet.Http.Extensions var encodedQuery = query.ToString(); var encodedFragment = fragment.ToString(); + // PERF: Calculate string length to allocate correct buffer size for StringBuilder. var length = scheme.Length + SchemeDelimiter.Length + encodedHost.Length + combinedPath.Length + encodedQuery.Length + encodedFragment.Length; @@ -116,6 +117,7 @@ namespace Microsoft.AspNet.Http.Extensions var path = request.Path.Value; var queryString = request.QueryString.Value; + // PERF: Calculate string length to allocate correct buffer size for StringBuilder. var length = request.Scheme.Length + SchemeDelimiter.Length + host.Length + pathBase.Length + path.Length + queryString.Length; @@ -129,4 +131,4 @@ namespace Microsoft.AspNet.Http.Extensions .ToString(); } } -} \ No newline at end of file +}