Этот вопрос озадачил меня в течение долгого времени. Я родом из тяжелого и длинного фона С++, и с тех пор, как я начал программировать на С# и занимался сборкой мусора, у меня всегда было ощущение, что такая "магия" будет стоить дорого.
Недавно я начал работать в большом проекте MMO, написанном на Java (на стороне сервера). Моя основная задача - оптимизировать потребление памяти и использование ЦП. Сотни тысяч сообщений в секунду отправляются и создается одинаковое количество объектов. После большого профилирования мы обнаружили, что сборщик мусора VM потреблял много процессорного времени (из-за постоянных коллекций) и решил попытаться свести к минимуму создание объектов, используя пулы, где это применимо, и повторно использовать все, что мы можем. До сих пор это была действительно хорошая оптимизация.
Итак, из того, что я узнал, наличие сборщика мусора является удивительным, но вы не можете просто притворяться, что его нет, и вам все равно нужно заботиться о создании объекта и о том, что он подразумевает (по крайней мере, на Java и большое приложение, подобное этому).
Итак, это также верно для .NET? если это так, в какой степени?
Я часто пишу пары таких функций:
// Combines two envelopes and the result is stored in a new envelope.
public static Envelope Combine( Envelope a, Envelope b )
{
var envelope = new Envelope( _a.Length, 0, 1, 1 );
Combine( _a, _b, _operation, envelope );
return envelope;
}
// Combines two envelopes and the result is 'written' to the specified envelope
public static void Combine( Envelope a, Envelope b, Envelope result )
{
result.Clear();
...
}
Вторая функция предоставляется в случае, если у кого-то есть уже сделанный конверт, который можно использовать повторно для хранения результата, но я нахожу это немного странным.
Я также иногда пишу структуры, когда предпочитаю использовать классы, только потому, что знаю, что будут десятки тысяч экземпляров, которые постоянно создаются и удаляются, и мне это кажется странным.
Я знаю, что в качестве разработчика .NET я не должен беспокоиться об этих проблемах, но мой опыт работы с Java и здравым смыслом подсказывает мне, что я должен.
Любой свет и мысли по этому вопросу будут высоко оценены. Спасибо заранее.