Optimiser une application .NET : comment des montages simples ont permis d'accélérer PVS-Studio et de réduire de 70 % la consommation mémoire

Les problĂšmes de performances tels que des performances anormalement lentes et une consommation de mĂ©moire Ă©levĂ©e peuvent ĂȘtre dĂ©tectĂ©s de diverses maniĂšres. De telles lacunes de l'application sont rĂ©vĂ©lĂ©es par les tests, par les dĂ©veloppeurs ou les testeurs eux-mĂȘmes, et dans un scĂ©nario moins rĂ©ussi, par les utilisateurs. HĂ©las, la dĂ©tection des anomalies n'est que la premiĂšre Ă©tape. De plus, le problĂšme doit ĂȘtre localisĂ©, sinon il ne sera pas possible de le rĂ©soudre. Cela pose la question - comment trouver dans un grand projet les raisons conduisant Ă  une consommation excessive de mĂ©moire et Ă  des ralentissements ? Existent-ils du tout ? Ce n'est peut-ĂȘtre pas du tout l'application ? Cet article est consacrĂ© Ă  l'histoire de la façon dont les dĂ©veloppeurs de l'analyseur PVS-Studio C# ont fait face Ă  un problĂšme similaire et ont pu le rĂ©soudre.





Analyse sans 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