c# - 类型转换成本?

标签 c# caching casting

我在 Dictionary<string, Dictionary<string, string>> 中有一个由哈希 (ID) 映射的键/值对称为 id2key_value。您可以将此视为一种用行表示类似数据库的表的方法。

我添加了一些辅助函数来通过强制转换来简化一些基本数据类型的使用,比如

public int GetInt(string id, string key)
{
    int value = 0;
    bool success = int.TryParse(map[id][key], out value);

    if (success)
        return value;
    else
        throw new InvalidOperationException(
            "Trying to obtain a non-integer value with GetInt().");
}

好吧,当我想出一个“cast-cache”的想法时,我认为我很聪明,它基本上保存了已经解析的对象,所以我可以跳过对 int、bool、DateTime 等字符串的解析,并且只需将它们从缓存中转换为适当的数据类型。喜欢,
public int GetInt(string id, string key)
{
    if (cast_cache.ContainsKey(id) && cast_cache[id].ContainsKey(key))
        return (int) cast_cache[id][key];

    int value = 0;
    bool success = int.TryParse(map[id][key], out value);

    if (success)
    {
        this.AddToCache(id, key, value);

        return value;
    }
    else
        throw new InvalidOperationException(
            "Trying to obtain a non-integer value with GetInt().");
}

“cast-cache”就是 Dictionary<string, Dictionary<string, object>> .

所以,我做了一些性能测试,将 10000 个整数添加到 map 中。然后我做了一百万次随机检索,有和没有“cast-caching”。

没有缓存需要 495(ms),而使用缓存需要 490(ms)。我还使用 DateTime 进行了测试,差异更显着,但比我预期的要小(~750(ms)非缓存与~500(ms)缓存)。

(显然)不了解强制转换的原理,此操作的成本有多大以及为什么性能与从字符串“反序列化”的性能如此接近?

最佳答案

由于您没有触摸对象本身(您只是更改指向该对象的引用),因此大多数人似乎认为类型转换要快得多。

您应该避免强制转换的主要原因之一是,当您进行强制转换时,您会避开类型安全并将潜在的执行时错误引入应用程序。我很少会考虑类型转换是一个性能问题。

作为旁注,我将确保您在缓存中测试引用类型和值类型,以确保不会因任何值类型的装箱和拆箱而导致性能损失。

装箱的性能损失来自这样一个事实:将值类型转换为对象确实涉及的不仅仅是更改引用,因为值类型必须复制到堆中。此外,使用装箱值类型将取消装箱引用类型,然后再次将这些值从堆复制到堆栈。

关于c# - 类型转换成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1289664/

相关文章:

ios - 如何在swift中定期清除NSCache?

c - 从 int、float、char、double 进行类型转换

c# - 强制转换 C# 参数?

c# - 将一些属性复制到新的构造函数中

c# - 奇怪的 String.Format() - 输入字符串的格式不正确

android - 清除 Phonegap android 上的用户数据或清除缓存

c# - 如何在 ADO.NET Entity Framework 上执行 "select count(*)"

c# - 如果 ON HEAP 和 OFF HEAP 内存已满,则将条目逐出磁盘 APACHE IGNITE

c# - 重新抛出错误的堆栈跟踪

c# - .NET EF 6 复数形式,表名称中带有前缀