НСудачная ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΡ€ΠΎ ускорСниС рСфлСксии

Π‘Ρ€Π°Π·Ρƒ объясню Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ Π΄Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ, Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ совСт ΠΏΠΎ ΡƒΡΠΊΠΎΡ€Π΅Π½ΠΈΡŽ использования Ρ€Π΅Ρ„Π»Π΅ΠΊΡˆΠ΅Π½Π° Π½Π° простом, Π½ΠΎ рСалистичном ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Ρ…ΠΎΠ΄Π΅ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΈΠ½Π³Π° Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ рСфлСксия Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΊΠ°ΠΊ я Π΄ΡƒΠΌΠ°Π», LINQ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ снилось Π² ΠΊΠΎΡˆΠΌΠ°Ρ€Π°Ρ…. А Π² ΠΈΡ‚ΠΎΠ³Π΅ оказалось, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠΉ Π΅Ρ‰Π΅ ΠΈ Π±Ρ‹Π»Π° Π΄ΠΎΠΏΡƒΡ‰Π΅Π½Π° ошибка Π² замСрах… ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ этой ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ истории ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚ΠΎΠΌ ΠΈ Π² коммСнтариях. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ достаточно Π±Ρ‹Ρ‚ΠΎΠ²ΠΎΠΉ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ дСлаСтся Π² энтСрпрайзС, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ достаточно интСрСсная, ΠΊΠ°ΠΊ ΠΌΠ½Π΅ каТСтся, дСмонстрация ΠΆΠΈΠ·Π½ΠΈ: влияния Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ основного ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΠΈ Π±Ρ‹Π»ΠΎ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΠΈΠ·-Π·Π° внСшнСй Π»ΠΎΠ³ΠΈΠΊΠΈ: Moq, Autofac, EF Core ΠΈ ΠΏΡ€ΠΎΡ‡Π΅ΠΉ «обвязки».

Начал я Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ΄ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΡ‚ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ: Why is Reflection slow

Как Π²ΠΈΠ΄Π½ΠΎ, Π°Π²Ρ‚ΠΎΡ€ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ скомпилированныС Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹ вмСсто прямого обращСния ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Ρ‚ΠΈΠΏΠΎΠ² отраТСния ΠΊΠ°ΠΊ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ способ сильно ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния. Π•ΡΡ‚ΡŒ Ρ‚Π°ΠΌ Π΅Ρ‰Π΅, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, IL эмиссия, Π½ΠΎ Π΅Ρ‘ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это самый Ρ‚Ρ€ΡƒΠ΄ΠΎΠ·Π°Ρ‚Ρ€Π°Ρ‚Π½Ρ‹ΠΉ способ выполнСния Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡Ρ€Π΅Π²Π°Ρ‚ ошибками.

Учитывая, Ρ‡Ρ‚ΠΎ я придСрТивался всСгда Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ мнСния ΠΎ скорости рСфлСксии, особо ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ сомнСния Π²Ρ‹Π²ΠΎΠ΄Ρ‹ Π°Π²Ρ‚ΠΎΡ€Π° я Π½Π΅ собирался.

Π― Π½Π΅ Ρ€Π΅Π΄ΠΊΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡΡŒ с Π½Π°ΠΈΠ²Π½Ρ‹ΠΌ использованиСм рСфлСксии Π² энтСрпрайзС. БСрСтся Ρ‚ΠΈΠΏ. БСрСтся информация ΠΎ свойствС. ВызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ SetValue, ΠΈ всС Ρ€Π°Π΄ΡƒΡŽΡ‚ΡΡ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π΅Π»ΠΎ Π² Ρ†Π΅Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ»Π΅, всС Π΄ΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹. Π›ΡŽΠ΄ΠΈ вСсьма Π½Π΅Π³Π»ΡƒΠΏΡ‹Π΅ β€” синиоры ΠΈ Ρ‚ΠΈΠΌΠ»ΠΈΠ΄Ρ‹ β€” ΠΏΠΈΡˆΡƒΡ‚ свои Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π° object, основывая Π½Π° Ρ‚Π°ΠΊΠΎΠΉ Π½Π°ΠΈΠ²Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Β«ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅Β» ΠΌΠ°ΠΏΠΏΠ΅Ρ€Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π‘ΡƒΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ²Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ: Π±Π΅Ρ€Π΅ΠΌ всС поля, Π±Π΅Ρ€Π΅ΠΌ всС свойства, ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ Π½ΠΈΠΌ: ΠΏΡ€ΠΈ совпадСнии ΠΈΠΌΠ΅Π½ Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠ° выполняСм SetValue. ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΠΈ Π»ΠΎΠ²ΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° ΠΏΡ€ΠΎΠΌΠ°Ρ…Π°Ρ… Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π½Π΅ нашли ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ свойство Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ², Π½ΠΎ ΠΈ Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄, Π΄ΠΎΠ±ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Try/catch.

Π― Π²ΠΈΠ΄Π΅Π», ΠΊΠ°ΠΊ люди ΠΏΠ΅Ρ€Π΅ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°ΡŽΡ‚ парсСры ΠΈ ΠΌΠ°ΠΏΠΏΠ΅Ρ€Ρ‹, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‡ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²ΠΎΠΎΡ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½Π½Ρ‹Π΅ Π΄ΠΎ Π½ΠΈΡ… вСлосипСды. Π― Π²ΠΈΠ΄Π΅Π», ΠΊΠ°ΠΊ люди прячут свои Π½Π°ΠΈΠ²Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π° стратСгиями, Π·Π° интСрфСйсами, Π·Π° ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΡΠΌΠΈ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ это ΠΈΠ·Π²ΠΈΠ½ΠΈΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π²Π°ΠΊΡ…Π°Π½Π°Π»ΠΈΡŽ. ΠžΡ‚ Ρ‚Π°ΠΊΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ я Π²ΠΎΡ€ΠΎΡ‚ΠΈΠ» нос. По Ρ„Π°ΠΊΡ‚Ρƒ, Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ я Π½Π΅ замСрял, ΠΈ ΠΏΡ€ΠΈ возмоТности просто мСнял Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π° Π±ΠΎΠ»Π΅Π΅ Β«ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽΒ», Ссли Ρ€ΡƒΠΊΠΈ Π΄ΠΎΡ…ΠΎΠ΄ΠΈΠ»ΠΈ. ΠŸΠΎΡ‚ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π·Π°ΠΌΠ΅Ρ€Ρ‹, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ Π½ΠΈΠΆΠ΅, мСня ΡΠ΅Ρ€ΡŒΡ‘Π·Π½ΠΎ смутили.

Π”ΡƒΠΌΠ°ΡŽ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· вас, читая Π ΠΈΡ…Ρ‚Π΅Ρ€Π° ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΎΠ², ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ со Π²ΠΏΠΎΠ»Π½Π΅ справСдливым ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ рСфлСксия Π² ΠΊΠΎΠ΄Π΅ β€” это явлСниС ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ ΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ΡΡ Π½Π° пСрформансС прилоТСния.

Π’Ρ‹Π·ΠΎΠ² отраТСния Π²Ρ‹Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚ CLR ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ сборки Π² поисках Π½ΡƒΠΆΠ½ΠΎΠΉ, ΠΏΠΎΠ΄Ρ‚ΡΠ³ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ ΠΈΡ… ΠΈ Ρ‚.Π΄. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, рСфлСксия Π²ΠΎ врСмя ΠΎΠ±Ρ…ΠΎΠ΄Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π°Π»Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ большого объСма памяти. РасходуСм ΠΏΠ°ΠΌΡΡ‚ΡŒ, CLR расчСхляСт Π“Π¦ ΠΈ понСслись Ρ„Ρ€ΠΈΠ·Ρ‹. Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΏΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅. ΠžΠ³Ρ€ΠΎΠΌΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΌΡ‹ памяти соврСмСнных ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½ сСрвСров ΠΈΠ»ΠΈ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… машин Π½Π΅ ΡΠΏΠ°ΡΠ°ΡŽΡ‚ ΠΎΡ‚ высоких Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. ЀактичСски, Ρ‡Π΅ΠΌ большС памяти, Ρ‚Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π—ΠΠœΠ•Π’Π˜Π’Π•, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π“Π¦. РСфлСксия – это, ΠΏΠΎ ΠΈΠ΄Π΅Π΅, лишняя красная тряпка для Π½Π΅Π³ΠΎ.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, всС ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΈ IoC ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹, ΠΈ Π΄Π°Ρ‚Π° ΠΌΠ°ΠΏΠΏΠ΅Ρ€Ρ‹, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚Π°ΠΊ ΠΆΠ΅ основан Π½Π° рСфлСксии, ΠΎΠ΄Π½Π°ΠΊΠΎ вопросов ΠΊ ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚. НСт, Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй ΠΈ абстрагирования ΠΎΡ‚ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ внСшнСго ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ контСкста ΡΡ‚ΠΎΠ»ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π²Π΅Ρ‰ΠΈ, Ρ‡Ρ‚ΠΎ пСрформансом Π½Π°ΠΌ приходится ΠΆΠ΅Ρ€Ρ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² любом случаС. ВсС ΠΏΡ€ΠΎΡ‰Π΅ – это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ сильно ΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнныС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ основаны Π½Π° Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ рСфлСксии, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ всСвозмоТныС ухищрСния для Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΉ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это кСш. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ β€” это Expressions ΠΈ скомпилированныС ΠΈΠ· Π΄Π΅Ρ€Π΅Π²Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹. Π’ΠΎΡ‚ ΠΆΠ΅ Π°Π²Ρ‚ΠΎΠΌΠ°ΠΏΠΏΠ΅Ρ€ Π΄Π΅Ρ€ΠΆΠΈΡ‚ ΠΏΠΎΠ΄ собой ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏΡ‹ с функциями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ΄ΠΈΠ½ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° рСфлСксии.

Как это достигаСтся? По сути, это Π½Π΅ отличаСтся ΠΎΡ‚ Π»ΠΎΠ³ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сама ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° JIT. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚ΠΎΡ‚ компилируСтся (ΠΈ, Π΄Π°, этот процСсс Π½Π΅ быстрый), ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π°Ρ… ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаСтся ΡƒΠΆΠ΅ скомпилированному ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, ΠΈ Ρ‚ΡƒΡ‚ особых просадок ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

Π’ нашСм случаС Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ JIT компиляциСй ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ скомпилированноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ с Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎ ΠΈ Π΅Π³ΠΎ AOT Π°Π½Π°Π»ΠΎΠ³ΠΈ. На ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π½Π°ΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡ€ΠΈΠ΄ΡƒΡ‚ выраТСния.

ΠšΡ€Π°Ρ‚ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ рСфлСксии Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°, содСрТащСго ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ВсС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ со свСдСниями ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… Ρ‚ΠΎΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² сохраняСмых Π²Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² полях вашСго Ρ‚ΠΈΠΏΠ° – Π²ΠΎΡ€ΠΊΠ΅Ρ€Π°.

Π›ΠΎΠ³ΠΈΠΊΠ° Π² этом Π΅ΡΡ‚ΡŒ. Π—Π΄Ρ€Π°Π²Ρ‹ΠΉ смысл Π½Π°ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚ΠΎ это слСдуСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

ЗабСгая Π²ΠΏΠ΅Ρ€Π΅Π΄, слСдуСт ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ кСш Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с рСфлСксиСй ΠΈΠΌΠ΅Π΅Ρ‚ свои прСимущСства, Π΄Π°ΠΆΠ΅ Ссли Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ компиляции Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. БобствСнно, Ρ‚ΡƒΡ‚ я прост ΠΏΠΎΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽ тСзисы Π°Π²Ρ‚ΠΎΡ€Π° ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡΡΡ‹Π»Π°ΡŽΡΡŒ Π²Ρ‹ΡˆΠ΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎ ΠΊΠΎΠ΄Π΅. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ основан Π½Π° ΠΌΠΎΠ΅ΠΉ Π½Π΅Π΄Π°Π²Π½Π΅ΠΉ Π±ΠΎΠ»ΠΈ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ Π² ΡΠ΅Ρ€ΡŒΡ‘Π·Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅ ΡΠ΅Ρ€ΡŒΡ‘Π·Π½ΠΎΠΉ ΠΊΡ€Π΅Π΄ΠΈΡ‚Π½ΠΎΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ. ВсС энтити Π²Ρ‹ΠΌΡ‹ΡˆΠ»Π΅Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ догадался.

Π•ΡΡ‚ΡŒ нСкая ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ. ΠŸΡƒΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Contact. Π•ΡΡ‚ΡŒ письма со стандартизированным Ρ‚Π΅Π»ΠΎΠΌ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… парсСр ΠΈ Π³ΠΈΠ΄Ρ€Π°Ρ‚ΠΎΡ€ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ эти самыС ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρ‹. ΠŸΡ€ΠΈΡˆΠ»ΠΎ письмо, ΠΌΡ‹ Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ, Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈ Π½Π° ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, создали ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚, сохранили Π² Π±Π΄.

Π­Ρ‚ΠΎ элСмСнтарно. Допустим, Ρƒ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ свойства ЀИО, Возраст ΠΈ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π½Ρ‹ΠΉ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½. Π­Ρ‚ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² письмС. Π’Π°ΠΊ ΠΆΠ΅ бизнСс Ρ…ΠΎΡ‡Π΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ саппорты ΠΌΠΎΠ³Π»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ для ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π° свойств энтити Π½Π° ΠΏΠ°Ρ€Ρ‹ Π² Ρ‚Π΅Π»Π΅ письма. На Ρ‚ΠΎΡ‚ случай, Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ опСчатался Π² шаблонС ΠΈΠ»ΠΈ Ссли Π΄ΠΎ Ρ€Π΅Π»ΠΈΠ·Π° Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ срочно Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ ΠΎΡ‚ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€Π°, ΠΏΠΎΠ΄ΡΡ‚Ρ€ΠΎΠΈΠ²ΡˆΠΈΡΡŒ ΠΏΠΎΠ΄ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. Π’ΠΎΠ³Π΄Π° Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΡ€Ρ€Π΅Π»ΡΡ†ΠΈΡŽ ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π° ΠΌΡ‹ смоТСм Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π΄Π΅ΡˆΠ΅Π²Ρ‹ΠΉ датафикс. Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ.

Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ, создаСм тСсты. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Код я ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Ρƒ: исходников ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΈ ΠΎΠ½ΠΈ доступны Π½Π° GitHub ΠΏΠΎ ссылкС Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡ… Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ, Π·Π°ΠΌΡƒΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎ нСузнаваСмости ΠΈ Π·Π°ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ это Π±Ρ‹ сказалось Π² вашСм случаС. ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄ Π΄Π²ΡƒΡ… ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π³ΠΈΠ΄Ρ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» Π±Ρ‹Ρ‚ΡŒ быстрым ΠΎΡ‚ Π³ΠΈΠ΄Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» Π±Ρ‹Ρ‚ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌ.

Π›ΠΎΠ³ΠΈΠΊΠ° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ: ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΠ°Ρ€Ρ‹, сформированныС Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ парсСра. Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ LINQ – это парсСр ΠΈ базовая Π»ΠΎΠ³ΠΈΠΊΠ° Π³ΠΈΠ΄Ρ€Π°Ρ‚ΠΎΡ€Π°, Π΄Π΅Π»Π°ΡŽΡ‰Π°Ρ запрос ΠΊ контСксту Π±Π΄ ΠΈ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΊΠ»ΡŽΡ‡ΠΈ с ΠΏΠ°Ρ€Π°ΠΌΠΈ ΠΎΡ‚ парсСра (для этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Π±Π΅Π· LINQ для сравнСния). Π”Π°Π»Π΅Π΅ ΠΏΠ°Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² основной ΠΌΠ΅Ρ‚ΠΎΠ΄ Π³ΠΈΠ΄Ρ€Π°Ρ†ΠΈΠΈ ΠΈ значСния ΠΏΠ°Ρ€ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ свойства энтити.

«Быстрый» (ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ Fast Π² Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ°Ρ…):

 protected override Contact GetContact(PropertyToValueCorrelation[] correlations)
        {
            var contact = new Contact();
            foreach (var setterMapItem in _proprtySettersMap)
            {
                var correlation = correlations.FirstOrDefault(x => x.PropertyName == setterMapItem.Key);
                setterMapItem.Value(contact, correlation?.Value);
            }
            return contact;
        }

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ статичСская коллСкция с сСттСрами ΠΏΡ€ΠΎΠΏΠ΅Ρ€Ρ‚Π΅ΠΉ – скомпилированными лямбдами, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ сСттСр энтити. Π‘ΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ:

        static FastContactHydrator()
        {
            var type = typeof(Contact);
            foreach (var property in type.GetProperties())
            {
                _proprtySettersMap[property.Name] = GetSetterAction(property);
            }
        }

        private static Action<Contact, string> GetSetterAction(PropertyInfo property)
        {
            var setterInfo = property.GetSetMethod();
            var paramValueOriginal = Expression.Parameter(property.PropertyType, "value");
            var paramEntity = Expression.Parameter(typeof(Contact), "entity");
            var setterExp = Expression.Call(paramEntity, setterInfo, paramValueOriginal).Reduce();
            
            var lambda = (Expression<Action<Contact, string>>)Expression.Lambda(setterExp, paramEntity, paramValueOriginal);

            return lambda.Compile();
        }

Π’ Ρ†Π΅Π»ΠΎΠΌ понятно. ΠžΠ±Ρ…ΠΎΠ΄ΠΈΠΌ свойства, создаСм ΠΏΠΎ Π½ΠΈΠΌ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ сСттСры, сохраняСм. ΠŸΠΎΡ‚ΠΎΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° Π½Π°Π΄ΠΎ.

Β«ΠœΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉΒ» (ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ Slow Π² Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ°Ρ…):

        protected override Contact GetContact(PropertyToValueCorrelation[] correlations)
        {
            var contact = new Contact();
            foreach (var property in _properties)
            {
                var correlation = correlations.FirstOrDefault(x => x.PropertyName == property.Name);
                if (correlation?.Value == null)
                    continue;

                property.SetValue(contact, correlation.Value);
            }
            return contact;
        }

Π’ΡƒΡ‚ сразу ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ свойства ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ SetValue.

Для наглядности ΠΈ Π² качСствС эталона Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» Π½Π°ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΈΡˆΠ΅Ρ‚ значСния ΠΈΡ… ΠΏΠ°Ρ€ коррСляции Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² поля энтити. ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ – Manual.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π±Π΅Ρ€Π΅ΠΌ BenchmarkDotNet ΠΈ исслСдуСм ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. И внСзапно… (спойлСр β€” это Π½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, подробности β€” Π½ΠΈΠΆΠ΅)

НСудачная ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΡ€ΠΎ ускорСниС рСфлСксии

Π§Ρ‚ΠΎ ΠΌΡ‹ Ρ‚ΡƒΡ‚ Π²ΠΈΠ΄ΠΈΠΌ? ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, побСдоносно носящиС прСфикс Fast, ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΡ€ΠΈ всСх ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π°Ρ… ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ с прСфиксом Slow. Π­Ρ‚ΠΎ справСдливо ΠΈ для Π°Π»Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ, ΠΈ для скорости Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΆΠ΅ стороны красивая ΠΈ элСгантная рСализация ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π° с использованиСм Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для этого ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² LINQ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, сильно ΠΎΡ‚ΠΆΠΈΡ€Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π Π°Π·Π½ΠΈΡ†Π° Π² порядки. ВСндСнция Π½Π΅ мСняСтся с Ρ€Π°Π·Π½Ρ‹ΠΌ количСством ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠ². Π Π°Π·Π½ΠΈΡ†Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠ°ΡΡˆΡ‚Π°Π±Π°Ρ…. Π‘ LINQ Π² 4 β€” 200 Ρ€Π°Π· ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, мусора большС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² Ρ‚Π°ΠΊΠΈΡ… ΠΆΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π°Ρ….

UPDATED

Π― Π½Π΅ ΠΏΠΎΠ²Π΅Ρ€ΠΈΠ» своим Π³Π»Π°Π·Π°ΠΌ, Π½ΠΎ Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½Π΅Π΅, Π½ΠΈ ΠΌΠΎΠΈΠΌ Π³Π»Π°Π·Π°ΠΌ, Π½ΠΈ ΠΌΠΎΠ΅ΠΌΡƒ ΠΊΠΎΠ΄Ρƒ Π½Π΅ ΠΏΠΎΠ²Π΅Ρ€ΠΈΠ» наш ΠΊΠΎΠ»Π»Π΅Π³Π° β€” Dmitry Tikhonov 0x1000000. ΠŸΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ² ΠΌΠΎΠΉ солюшн ΠΎΠ½ блСстящС ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» ΠΈ ΡƒΠΊΠ°Π·Π°Π» Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я ΠΈΠ·-Π·Π° ряда ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ½ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ упустил. ПослС исправлСния Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ Π±Π°Π³Π° Π² настройкС Moq, всС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ встали Π½Π° свои мСста. По Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ рСтСста основная тСндСнция Π½Π΅ мСняСтся β€” LINQ влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ всС Ρ€Π°Π²Π½ΠΎ сильнСС, Ρ‡Π΅ΠΌ рСфлСксия. Однако приятно, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° с компиляциСй Expression’ΠΎΠ² дСлаСтся Π½Π΅ зря, ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²ΠΈΠ΄Π΅Π½ ΠΈ ΠΏΠΎ Π°Π»Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ, ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ запуск, ΠΊΠΎΠ³Π΄Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ статичСскиС поля, Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅ΠΉ Ρƒ «быстрого» ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π½ΠΎ дальшС ситуация мСняСтся.

Π’ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ рСтСста:

НСудачная ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΡ€ΠΎ ускорСниС рСфлСксии

Π’Ρ‹Π²ΠΎΠ΄: ΠΏΡ€ΠΈ использовании Π² энтСрпрайзС рСфлСксии ΠΏΡ€ΠΈΠ±Π΅Π³Π°Ρ‚ΡŒ ΠΊ ухищрСниям особо Π½Π΅ трСбуСтся β€” LINQ соТрСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сильнСй. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² высоконагруТСнных ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ…, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π΅Ρ„Π»Π΅ΠΊΡΠΈΡŽ Π² Π²ΠΈΠ΄Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ компиляторов Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Β«Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽΒ» Π»ΠΎΠ³ΠΈΠΊΡƒ. Π’Π°ΠΊ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ рСфлСксии, ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния.

Код с Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΎΠΌ доступСн Ρ‚ΡƒΡ‚. ВсС ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΌΠΎΠΈ слова:
HabraReflectionTests

PS: ΠΊΠΎΠ΄ Π² тСстах ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ IoC, Π° Π² Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ°Ρ… – ΡΠ²Π½ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ я отсСк всС способныС ΡΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π·Π°ΡˆΡƒΠΌΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ„Π°ΠΊΡ‚ΠΎΡ€Ρ‹.

PPS: Бпасибо ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Dmitry Tikhonov @0x1000000 Π·Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΅ΠΉ ошибки Π² настройкС Moq, которая сказалась Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π·Π°ΠΌΠ΅Ρ€Π°Ρ…. Если Ρƒ ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ ΠΈΠ· Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ достаточная ΠΊΠ°Ρ€ΠΌΠ°, Π»Π°ΠΉΠΊΠ½ΠΈΡ‚Π΅ Π΅Π³ΠΎ, поТалуйста. Π§Π΅Π»ΠΎΠ²Π΅ΠΊ остановился, Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ вчитался, Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ» ΠΈ ΡƒΠΊΠ°Π·Π°Π» Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ это достойно уваТСния ΠΈ симпатии.

PPPS: спасибо Ρ‚ΠΎΠΌΡƒ Π΄ΠΎΡ‚ΠΎΡˆΠ½ΠΎΠΌΡƒ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ докопался ΠΊ стилистикС ΠΈ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΡŽ. Π― Π·Π° Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ ΠΈ удобство. Π”ΠΈΠΏΠ»ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Π°Ρ‡ΠΈ оставляСт ΠΆΠ΅Π»Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ, Π½ΠΎ ΠΊΡ€ΠΈΡ‚ΠΈΠΊΡƒ я ΡƒΡ‡Π΅Π». ΠŸΡ€ΠΎΡˆΡƒ ΠΊ снаряду.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com