Приветствую всех вас в новом году! Сегодня не будем нагружать голову кодом, а просто рассмотрим один интересный момент. С момента выхода библиотеки .NET, программист получил в свое распоряжение отличный инструмент разработки. Быстрое и простое создание программ, и относительно безопасная их работа в управляемой среде. Но вместе с этим мы получили то, что такие приложения стали «потреблять» больше ресурсов. В некоторых случаях работать значительно медленнее своих собратьев, написанных на С++ и Delphi без использования библиотеки .NET. Для людей, которые только начинают изучать языки программирования и думают, какой язык изучать и под какую библиотеку, я представлю короткий тест, который покажет сколько системных ресурсов потребляет одно и тоже приложение, написанное на С++ и C#.
Я подготовил четыре консольных приложения:
1) На нативном C++ под Win32;
2) на C++ под .NET Framework 4.0;
3) на C# .NET Framework 2.0;
4) на C# .NET с использованием WinApi-функции SetProcessWorkingSetSize.

Давайте теперь рассмотрим какие и сколько системных ресурсов потребляют наши приложения.
1 – размер файла на жестком диске;
2 – размер текущей виртуальной памяти, которую занимает приложение;
3 – выделяемый системой размер виртуальной памяти (система всегда выделяет с запасом);
4 – размер занимаемый физической памяти;
5 – максимальный «рабочий» объем в памяти (типа рекорд приложения за текущий запуск). Сравнивайте данные на скриншотах.
На нативном C++ под Win32.
Все по минимуму. Работает быстро и четко. Название картинки – смешные килобайты 
На C++ под .NET Framework 4.0;
Обратите внимание насколько сильно изменилась рабочая и виртуальная память. Так и хочется спросить: что мы там на 7 мегабайт делаем? Файл компилировался с оптимизацией на скорость работы.
На C# .NET Framework 2.0. В данном случает версия фреймворка погоды не делает.

Ситуация практически идентична с предыдущим приложением. Но, что интересно, на C++ приложение меньше «ест» виртуальной памяти, хоть и работает с той же библиотекой.
На C# .NET с использованием WinApi-функции SetProcessWorkingSetSize.

И хит сезона… резкое уменьшение размера в физической памяти. Фокус в том, что выполняется функция SetProcessWorkingSetSize, которая устанавливает минимальный и максимальный размеры рабочего комплекта памяти для заданного процесса. Пример кода:
2 |
using System.Collections.Generic; |
4 |
using System.Runtime.InteropServices; |
5 |
using System.Diagnostics; |
11 |
[DllImport("kernel32.dll")] |
12 |
public static extern bool SetProcessWorkingSetSize(IntPtr handle, int minimumWorkingSetSize, int maximumWorkingSetSize); |
14 |
static void Main(string[] args) |
16 |
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1); |
17 |
Console.WriteLine("C# .NET Framework 2.0 with SetProcessWorkingSetSize"); |
Виртуальная память не уменьшается, но рабочая память становится меньше. Конечно, если кому-то это вообще нужно.
Поэтому смотрите, для какой операционной системы вы пишите приложение и с какой целью. Если нужна маленькая утилита, которая висит в трее, то может есть смысл написать на С++. К тому же, изучая C++, вы убьете двух зайцев: писать нативный код и код под фреймворк, используя преимущества обоих методов. Не зря Microsoft в 2010 Visual Studio оставила возможность создавать проекты под тот же MFC.