К
Канал Андрея про бекенд
@andrey_threads1.7K подп.
3.2Kпросмотров
13 февраля 2025 г.
statsScore: 3.6K
Ответ 20 на предыдущий опрос может быть не очевидным с первого взгляда. Мы получаем его, воспользовшись законом Амдала 🧶 Итак, в этом посте будем вычислять ответ ответ, опираясь только на теорию. 🎯 Нам нужно увеличить пропускную способность в 10 раз (с 10 операций в секунду до 100). Кажется, что, если один поток может выполнять 10 операций в секунду, то нам нужно увеличить количество потоков пропорционально, до 10. 🔩 Однако, в данной задаче есть нюанс, который делает рост производительности не линейным относительно количества потоков. Иными словами, увеличение потоков в 10 раз не дает пропорциональный выигрыш в производительности. 🔓 Этим нюансом является наличие функции prepareData, которая требует выполнения под локом. Фактически, функция не параллелизуется. Сколько бы потоков мы не добавили, у нас не получится получить для нее никакой выигрыш, говорит закон Амдала. То есть время, которое prepareData занимает от общего времени выполнения, всегда будут оставаться прежним. 🎁 Зато мы можем получать линейный выигрыш от параллелизации остальных 95%, которые занимает функция process. Доля кода, который никак не получится распараллелить (последовательного) 0.05 (5%). Доля параллелизуемого - 0.95 (95%). Давайте считать: 1. Если у вас 10 потоков, то вы можете в 10 раз ускорить параллелизуемый код, то есть из 0.95 превратить его в 0.095. Сложим теперь доли ускоренного и неускоряемого кода: 0.05 + 0.095 = 0.145. (14.5%, то есть мы стали быстрее на 85.5%). Чтобы понять ВО сколько раз мы ускорились надо единицу поделить на 0.145, получится 6.89. А нам необходим прирост в 10 раз. 2. Если у вас 15 потоков, то вы можете в 15 раз ускорить параллелизуемый код. 0.95 -> 0.063. 0.05 + 0.063 = 0.113. 1 / 0.113 = 8.84. Все еще не 10! 3. Если у вас 20 потоков, то вы можете в 20 раз ускорить параллелизуемый код. 0.95 -> 0.0475. 0.05 + 0.0475 = 0.0975. 1 / 0.0975 = 10.25. Ура! 🏆 Получается, что нам нужно 20 потоков (19 тоже хватит на самом деле). 📈 Данный пост демонстрирует нам закон Амдала, который бывает чрезмерно пессимистичным в своей оценке и рассматривает худший сценарий исполнения. Однако, стоит вынести из него важную идею: ❗️❗️❗️Производительность вашего кода не всегда растет пропорционально увеличению количества потоков. Чем больше в вашем коде фрагментов, требующих последовательного (однопоточного) выполнения, тем меньше прирост производительности при параллелизации. ⏬ В следующих постах проверим, выполняется ли закон Амдала на практике для данного кода и увидим еще один способ увеличить пропускную способность нашей функции.
3.2K
просмотров
2572
символов
Да
эмодзи
Нет
медиа

Другие посты @andrey_threads

Все посты канала →
Ответ 20 на предыдущий опрос может быть не очевидным с перво — @andrey_threads | PostSniper