【问题标题】:GetType() == type performanceGetType() == 类型性能
【发布时间】:2011-11-09 09:11:53
【问题描述】:

我正在制作 XNA 游戏,每次更新我都会调用以下代码 2 到 20 次。我尝试了谷歌搜索,这似乎是半慢的,所以我只是想问一下是否有更快的方法来比较类型?

代码:

    public Modifier this[Type type]
    {
        get
        {
            for (int i = 0; i < this.Count; i++)
            {
                if (this[i].GetType() == type)
                {
                    return this[i];
                }
            }

            throw new NotImplementedException("Fix this");
        }

        set
        {
            for (int i = 0; i < this.Count; i++)
            {
                if (this[i].GetType() == type)
                {
                    this[i] = value;
                }
            }

            if(System.Diagnostics.Debugger.IsAttached)
                System.Diagnostics.Debugger.Break();
        }
    }

此代码位于从 List 继承的 ModifierCollection 类中。修改器是粒子引擎的一部分。另外,我的游戏还没有处于可以实际测试的状态,所以我无法测试,但这应该可以正常工作吗?

我读到了一些关于 RunTimeTypeHandles 应该更快的东西,我应该使用它吗?

编辑:我的目标是我可以做到以下几点:

    (particleEffect["NameOfEmitter"].Modifiers[typeof(SomeCoolModifier)] as SomeCoolModifier).Variable = Value;

基本上我只是想在运行时改变一些修饰符的值。

编辑 2:我刚刚意识到我可以将 Modifier 的引用保存到我目前调用它的类中:P 如果我有 5-10 个修饰符,可能不是干净的代码,但应该消除这个问题。

【问题讨论】:

  • 为什么需要一个由 type 索引的映射?我能想象到的唯一用途是元编程,每帧不会发生 20 次。你确定不能只使用多态性吗?
  • 不是重复的,但stackoverflow.com/questions/378643/fastest-type-comparison 应该会有所帮助。
  • 最好有更明确的异常数据:NotImplementedException("Fix this");
  • @mydogisbox:可以肯定地认为这更像是一个// TODO: 占位符。
  • @Yuck 可能,但它遵循 if 语句,所以我会假设其他情况。

标签: c# types gettype


【解决方案1】:

如果您不需要Type 公开的任何额外功能,并且您只关心类型之间的绝对相等——即,您不需要支持继承——RuntimeTypeHandle 是进行此比较的最快方法。

不过,我真的会怀疑这是否不是你的班级设计的弱点。除非您有令人信服的理由直接检查类型,否则最好在对象上公开某种值(可能是枚举)来表示它们是什么,然后进行比较。

【讨论】:

    【解决方案2】:

    如果您想真正快速地运行并且可以信任调用您的代码,请将索引器更改为仅采用 int。然后在调用者用来将类型添加到列表中的任何方法(您没有显示)中,将相应的 int 返回给他们。这是一个更糟糕的 API,但这意味着您不必执行任何循环或查找。

    【讨论】:

      【解决方案3】:

      您可以将值存储在按类型而不是列表索引的字典中,这样您就不必每次都对列表​​进行 O(n) 迭代。

      如 cmets 中所述,这确实取决于 n 的大小,并且可能是微优化。我建议您分析您的应用程序。

      【讨论】:

      • 嗯,取决于。如果只有少数项目,散列和花式查找算法可能会使其比线性搜索慢,JIT 对散列表内部结构和集合范围的了解程度等也可能会产生影响.
      • 这并没有摆脱 GetType() 调用,如果列表很小,可能会比循环更昂贵
      • @delnan - 是的,它确实取决于 n 的大小。修改我的答案。
      猜你喜欢
      • 2018-08-25
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多