Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-考虑性能的有组织对象访问_C#_Performance_Object_Organization - Fatal编程技术网

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

C#-考虑性能的有组织对象访问,c#,performance,object,organization,C#,Performance,Object,Organization,嗯,所以我在标题上有问题,但这是我最好的机会 情况:我正在编写一个库,这样我就可以轻松地在未来的项目中重用我的代码,而不必考虑内部内容。这个库应该能够在运行时创建对象,然后通过方法访问它们来执行任务。所有这些都使用易于使用的标识符 类似这样的内容: class Manager { Object[] Foo; // Other stuff + initialization logic CreateFoo(/*Some parameters here + Identifie

嗯,所以我在标题上有问题,但这是我最好的机会

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

类似这样的内容:

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*/);
    }
}
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对象,性能至关重要,但可管理性和易用性也是如此。例如,我的第一个想法是使用字符串和数组索引创建一个小型的动态转换库。然而,这将意味着大量的迭代(取决于创建了多少个foo)和字符串比较

示例:

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*/);
    }
}
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添加一个酒吧!:)

我可能在这里遗漏了一些内容,但看起来您想要用作备份存储的是一个Dictionary对象,而不是数组

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


如果你的固定时间真的很长,你可以这样做,但这不是为了查字典。只要确保你的GetHashCode方法产生了一个好的散列,你就应该是金色的。。。但这只是我的意见


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

为什么不在这里更改您的类

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*/);
    }

}

因为我需要能够在任何给定的时间向任何给定的Foo添加一个新的条。因此,我需要在运行时访问特定的Foo。问题不在于能否做到,而在于如何在保持性能的同时轻松做到!:)嗯,改变框架不是一种选择。作为记录,XNA是我的框架。我要做的是使用一个特定的Foo方法CreateBar()来创建一个Bar。问题是要访问我想要的新酒吧的Foo。如果可能的话,我希望在保持性能的同时操作起来简单。那么,字典不只是比较字符串吗?(直到现在才知道这本词典)这对性能有何影响\不,字典正在使用哈希表(它是一个通用哈希表实现)。话虽如此,哈希表是O(n),但平均而言,每次检索它们的性能高达1.2步(记住,Big-O是“比最坏情况更糟的”)。啊,感谢你们,今天也学到了一些很棒的东西使用字典肯定是有用的,因此这个问题得到了回答:)@sztomi根据MS,在字典类帮助页面上:检索是O(1)。相关章节在备注下。“使用键值检索值非常快,接近O(1),因为Dictionary类是作为哈希表实现的。”同样,假设哈希算法不会产生很多相同的哈希。如果你做得很糟糕,那么是的,你可以接近O(n)。@sztomi同样,大O并不“比最坏的情况更糟糕”。它可以用来描述任何情况。所以对于一个简单的线性搜索,最坏的情况是O(n)(列表中的最后一项),最好的情况是O(1)(列表中的第一项),平均情况是O(n/2)。请注意维基百科文章中的描述: