C # - организованный доступ к объектам с учетом производительности - PullRequest
1 голос
/ 30 июня 2010

Хм, поэтому у меня были проблемы с названием, но это был мой лучший выстрел!

Ситуация: Я пишу библиотеку, так что я легко могу повторно использовать свой код в будущих проектах, не думая о внутренностях. Предполагается, что эта библиотека сможет создавать объекты во время выполнения и затем обращаться к ним для выполнения задач с помощью метода. Все с помощью простого в использовании идентификатора.

Примерно так:

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 создано - и сравнение строк.

Пример: * ** 1022 тысячу двадцать одна * 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 ]

2 голосов
/ 30 июня 2010

Я мог бы что-то здесь упустить, но похоже, что вы хотите использовать, поскольку ваше хранилище резервных копий является объектом Dictionary вместо Arrays.

Время для индексации в словаре O (1). Вы не можете победить постоянное время. :)

Ну, вы можете, если ваше постоянное время ДЕЙСТВИТЕЛЬНО длинное, но оно не для поиска по словарю. Просто убедитесь, что ваш метод GetHashCode производит хороший хеш, и вы должны быть золотым.

0 голосов
/ 30 июня 2010

почему бы вам не изменить свой класс здесь

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

}
0 голосов
/ 30 июня 2010

Что-то в этом подходе пахнет ... но это только мое мнение.

Я думаю, что многое из того, что вы пытаетесь сделать, может быть реализовано с помощью DI-фреймворка, такого как Spring.NET. Это позволит вам создавать и вставлять объекты в код под «дружественным именем», не беспокоясь об их точном типе (если они реализуют определенный интерфейс или расширяют определенный базовый класс).

...