Shortcut & Serega
Serega Serega
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π‘Ρ‚Ρ€Π΅Π»Π°, ΡΠ»Ρ‹ΡˆΠ°Π», Ρ‚Ρ‹ Π·Π° Ρ€Π΅ΠΊΠΎΡ€Π΄Ρ‹ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Π΅ гоняСшься. Когда-Π½ΠΈΠ±ΡƒΠ΄ΡŒ задумывался, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ‚Π°ΠΉΠΌΠΈΠ½Π³Π° ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈ ΠΊ ΡƒΡΠΊΠΎΡ€Π΅Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠ΄Π°? Π― Ρ‚ΡƒΡ‚ поигрался с рСкурсивным Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ, ΠΈ ΠΎΠ½ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях быстрСС ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ получаСтся Π½Π° микросСкунды. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΌΠ΅Π½Ρ‚Π°Π»ΠΈΡ‚Π΅Ρ‚ спидраннСра Π²Ρ‹Π»ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΌΠΈΠΊΡ€ΠΎ-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ программист Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚.
Shortcut Shortcut
Π”Π°, каТдая сСкунда Π½Π° счСту Π²Π΅Π·Π΄Π΅. Запусти ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒ Π½Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ прСдсказания Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠΉ, ΠΈ сдСлай горячиС ΠΏΡƒΡ‚ΠΈ максимально прямыми. Если Π½Π°ΠΉΠ΄Ρ‘ΡˆΡŒ ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½ΠΎΠ΅ условиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ – это ΡƒΠΆΠ΅ ΠΏΠΎΠ±Π΅Π΄Π°. ПокаТи ΠΌΠ½Π΅ ΠΌΠΈΠΊΡ€ΠΎΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΎΡ„ΠΈ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ – Π²Ρ‹Π·ΠΎΠ² принят.
Serega Serega
ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²ΠΎΡ‚ кусочСк ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Ρ€ΡŽΠΊ с Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ маской. Π― ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π» Ρ…Π²ΠΎΡΡ‚ΠΎΠ²ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° Π² Ρ†ΠΈΠΊΠ» ΠΈ вмСсто условного вСтвлСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° маску. Код выглядит Ρ‚Π°ΠΊ: ```c++ int fact(int n){ int res=1; while(n>1){ int mask = -(n & 1); // всС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, Ссли Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅, Π½ΡƒΠ»ΠΈ, Ссли Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ res *= (n & mask) | (~mask & 1); n--; } return res; } ``` Π­Ρ‚ΠΎΡ‚ Ρ‚Ρ€ΡŽΠΊ с `mask` ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ `if (n%2)`, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ процСссор Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Β«Π·Π°Π²ΠΈΡΠ°Ρ‚ΡŒΒ» ΠΈΠ·-Π·Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ прСдсказания. Π― ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π» Π΅Π³ΠΎ Π½Π° свСТСм Intel Core ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» сниТСниС Π½Π° нСсколько сотСн Ρ†ΠΈΠΊΠ»ΠΎΠ² Π½Π° Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ рСкурсивным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ. Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡˆΡŒ Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· `perf` ΠΈΠ»ΠΈ `gprof`, ΡƒΠ²ΠΈΠ΄ΠΈΡˆΡŒ, ΠΊΠ°ΠΊ ΠΏΡƒΡ‚ΡŒ Π±Π΅Π· Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠΉ Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π² горячСм Ρ†ΠΈΠΊΠ»Π΅. Π‘ΠΎΠΎΠ±Ρ‰ΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ β€” Ссли смогу Π²Ρ‹ΠΆΠ°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ большС, ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ.