パフォーマンスの異常な低下やメモリ消費量の増加などのパフォーマンスの問題は、さまざまな方法で検出できます。このようなアプリケーションの欠点は、テスト、開発者またはテスター自身、そしてあまり成功していないシナリオではユーザーによって明らかになります。残念ながら、異常の検出は最初のステップにすぎません。さらに、問題をローカライズする必要があります。そうしないと、問題を解決できません。これは問題を提起します-大規模なプロジェクトで過度のメモリ消費と速度低下につながる理由をどのように見つけるのですか?それらはまったく存在しますか?おそらくそれはアプリケーションではないのでしょうか?この記事では、PVS-Studio C#アナライザーの開発者がどのようにして同様の問題に直面し、それを解決できたかについて説明します。
無限の分析
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%.