Первая проблема, которую вам нужно решить, это слово «узкое место», потому что оно означает все и ничего.Это создает впечатление какого-то сжатия в потоке того, что машина, кажется, делает, которая настолько быстра, что это похоже на воду, текущую по трубам.
Вычисления не такие.Я считаю, что это помогает увидеть, как работает очень простой, медленный компьютер, а именно Компьютер ретранслятора Гарри Портера .Вы можете наблюдать за ним с очень низкой тактовой частотой, выполняя каждый маленький шаг в каждой инструкции и заканчивая их до того, как она начнет следующую.(Очевидно, что в наши дни машины представляют собой многоядерный, конвейерный, многоуровневый кэш, бла-бла. Это все хорошо, но это заставляет вас думать, что вычисления похожи на поток воды, и это мешает вам понять производительность программного обеспечения.)
Думайте о любом компьютере и программном обеспечении так же, как в этом ретрансляторе, за исключением шкалы наносекунд, а не секунд.Когда компьютер выполняет вычисления в программе, он выполняет инструкции одну за другой.Назовите это "X".Когда программа хочет прочитать или записать некоторые биты на внешнее оборудование, она должна запросить это оборудование для запуска, а затем она должна найти способ убить время, пока результат не будет готов.Назовите это "у".Это может быть простой цикл или запуск другого «потока» и т. Д.
Таким образом, выполнение программы выглядит следующим образом:
XXXXXyyyyyyyXXXXXXXXyyyyyyy
Если в нем больше «y», чем »X, мы склонны называть это «I / O bound».Если нет, то мы могли бы назвать это «вычислимым»В любом случае, это всего лишь пропорция времени, потраченного.
Если вы говорите, что он «связан с памятью», это похоже на ввод-вывод, за исключением того, что это может быть другое внешнее оборудование.Он по-прежнему занимает некоторую часть общей последовательной временной шкалы.
Теперь для любой задачи существует бесконечно много программ, которые могут быть написаны для ее выполнения.Некоторые из них будут выполнены за меньшее количество шагов, чем все остальные.Когда вам нужна производительность, вы хотите максимально приблизиться к написанию одной из этих программ.Один из способов сделать это - найти «X» и «y» s , от которых вы можете избавиться , и избавиться от как можно большего числа.
Теперь, в пределах одногонить, если вы случайно выберете "X" или "y", как вы сможете определить, можете ли вы от него избавиться?Узнайте, какова его цель!Это «X» или «y» представляет момент в последовательности выполнения программы, и если вы посмотрите на состояние программы в то время и посмотрите на исходный код, вы сможете выяснить, почему этот моменттратится.Сделайте это несколько раз.Как только вы видите, что два момента времени имеют похожую, но не совсем необходимую цель, вероятно, их становится намного больше, и вы нашли то, от чего вы можете избавиться.Если вы это сделаете, программа больше не будет тратить это время.
Это основная идея этого метода настройки производительности. Вот пример, где этот метод использовался в течение нескольких итераций для удаления более 97% времени, затрачиваемого на программу.Не все программы настолько далеки от оптимальных.(Некоторые намного дальше.) Многим программам просто нужно выполнить определенное количество «X» или «Y», и нет никакого способа обойти это.Тем не менее, часто очень удивительно, сколько места вы можете найти для ускорения в другом, совершенно хорошем коде - при условии - вы забываете о «узких местах» и ищите шаги, которые он делает со временем, которые можно было бы удалить или сделать лучше.
Это просто.