рдПрдПрд╕ 3 (рд╕рд╛рде рд╣реА рдПрдПрд╕ 2 рдФрд░ рдЬреЗрдПрд╕) рдХреА рд╢рд╛рдВрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ "рдЧрддрд┐рд╢реАрд▓" рдХреЛрдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЦреЗрддреЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛, рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛рдУрдВ рдХреА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рддрд░рд╣, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИред рдЖрдЬ рд╣рдо рдЙрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдЬрд┐рдирдореЗрдВ рдпрд╣ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЦреЗрддреЛрдВ рддрдХ "рдзреАрдореА" рдЧрддрд┐рд╢реАрд▓ рдкрд╣реБрдВрдЪ рдХреИрд╕реЗ рд╣реИред
рд╡реИрд╕реЗ, рдпрд╣рд╛рдБ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:
function foo(p:Point): void { px;
рдмрд┐рдВрджреБ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, "рдЗрдВрдбреЗрдХреНрд╕" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЗрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕рднреА рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рддрд╛рд░, рдЧреБрдг, рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдоред
рдпрд╣ рдЬрд╛рдирдХрд░, рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдЦреЗрддреЛрдВ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкрд╣реБрдВрдЪ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рд╢рд╛рдорд┐рд▓ рдерд╛, рдФрд░ рдЪрдХреНрд░ рдХреЗ рднрд╛рд░ рдХреЗ "рдкреНрд░рднрд╛рд╡" рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 1 рдЪрдХреНрд░ рдкреНрд░рддрд┐ рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рднреА рдЬреЛрдбрд╝реЗред рджреГрд╢реНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдФрд░ рд░реЗрдЦрд╛рдВрдХрди рд╕рдВрд▓рдЧреНрди рд╣реИрдВред
package { import flash.display.*; import flash.events.*; import flash.utils.*; import flash.text.*; import flash.geom.*; public class FieldAccessMethods extends Sprite { public static var VAL:Number=0; private var __logger:TextField = new TextField(); private function row(...vals): void { __logger.appendText(vals.join(",")+"\n"); } public function FieldAccessMethods() { __logger.autoSize = TextFieldAutoSize.LEFT; addChild(__logger); var i:int; const REPS:int = 1000000; var beforeTime:int; var afterTime:int; var readDotTime:int; var writeDotTime:int; var readIndexTime:int; var writeIndexTime:int; var p:Point = new Point(0,0); var mp:MyPoint = new MyPoint(); var md:MyDynamic = new MyDynamic(); var d:Dictionary = new Dictionary(); dx=0; var a:Array = [0]; ax=0; var c:Class = DynamicAccess; var dc:Class = MyDynamic; var o:Object = {x:0}; row("Type", "Read (dot)", "Write (dot)", "Read (index)", "Write (index)"); beforeTime = getTimer(); for (i=0; i < REPS; ++i) { px;px;px;px;px; px;px;px;px;px; } afterTime = getTimer(); readDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { px=0;px=0;px=0;px=0;px=0; px=0;px=0;px=0;px=0;px=0; } afterTime = getTimer(); writeDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { p["x"];p["x"];p["x"];p["x"];p["x"]; p["x"];p["x"];p["x"];p["x"];p["x"]; } afterTime = getTimer(); readIndexTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { p["x"]=0;p["x"]=0;p["x"]=0;p["x"]=0;p["x"]=0; p["x"]=0;p["x"]=0;p["x"]=0;p["x"]=0;p["x"]=0; } afterTime = getTimer(); writeIndexTime = afterTime - beforeTime; row("Point", readDotTime, writeDotTime, readIndexTime, writeIndexTime); beforeTime = getTimer(); for (i=0; i < REPS; ++i) { mp.x;mp.x;mp.x;mp.x;mp.x; mp.x;mp.x;mp.x;mp.x;mp.x; } afterTime = getTimer(); readDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { mp.x=0;mp.x=0;mp.x=0;mp.x=0;mp.x=0; mp.x=0;mp.x=0;mp.x=0;mp.x=0;mp.x=0; } afterTime = getTimer(); writeDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { mp["x"];mp["x"];mp["x"];mp["x"];mp["x"]; mp["x"];mp["x"];mp["x"];mp["x"];mp["x"]; } afterTime = getTimer(); readIndexTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { mp["x"]=0;mp["x"]=0;mp["x"]=0;mp["x"]=0;mp["x"]=0; mp["x"]=0;mp["x"]=0;mp["x"]=0;mp["x"]=0;mp["x"]=0; } afterTime = getTimer(); writeIndexTime = afterTime - beforeTime; row("MyPoint", readDotTime, writeDotTime, readIndexTime, writeIndexTime); beforeTime = getTimer(); for (i=0; i < REPS; ++i) { md.x;md.x;md.x;md.x;md.x; md.x;md.x;md.x;md.x;md.x; } afterTime = getTimer(); readDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { md.x=0;md.x=0;md.x=0;md.x=0;md.x=0; md.x=0;md.x=0;md.x=0;md.x=0;md.x=0; } afterTime = getTimer(); writeDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { md["x"];md["x"];md["x"];md["x"];md["x"]; md["x"];md["x"];md["x"];md["x"];md["x"]; } afterTime = getTimer(); readIndexTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { md["x"]=0;md["x"]=0;md["x"]=0;md["x"]=0;md["x"]=0; md["x"]=0;md["x"]=0;md["x"]=0;md["x"]=0;md["x"]=0; } afterTime = getTimer(); writeIndexTime = afterTime - beforeTime; row("MyDynamic (existing)", readDotTime, writeDotTime, readIndexTime, writeIndexTime); beforeTime = getTimer(); for (i=0; i < REPS; ++i) { md.z;md.z;md.z;md.z;md.z; md.z;md.z;md.z;md.z;md.z; } afterTime = getTimer(); readDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { md.z=0;md.z=0;md.z=0;md.z=0;md.z=0; md.z=0;md.z=0;md.z=0;md.z=0;md.z=0; } afterTime = getTimer(); writeDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { md["z"];md["z"];md["z"];md["z"];md["z"]; md["z"];md["z"];md["z"];md["z"];md["z"]; } afterTime = getTimer(); readIndexTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { md["z"]=0;md["z"]=0;md["z"]=0;md["z"]=0;md["z"]=0; md["z"]=0;md["z"]=0;md["z"]=0;md["z"]=0;md["z"]=0; } afterTime = getTimer(); writeIndexTime = afterTime - beforeTime; row("MyDynamic (added)", readDotTime, writeDotTime, readIndexTime, writeIndexTime); beforeTime = getTimer(); for (i=0; i < REPS; ++i) { dx;dx;dx;dx;dx; dx;dx;dx;dx;dx; } afterTime = getTimer(); readDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { dx=0;dx=0;dx=0;dx=0;dx=0; dx=0;dx=0;dx=0;dx=0;dx=0; } afterTime = getTimer(); writeDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { d["x"];d["x"];d["x"];d["x"];d["x"]; d["x"];d["x"];d["x"];d["x"];d["x"]; } afterTime = getTimer(); readIndexTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { d["x"]=0;d["x"]=0;d["x"]=0;d["x"]=0;d["x"]=0; d["x"]=0;d["x"]=0;d["x"]=0;d["x"]=0;d["x"]=0; } afterTime = getTimer(); writeIndexTime = afterTime - beforeTime; row("Dictionary", readDotTime, writeDotTime, readIndexTime, writeIndexTime); beforeTime = getTimer(); for (i=0; i < REPS; ++i) { ax;ax;ax;ax;ax; ax;ax;ax;ax;ax; } afterTime = getTimer(); readDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { ax=0;ax=0;ax=0;ax=0;ax=0; ax=0;ax=0;ax=0;ax=0;ax=0; } afterTime = getTimer(); writeDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { a["x"];a["x"];a["x"];a["x"];a["x"]; a["x"];a["x"];a["x"];a["x"];a["x"]; } afterTime = getTimer(); readIndexTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { a["x"]=0;a["x"]=0;a["x"]=0;a["x"]=0;a["x"]=0; a["x"]=0;a["x"]=0;a["x"]=0;a["x"]=0;a["x"]=0; } afterTime = getTimer(); writeIndexTime = afterTime - beforeTime; row("Array", readDotTime, writeDotTime, readIndexTime, writeIndexTime); beforeTime = getTimer(); for (i=0; i < REPS; ++i) { c.VAL;c.VAL;c.VAL;c.VAL;c.VAL; c.VAL;c.VAL;c.VAL;c.VAL;c.VAL; } afterTime = getTimer(); readDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { c.VAL=0;c.VAL=0;c.VAL=0;c.VAL=0;c.VAL=0; c.VAL=0;c.VAL=0;c.VAL=0;c.VAL=0;c.VAL=0; } afterTime = getTimer(); writeDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { c["VAL"];c["VAL"];c["VAL"];c["VAL"];c["VAL"]; c["VAL"];c["VAL"];c["VAL"];c["VAL"];c["VAL"]; } afterTime = getTimer(); readIndexTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { c["VAL"]=0;c["VAL"]=0;c["VAL"]=0;c["VAL"]=0;c["VAL"]=0; c["VAL"]=0;c["VAL"]=0;c["VAL"]=0;c["VAL"]=0;c["VAL"]=0; } afterTime = getTimer(); writeIndexTime = afterTime - beforeTime; row("Static Class", readDotTime, writeDotTime, readIndexTime, writeIndexTime); beforeTime = getTimer(); for (i=0; i < REPS; ++i) { dc.VAL;dc.VAL;dc.VAL;dc.VAL;dc.VAL; dc.VAL;dc.VAL;dc.VAL;dc.VAL;dc.VAL; } afterTime = getTimer(); readDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { dc.VAL=0;dc.VAL=0;dc.VAL=0;dc.VAL=0;dc.VAL=0; dc.VAL=0;dc.VAL=0;dc.VAL=0;dc.VAL=0;dc.VAL=0; } afterTime = getTimer(); writeDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { dc["VAL"];dc["VAL"];dc["VAL"];dc["VAL"];dc["VAL"]; dc["VAL"];dc["VAL"];dc["VAL"];dc["VAL"];dc["VAL"]; } afterTime = getTimer(); readIndexTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { dc["VAL"]=0;dc["VAL"]=0;dc["VAL"]=0;dc["VAL"]=0;dc["VAL"]=0; dc["VAL"]=0;dc["VAL"]=0;dc["VAL"]=0;dc["VAL"]=0;dc["VAL"]=0; } afterTime = getTimer(); writeIndexTime = afterTime - beforeTime; row("Dynamic Class", readDotTime, writeDotTime, readIndexTime, writeIndexTime); beforeTime = getTimer(); for (i=0; i < REPS; ++i) { ox;ox;ox;ox;ox; ox;ox;ox;ox;ox; } afterTime = getTimer(); readDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { ox=0;ox=0;ox=0;ox=0;ox=0; ox=0;ox=0;ox=0;ox=0;ox=0; } afterTime = getTimer(); writeDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { o["x"];o["x"];o["x"];o["x"];o["x"]; o["x"];o["x"];o["x"];o["x"];o["x"]; } afterTime = getTimer(); readDotTime = afterTime - beforeTime; beforeTime = getTimer(); for (i=0; i < REPS; ++i) { o["x"]=0;o["x"]=0;o["x"]=0;o["x"]=0;o["x"]=0; o["x"]=0;o["x"]=0;o["x"]=0;o["x"]=0;o["x"]=0; } afterTime = getTimer(); writeDotTime = afterTime - beforeTime; row("Object", readDotTime, writeDotTime, readIndexTime, writeIndexTime); } private function foo(): void {} } } class MyPoint { public var x:Number=0; public var y:Number=0; } dynamic class MyDynamic { public var x:Number=0; public var y:Number=0; public static var VAL:Number=0; }
рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рддрдХрдиреАрдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЬрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдереЗ:
* рдлреНрд▓реЗрдХреНрд╕ SDK (MXMLC) 4.1.0.16076, рд░рд┐рд▓реАрдЬрд╝ рдореЛрдб рдореЗрдВ рд╕рдВрдХрд▓рди
* рдлреНрд▓реИрд╢ рдкреНрд▓реЗрдпрд░ рдХрд╛ рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг 10.2.154.27
* 2.4 Ghz рдЗрдВрдЯреЗрд▓ рдХреЛрд░ i5
* рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ 10.6.7
рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдо:
рдЯрд╛рдЗрдк | рдкрдврд╝рдирд╛ (рдбреЙрдЯ) | рд░рд┐рдХреЙрд░реНрдб (рдбреЙрдЯ) | рдкрдврд╝рдирд╛ (рд╕реВрдЪрдХрд╛рдВрдХ) | рд░рд┐рдХреЙрд░реНрдб (рд╕реВрдЪрдХрд╛рдВрдХ) |
---|
рдкреНрд╡рд╛рдЗрдВрдЯ | 2 | 12 | 816 | 892 |
MyPoint | 2 | 9 | 812 | 890 |
MyDynamic (рдореМрдЬреВрджрд╛) | 3 | 9 | 813 | 892 |
MyDynamic (рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛) | 555 | 369 | 855 | 1021 |
рд╢рдмреНрджрдХреЛрд╢ | 305 | 427 | 995 | 1168 |
рд╕рд░рдгреА | 404 | 510 | 1207 | 1380 |
рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ | 143 | 103 | 841 | 898 |
рдЧрддрд┐рд╢реАрд▓ рд╡рд░реНрдЧ | 140 | 103 | 809 | 886 |
рд╡рд╕реНрддреБ | 831 | 1040 | 809 | 886 |
рд╡рд╣реА рдЧреНрд░рд╛рдлрд╝ рдкрд░рд┐рдгрд╛рдо:
images.jacksondunstan.com/articles/1179/performance_all.pngрдЗрдВрдбреЗрдХреНрд╕ рдПрдХреНрд╕реЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдзрд┐рдХ "рдорд╣рдВрдЧрд╛" рдерд╛ред рдЖрдк рдмрд╣реБрдд рдЕрдзрд┐рдХ "рдорд╣рдВрдЧреА" рднреА рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рдбрд╛рдпрдиреЗрдорд┐рдХ рдПрд░реЗ рдФрд░ рдбрд┐рдХреНрд╢рдирд░реА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдХреА рдкрд╣реБрдВрдЪ рдЕрднреА рднреА "рдзреАрдореА" рд╣реИ, рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ "рдХреЗрд╡рд▓" 3 рдмрд╛рд░ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИред "рддреЗрдЬрд╝" рдПрдХреНрд╕реЗрд╕ (рдЧрддрд┐рд╢реАрд▓ рдХрдХреНрд╖рд╛рдПрдВ рдирд╣реАрдВ) рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП, рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ 400 рдЧреБрдирд╛ рд╕реБрдзрд╛рд░ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛! рдЕрдм рдЖрдЗрдП рдкреЙрдЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЗрд╡рд▓ рдПрдХреНрд╕реЗрд╕ рдЯреЗрд╕реНрдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ:
images.jacksondunstan.com/articles/1179/performance_dot.pngрдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкреЙрдЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЗрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ "рдЗрдВрдбреЗрдХреНрд╕" рдСрдкрд░реЗрдЯрд░ (рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╛рди рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред
рдЕрдм "рдЗрдВрдбреЗрдХреНрд╕" рдСрдкрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ:
images.jacksondunstan.com/articles/1179/performance_index.pngрдпрд╣ рдЧреНрд░рд╛рдл рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЕрдВрддрд░ "рдЧрд╛рдпрдм" рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдбрд╛рдпрдиреЗрдорд┐рдХ рдХрдХреНрд╖рд╛рдУрдВ, рдбрд┐рдХреНрд╢рдирд░реА рдФрд░ рдПрд░реЗ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдзреАрдореЗ рд╣реИрдВред рдЕрдЬреАрдм рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЦреЗрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред
рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣реБрдБрдЪ рд╡рд┐рдзрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд░реЗрдЦрд╛рдВрдХрди рджреЗрдЦрддреЗ рд╣реИрдВред "рдЗрдВрдбреЗрдХреНрд╕" рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд▓реЗрдЦрди рд╣рдореЗрд╢рд╛ рдкрдврд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 10% рдзреАрдорд╛ рд╣реЛрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, "рдмрд┐рдВрджреБ" рдСрдкрд░реЗрдЯрд░ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ, рдбрд┐рдХреНрд╢рдирд░реА, рдФрд░ рдПрд░реЗ рдХреЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рдХреНрд▓рд╛рд╕реЗрд╕ "рдЗрдВрдбреЗрдХреНрд╕" рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдкрд╡рд╛рдж рдбрд╛рдпрдиреЗрдорд┐рдХ рдХреНрд▓рд╛рд╕ рдФрд░ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рдЧрднрдЧ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдЕрдВрддрд░ рдкреНрд▓рд╕ / рдорд╛рдЗрдирд╕ 20% рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреЛрдб рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕ рдПрдХреНрд╕реЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдкрд╡рд╛рдж рддрдм рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ "рд╢реБрджреНрдз" рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЗрддрдиреЗ рдзреАрдореЗ рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред