[英]effective string.Intern from Guid
Rider 动态程序分析显示,以下代码行重复分配总共约 338MB。
Guid subscriptionId = .....
var s = string.Intern(subscriptionId.ToString());
这只是强类型 ID 的片段,值一遍又一遍地重复,所以我猜只有很少的唯一值,这就是为什么 string.Intern
荒谬的是,我需要先将 Guid 转换为字符串(它分配该内存)以发现该字符串已被实习并立即使用该实习生。 在我看来,这就像浪费分配。
有没有办法从字符的 Guid/span 获取 string.Intern?
有没有办法从字符的 Guid/span 获取 string.Intern?
理论上,是的。 您可以遍历实习池中的所有string
值,将它们解析为Guid
值,并将任何成功解析的值与您想要字符串的Guid
值进行比较。 .NET 不提供从实习池中检索string
值的直接方法,但您可以查看例如是否可以读取实习池中的所有字符串? 获取有关您如何仍能完成该任务的信息(本质上,它涉及在运行时从内部调试您自己的程序)。
我希望你能看到,即使你不必为了从实习池中获取string
值的集合而跳过流程自省循环,也可以通过实习池进行线性搜索以找到与你对应的那个Guid
值不会提高性能。
另一方面,您可以使用Dictionary<Guid, string>
自己缓存string
值:
Dictionary<Guid, string> guidCache = new Dictionary<Guid, string>();
Guid subscriptionId = .....
if (!guidCache.TryGetValue(subscriptionId, out string s))
{
s = subscriptionId.ToString();
guidCache[subscriptionId] = s;
}
对于像这样简单的事情,上面应该就足够了。 但是,如果您需要更精细的缓存方案,.NET 现在包含您可以使用的MemoryCache
class。
综上所述,我怀疑是否真的有任何需要。 .NET 针对小对象的频繁分配进行了优化; 这不应该是一个实际的问题。 据推测,一旦有任何显着的 memory 压力(在现代机器上可能永远不会,这取决于程序正在做什么,但同样,这不应该成为问题),就会收集 338MB。
我怀疑您每次需要string
值时都可以在Guid
值上调用ToString()
,这样就可以了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.