C# - 考虑到性能的有组织对象访问

时间:2010-06-30 15:26:12

标签: c# performance object organization

嗯,所以我的标题有问题,但这是我最好的一击!

情况:我正在编写一个库,以便我可以轻松地在未来的项目中重用我的代码,而无需考虑内部。该库应该能够在运行时创建对象,然后通过方法访问它们来执行任务。全部使用易于使用的标识符。

这样的事情:

class Manager
{
    Object[] Foo;
    // Other stuff + initialization logic

    CreateFoo(/*Some parameters here + Identifier*/)
    {
        // Create a new Foo here;
    }
    AddBar(/*Moar parameters + Foo identifier*/)
    {
        Foo[StoID(identifier)].AddBar(/*Params*/);
    }

}

class Software
{
    Software()
    {
        // Create a lot of Foos.
        while(1)
        {
             manager.CreateFoo(/*Params*/);
        }
    }
    void OhHai()
    {
        // This method can be called a LOT (100 times per update) or not at all       
        // depending on circumstances.
        manager.AddBar(/*Params*/);
    }
}

免责声明:不,这实际上不是我的代码傻!

问题:我可能想要访问我的Foo对象并且性能至关重要,但可管理性和易用性也是如此。例如,我的第一个想法是使用字符串和数组索引来创建一个小的动态转换库。然而,这意味着需要进行大量迭代 - 取决于创建的Foos数量 - 以及字符串比较。

示例:

class Software
{
    Manager manager;
    Software()
    {
        manager.CreateFoo("Lol", /*Parameters*/);
        manager.CreateFoo("Cat", /*Parameters*/);
    }
    void OhHai()
    {
        manager.AddBar("Lol", /*Parameters 1*/;
        manager.AddBar("Cat", /*Parameters 2*/;
    }
}

使用索引直接访问Foo的性能必须远远大于首先将字符串转换为id。然而,字符串很容易被人类管理,因此易于使用将是完美的。

我在问什么:这些事情通常是如何处理的,是否有人建议我应该如何设计?

编辑:基本上我正试图找一个简单的方法让我的经理知道哪个Foo要添加一个吧! :)

3 个答案:

答案 0 :(得分:2)

我可能会在这里遗漏一些东西,但它看起来像你想要用作后备存储的是一个Dictionary对象而不是Arrays。

索引字典的时间是O(1)。你无法击败恒定的时间。 :)

好吧,如果您的常量时间非常长,则可以,但不适用于字典检索。只需确保你的GetHashCode方法产生一个好的哈希,你应该是金色的。

答案 1 :(得分:0)

关于这种方法的一些东西闻起来......但这只是我的意见。

我认为您尝试做的很多事情都可以通过像Spring.NET这样的DI框架来完成。它允许您通过“友好名称”在代码中创建和注入对象,而不必担心它们的精确类型(只要它们实现某个接口或扩展某个基类)。

答案 2 :(得分:0)

为什么不在这里改变你的课程

class Manager
{
    Foo CreateFoo(/*Some parameters here + Identifier*/)
    {
        // Create a new Foo here AND return it
    }
    void AddFoo(Foo foo)
    {
     // adds to yor collection
    }
    AddBar(/*Moar parameters + Foo instance*/)
    {
        foo.AddBar(/*Params*/);
    }

}