2010-09-13 20 views
2


В моей работе используется большое количество экземпляров класса.
Для оптимизации памяти я хотел бы знать, будет ли использование статического метода лучше, чем простые функции.
Благодарим за любое предложение по оптимизации управления множеством объектов.Оптимизация C# для большого количества экземпляров класса

+0

Сколько? Какой у вас бюджет памяти? Как далеко это ты? –

ответ

3

Там нет никакой разницы между

public class Foo 
{ 
    public Bar bar; 
    public Bar baz; 

    public bool Qux() 
    { 
     return this.bar != null; 
    } 
} 

и

public class Foo 
{ 
    public Bar bar; 
    public Bar baz; 

    public static bool Qux(Foo foo) 
    { 
     return foo.bar != null; 
    } 
} 

с точки зрения потребления памяти с помощью одного экземпляра. Методы потребляют память на класс, а не на экземпляр.

В этом случае вы можете сэкономить память, не создавая экземпляры. Итак, если ваш статический метод делает ненужные экземпляры, перейдите для статических методов.

+0

Не то, чтобы я думал, что это имеет значение в настоящем контексте, но если методы экземпляра требуют записи в vtable, это займет немного больше памяти, чем методы, для которых не требуется запись vtable. –

+1

@Rune: для класса есть один v-столбец, все объекты этого класса используют один и тот же. –

+0

@Hans Размер его зависит от количества методов в нем, которые (возможно) требуют немного больше памяти, чем если бы они были статическими. Я сказал, что не думаю, что я не думаю, что это имеет значение в этом контексте :) –

2

Как правило: код ваших методов разделяется между экземплярами - это не похоже на то, что каждый экземпляр получает свою собственную копию методов. Возможно, вам захочется взглянуть на то, как управлять экземпляром data, хотя мне приходит в голову flyweight pattern.

0

Сохраняет ли класс данные экземпляра экземпляра или использует данные экземпляра для выполнения метода? Тогда статический метод не будет работать.

Если метод не использует данные экземпляра класса, то использование метода static будет работать.

Если вы не можете сделать интересующий вас метод (ы) статическим, вы можете подумать о внедрении пула для своих объектов.

Когда вам нужен экземпляр, вы получаете доступный из пула, используйте его, а затем возвращаете его в пул, когда закончите с ним. Таким образом, вам не нужно создавать столько экземпляров (но это предполагает, конечно, что вы создаете множество экземпляров, которые часто не используются).

+0

в первом случае статический будет работать, если вы пройдете в экземпляре –

+0

@Rune FS - Да, это будет. Но в этом случае у вас все равно будет создано столько экземпляров. –

0

Создание ваших методов статическим или нет, не должно иметь большого значения для следа вашего класса. Если вы закончите создавать свои классы просто для вызова метода-члена, статические могут иметь небольшую разницу.

Если потребление памяти из-за многих случаях является проблемой, вы можете захотеть взглянуть на Flyweight pattern

1

повреждая ваш читаемость или изменение логики для проблем производительности рекомендуется только после того, как вы полностью уверены независимо вы планируете сделать, это значительно поможет. Здесь дело обстоит не так, потому что ваше решение не поможет на первом месте, не говоря уже о «значительном». поэтому ответ на ваш вопрос «нет».

0

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

+0

Действительно? Я думал, что это было действительно проблемой, если в Gen 2 было много объектов, умирающих –

+0

@Conrad: Я видел это на любом языке. Я принимаю stackshots, и хороший процент из них может быть в построении объекта: new, malloc, destruct или gc (если есть, удалите, если нет). Когда это произойдет, объединение приводит к тому, что он уходит, для приятного ускорения. –

0

Методы, всегда привязанные к классам, а не к экземплярам. Размер экземпляра в памяти не зависит от количества методов. Поэтому использование переменной static или экземпляра вообще не связано с оптимизацией памяти.

Смежные вопросы