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. :
Visual Studio.
File->Open->File ( Ctrl+O).
.
:
. Debug With Managed Only.
, . â , :
- , ..;
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);
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%.