瀏覽代碼

[asp.net] Optimize memory usage a bit. String hashes are cached in thread-local storage.

Marek Habersack 15 年之前
父節點
當前提交
1ed35b4740
共有 1 個文件被更改,包括 20 次插入1 次删除
  1. 20 1
      mcs/class/System.Web/System.Web.Handlers/AssemblyResourceLoader.cs

+ 20 - 1
mcs/class/System.Web/System.Web.Handlers/AssemblyResourceLoader.cs

@@ -66,12 +66,31 @@ namespace System.Web.Handlers
 		static readonly Dictionary <string, AssemblyEmbeddedResources> _embeddedResources = new Dictionary <string, AssemblyEmbeddedResources> (StringComparer.Ordinal);
 		static readonly ReaderWriterLockSlim _embeddedResourcesLock = new ReaderWriterLockSlim ();
 
+		[ThreadStatic]
+		static Dictionary <string, string> stringHashCache;
+
+		static Dictionary <string, string> StringHashCache {
+			get {
+				if (stringHashCache == null)
+					stringHashCache = new Dictionary <string, string> (StringComparer.Ordinal);
+
+				return stringHashCache;
+			}
+		}
+		
 		static string GetStringHash (KeyedHashAlgorithm kha, string str)
 		{
 			if (String.IsNullOrEmpty (str))
 				return String.Empty;
+
+			string result;
+			Dictionary <string, string> cache = StringHashCache;
+			if (cache.TryGetValue (str, out result))
+				return result;
 			
-			return Convert.ToBase64String (kha.ComputeHash (Encoding.UTF8.GetBytes (str)));
+			result = Convert.ToBase64String (kha.ComputeHash (Encoding.UTF8.GetBytes (str)));
+			cache.Add (str, result);
+			return result;
 		}
 		
 		static void InitEmbeddedResourcesUrls (KeyedHashAlgorithm kha, Assembly assembly, string assemblyName, string assemblyHash, AssemblyEmbeddedResources entry)