• Программинг

Нужны источники бесперебойного питания?

Источники бесперебойного питания от дизельстор

С++ против C#

Приветствую всех вас в новом году! Сегодня не будем нагружать голову кодом, а просто рассмотрим один интересный момент. С момента выхода библиотеки .NET, программист получил в свое распоряжение отличный инструмент разработки. Быстрое и простое создание программ, и относительно безопасная их работа в управляемой среде. Но вместе с этим мы получили то, что такие приложения стали «потреблять» больше ресурсов. В некоторых случаях работать значительно медленнее своих собратьев, написанных на С++ и Delphi без использования библиотеки .NET. Для людей, которые только начинают изучать языки программирования и думают, какой язык изучать и под какую библиотеку, я представлю короткий тест, который покажет сколько системных ресурсов потребляет одно и тоже приложение, написанное на С++ и C#.

Я подготовил четыре консольных приложения:
1) На нативном C++ под Win32;
2) на C++ под .NET Framework 4.0;
3) на C# .NET Framework 2.0;
4) на C# .NET с использованием WinApi-функции SetProcessWorkingSetSize.

19

Давайте теперь рассмотрим какие и сколько системных ресурсов потребляют наши приложения.
1 – размер файла на жестком диске;
2 – размер текущей виртуальной памяти, которую занимает приложение;
3 – выделяемый системой размер виртуальной памяти (система всегда выделяет с запасом);
4 – размер занимаемый физической памяти;
5 – максимальный «рабочий» объем в памяти (типа рекорд приложения за текущий запуск). Сравнивайте данные на скриншотах.
На нативном C++ под Win32.

Все по минимуму. Работает быстро и четко. Название картинки – смешные килобайты :)
На C++ под .NET Framework 4.0;

Обратите внимание насколько сильно изменилась рабочая и виртуальная память. Так и хочется спросить: что мы там на 7 мегабайт делаем? Файл компилировался с оптимизацией на скорость работы.
На C# .NET Framework 2.0. В данном случает версия фреймворка погоды не делает.

20

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

21

И хит сезона… резкое уменьшение размера в физической памяти. Фокус в том, что выполняется функция SetProcessWorkingSetSize, которая устанавливает минимальный и максимальный размеры рабочего комплекта памяти для заданного процесса. Пример кода:

1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Runtime.InteropServices;
5 using System.Diagnostics;
6  
7 namespace csharpcons
8 {
9     class Program
10     {
11         [DllImport("kernel32.dll")]
12         public static extern bool SetProcessWorkingSetSize(IntPtr handle, int minimumWorkingSetSize, int maximumWorkingSetSize);
13  
14         static void Main(string[] args)
15         {
16             SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
17             Console.WriteLine("C# .NET Framework 2.0 with SetProcessWorkingSetSize");
18             Console.ReadLine();
19         }
20     }
21 }

Виртуальная память не уменьшается, но рабочая память становится меньше. Конечно, если кому-то это вообще нужно.
Поэтому смотрите, для какой операционной системы вы пишите приложение и с какой целью. Если нужна маленькая утилита, которая висит в трее, то может есть смысл написать на С++. К тому же, изучая C++, вы убьете двух зайцев: писать нативный код и код под фреймворк, используя преимущества обоих методов. Не зря Microsoft в 2010 Visual Studio оставила возможность создавать проекты под тот же MFC.