Optimización de una aplicación .NET: cómo las ediciones simples hicieron posible acelerar PVS-Studio y reducir el consumo de memoria en un 70%

Los problemas de rendimiento, como un rendimiento anormalmente lento y un alto consumo de memoria, se pueden detectar de diversas formas. Estas deficiencias de la aplicación son reveladas por las pruebas, por los propios desarrolladores o evaluadores y, en un escenario menos exitoso, por los usuarios. Por desgracia, la detección de anomalías es solo el primer paso. Además, el problema debe localizarse, de lo contrario no será posible resolverlo. Esto plantea la pregunta: ¿cómo encontrar en un gran proyecto las razones que conducen a un consumo excesivo de memoria y ralentizaciones? ¿Existen en absoluto? ¿Quizás no sea la aplicación en absoluto? Este artículo está dedicado a la historia de cómo los desarrolladores del analizador PVS-Studio C # enfrentaron un problema similar y pudieron resolverlo.





Análisis sin fin

C#- . – PVS-Studio , , .. , github, .





, , Roslyn. solution 200 , – C#. , , . PVS-Studio Roslyn 1,5-2 . , , , , .





. , ... 3 ! - . , .





, ?!

– ? , ? C#- PVS-Studio ?





! . , . , unit- C#-. , . , . - .





, , . , – .





, - . , , . .





. ? , — . , PVS-Studio. - , .





, , . - – .





, . , :). Visual Studio. :





  1. Visual Studio.





  2. File->Open->File ( Ctrl+O).





  3. .





:





. Debug With Managed Only.





. Visual Studio , .





, . — , :





  • - , ..;





  • Quick Watch Immediate Window . , File.WriteAllText "Caracteres no válidos en la ruta de acceso!". , , .





. :





  • : 1 500;





  • : 24 ;





  • : 12;





  • : 1060.





. , . , . , , , .





, . - , - . 2 .





, , . , . , . ... !





-,

, , "" . , . .





. – .





, :





  • ;





  • ;





  • .





, ...





. . . , , - . – ?





, . , . ! , , , . , !





– , . . ... .





, . . ?





. , .





, ?

32 . , 16 , – 32 . , 8 .





– ? , !





, . , , . – memory paging ( – "swapping"). (). . , . , .





. , . swapping .





, . , , , . , . .





dotMemory

dotMemory, JetBrains. .NET, Visual Studio, . dotMemory .





:





, "Run". :





. – "Memory Snapshots":





( ). :





dotMemory, , . sunburst , — , . "Dominators".





. :





, . , "". , ?





. , , .





(Data-Flow Analysis) . , , null, , . , PVS-Studio, .





, , , . ! , , .





? ?





, , . , 3 . . , - ?





. , PVS-Studio . , , ( ):





void MyFunction(int a, int b, int c ....)
{
  // a = ?
  // b = ?
  // c = ?
  ....
}

      
      



. , , !





– . ...





! , :





  • , ;





  • – ;





  • , .





, , . . .





, . – Flyweight. — , .





, , . – : , . C# . string.Intern string.IsInterned. . . , " , String C#".





, Flyweight. ?





! 14,55 4,73 . 68%! . – , , .





, ...





!

, . ! , , , . – . ... ?





dotTrace

, . , – ? ?





dotTrace – .NET , . dotMemory:





. dotMemory, dotTrace . . , , .





, dotTrace, . , CPU:





"" , Start ( ). , "Get Snapshot And Wait". . , :





. . . – View->Snapshot Overview Ctrl+Shift+O.





dotTrace? , -, , C#- . PVS-Studio C# – , , , . , 13—15% CPU. , , ?





dotTrace , , ! – ?





, . , – , PVS-Studio "".





, , , . .





, DisplayPart!

, DisplayPart. , , .





, , . C#- DisplayPart ! , Roslyn API.





Roslyn ( .NET Compiler Platform) C#- PVS-Studio. :





  • ;





  • ;





  • ( ) ;





  • ..





Roslyn – . , DisplayPart .





, DisplayPart . , – , . , , -, .. " Roslyn. ". , ( ).





, ToString. , , DisplayPart. , , ( ).





, = 90% . ToString , , , ?





, . ToString .





– . , . , , . , . , .





, , ( ). , PVS-Studio : 2,5 , 2. 20% .





Enumerator

List<T>.Enumerator, . , , . , , ! .





(boxing). object . IEnumerator, .





Enumerator GetEnumerator. , , IEnumerable. , , – IEnumerator. , GetEnumerator ?





! GetEnumerator, List, :





- ? , GetEnumerator:





. , , – . , .





, , Enumerator . - C#- . .





. , GetEnumerator . foreach. " " . foreach List, , foreach, . foreach IEnumerable, , foreach IEnumerator. , GetEnumerator, .





, IEnumerable. , IEnumerable, List.





, – , , IEnumerable, , - . , - .





, LINQ?!

, System.Linq, . . , - Where, Select . . C#- PVS-Studio – .





, LINQ- . , foreach. ?





, IEnumerator. LINQ-. :





List<int> sourceList = ....
var enumeration = sourceList.Where(item => item > 0)
                            .Select(item => someArray[item])
                            .Where(item => item > 0)
                            .Take(5);

      
      



? ! , , System.Linq. github .





Where WhereListIterator – Where-, List ( ). . WhereListIterator , . WhereListIterator , IEnumerator . WhereListIterator , , . , .





Select WhereSelectListIterator. , .





Where Take .





5 . , .





, foreach:





List<int> sourceList = ....
List<int> result = new List<int>();

foreach (var item in sourceList)
{
  if (item > 0)
  {
    var arrayItem = someArray[item];

    if (arrayItem > 0)
    {
      result.Add(arrayItem);

      if (result.Count == 5)
        break;
    }
  }
}

      
      



foreach LINQ.





  • LINQ-:





    • , ;





    • ;





    • ;





    • , , .





  • LINQ-:





    • : 5 , — 1 ( result);





    • . , , . , ToList, LINQ- ( ).





, LINQ- . , . , , , .





, . LINQ- - ToList, ( ).





. . , , yield. , . yield C# ( , ) " yield C#?".





, , foreach LINQ-. .





?

!

PVS-Studio ! , ( 20%, 70%!). , ! , , PVS-Studio.





, . . , , PVS-Studio . , . dotMemory dotPeek, , . , , .





, , ... , , . PVS-Studio . – . C#- , , PVS-Studio. , - , , , .





, , . " " ... ! , , . – Incredibuild. , C++ , - .





, , LINQ- - , . - "always true"-, , , – , .





IDE . , , - . . , . , , .





PVS-Studio – . , . , , , :). ! . !





, : Nikita Lipilin. .NET Application Optimization: Simple Edits Speeded Up PVS-Studio and Reduced Memory Consumption by 70%.








All Articles