Этот вопрос уже давно озадачивает меня. Я имею богатый и длинный опыт работы с C ++, и с тех пор, как я начал программировать на C # и заниматься сборкой мусора, у меня всегда было чувство, что такая «магия» будет стоить дорого.
Недавно я начал работать над большим MMO-проектом, написанным на Java (на стороне сервера). Моя основная задача - оптимизировать потребление памяти и использование процессора. Сотни тысяч сообщений в секунду отправляются и создается такое же количество объектов. После большого количества профилирования мы обнаружили, что сборщик мусора виртуальной машины потребляет много процессорного времени (из-за постоянных сборов), и решили попытаться минимизировать создание объектов, используя пулы, где это применимо, и повторно используя все, что можем. Пока что это действительно хорошая оптимизация.
Итак, из того, что я узнал, наличие сборщика мусора - это круто, но вы не можете просто притвориться, что его не существует, и вам все равно нужно позаботиться о создании объекта и его последствиях (по крайней мере, в 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 и здравый смысл подсказывают мне, что я должен.
Любой свет и мысли по этому вопросу будут высоко оценены. Заранее спасибо.