Masalah kinerja seperti kinerja lambat yang tidak normal dan konsumsi memori yang tinggi dapat dideteksi dengan berbagai cara. Kekurangan aplikasi tersebut diungkapkan oleh pengujian, oleh pengembang atau penguji itu sendiri, dan dalam skenario yang kurang berhasil, oleh pengguna. Sayangnya, mendeteksi anomali hanyalah langkah pertama. Selanjutnya, masalahnya harus dilokalisasi, jika tidak, tidak akan mungkin untuk menyelesaikannya. Ini menimbulkan pertanyaan - bagaimana menemukan dalam proyek besar alasan yang menyebabkan konsumsi memori yang berlebihan dan perlambatan? Apakah mereka ada sama sekali? Mungkin itu bukan aplikasi sama sekali? Artikel ini dikhususkan untuk kisah tentang bagaimana pengembang PVS-Studio C # analyzer menghadapi masalah serupa dan mampu menyelesaikannya.
Analisis tanpa akhir
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%.