предисловие
Название некомпетентно, пожалуйста, положите свои ножи для разделки мяса, посмотрите вниз и увидите, что вы ничего не можете с собой поделать, пожалуйста, будьте милосердны.
введение
Видите ли, я технолог интернет-компании, пью кофе, когда хочу пить, ем еду на вынос, когда голоден, и хожу в больницу, когда теряю сознание. Ипотеку не выплатили, машину купил сам, а в отпуске подрабатывал сверхурочно. И самое главное, я одинокая собака. Не думайте о статусе одинокого аристократа, пощечина отца и матери может заставить вас признать реальность.
История, которую я хочу рассказать, состоит из четырех слов:оптимизация производительности.
Я знаю, что друзья, которые увидят здесь в этот момент, обязательно вспотеют, нахмурятся и с опасным видом уставятся в экран телефона. Давай, я не боюсь.Оптимизация производительности сделана не очень хорошо, а вы все еще думаете о поиске объектов?
Вопросы для интервью, с которыми я столкнулся в прошлом году
Интервьюер:Что вы сделали для оптимизации производительности?
отвечать:懒加载
,缓存
,离线包
,并行化
Интервьюер:Как устроен офлайн-пакет?
Ответ: Это сделать снимок домашней страницы и передать его на локальный путь родной детской обуви, когда приложение упаковано.
Интервьюер:Итак, есть ли у вас какая-либо конкретная реализация для ленивой загрузки или кэширования?
Ответ: Да.骨架屏、SSR。
Интервьюер:Каковы преимущества и недостатки каркасного экрана и SSR?
отвечать:骨架屏适合在页面加载延迟毕竟高的情况下使用,但是骨架屏的灰色豆腐块需求视觉切图,这个图是需要缓存在客户端的。如果大范围使用骨架屏,可能会导致客户端缓存过多的图片,反而得不偿失吧。SSR实施成本会高一些,如果不是特别重要的页面不建议使用。 当网络环境很差劲的情况下,依然还是要做降级处理的,也就是客户端渲染。
Интервьюер: У вас есть конкретное решение проблемы с белым экраном над сгибом?
Моя внутренняя ОС: Я начал MMP в своем сердце, и соавторство в том, что я сказал ранее, не является решением?
отвечать:方法有不少,但具体还是要看公司的环境了。毕竟不是所有手段都能用上。 但首屏很重要的一个点是做好缓存。例如利用好http缓存。。。
Резюме
В то время почти все интервью были основаны на том, что интервьюер хлестал кнутом, а затем я дрожал, когда отвечал. Ответы на вопросы оптимизации производительности в основном такие же, как и в старых четырех. Но проблема в том, что эти ответы может дать и кто-то другой. Грубо говоря, то, что вы говорите, на самом деле не принадлежит вам. Тогда позиция немного выше и у вас нет шансов.
История интервью, которая произошла вчера
Интервьюер:Как построена платформа мониторинга производительности?
A: Сначала подтвердите показатели эффективности. Например, время рендеринга первого экрана, время белого экрана страницы, скорость второй карты, FPS, среднее время запроса и т. д.
(прервано, потому что интервьюер добрался до интересующей его темы)
Интервьюер: вашFPS
Как это рассчитывается?
отвечать:FPS
(Frames Per Second
, отображение кадров в секунду). в целомFPS
существует60
Вверху страница ровная и не застревает. Но это не так, например, вы играете в игры (типа едите курицу, King of Glory), хотя фпс ниже, чем60
, но мы чувствовали, что он был гладким и не заикался.
FPS ниже 60 не означает заикания, а FPS выше 60 не обязательно означает отсутствие заиканий. Например, первые 60 кадров рендерятся очень быстро (1 кадр за 10 мс), а следующие 3 кадра рендерятся очень медленно (1 кадр за 20 мс), поэтому средний FPS равен 95, что выше стандартного 60. Это застрянет? Очевидно, Катон.
Таким образом, ключевым моментом в том, застрял он или нет, является то, занимает ли рендеринг одного кадра слишком много времени.
但难点在于,在浏览器上,我们没办法拿到单帧渲染耗时的接口。所以我们只能拿 FPS 来计算,只要 FPS 保持稳定,且值比较低,就没问题。我们给它定的标准是连续 3 帧不低于 20 FPS,且保持稳定。
(Глаза интервьюера начинают светиться.)
Интервьюер:Тогда вы можете написать это.
// **开始在线写代码。**
// 以h5 为例
/*
利用 requestAnimationFrame 在一秒内执行 60 次(在不卡顿的情况下)这一点,
假设页面加载用时 X ms,这期间 requestAnimationFrame 执行了 N 次,
则帧率为1000* N/X,也就是FPS。
*/
/*但不同户客户端差异很大,需要考虑兼容性。
在这里我们定义 fpsCompatibility 表示兼容性方面的处理,在浏览器不支持
requestAnimationFrame 时,利用 setTimeout 来模拟实现。
在 fpsLoop 里面完成 FPS 的计算。
最后通过遍历 fpsList 来判断是否连续三次 fps 小于20。
*/
const fpsCompatibility = function () {
return (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
function (callback) {
window.setTimeout(callback, 1000 / 60);
}
);
}();
const fpsConfig = {
lastTime: performance.now(), // performance 是一个浏览器提供的API
lastFameTime: performance.now(),
frame: 0
}
const fpsList = [];
const fpsLoop = function () {
const first = performance.now();
const diff = (first - fpsConfig.lastFameTime);
fpsConfig.lastFameTime = first;
const fps = Math.round(1000 / diff);
fpsConfig.frame = fpsConfig.frame + 1;
if (first > 1000 + fpsConfig.lastTime) {
const fps = Math.round((fpsConfig.frame * 1000) / (first - fpsConfig.lastTime));
fpsList.push(fps);
console.log(`time: ${new Date()} fps is:`, fps);
fpsConfig.frame = 0;
fpsConfig.lastTime = first;
};
fpsCompatibility(fpsLoop);
}
fpsLoop();
function checkFPS(fpsList, below = 20, last = 3) {
let count = 0;
for (let i = 0; i < fpsList.length; i++) {
if (fpsList[i] && fpsList[i] < below) {
count++;
} else {
count = 0
}
if (count >= last) {
return true
}
}
return false
}
checkFPS(fpsList);
// 如果连续判断 3次 FPS 都小于20,就认为是卡顿。
Интервьюер:Ну да. Как вы представляете описания этих показателей эффективности?
отвечать:手动埋点
,自动化采集
,可视化埋点
Интервьюер:Как разработать производительный SDK, есть идеи?
Ответ: производительностьSDK
дизайн, один接入
дизайн, другойSDK运行设计
.
- Дизайн доступа к SDK
- Вы можете инкапсулировать скрипты, собранные с первого экрана, белого экрана и заморозить до этого. и пусть скрипт запускается автоматически.
- Хорошо поработайте с документацией по использованию/справке SDK, чтобы упростить использование.
- Помощник по анализу производительности может быстро найти некоторые простые основные проблемы.
- Работающий дизайн SDK
- Проблемы совместимости, используйте собственный JavaScript для написания коллекции индикаторов производительности для достижения кросс-конечной коллекции
- Отказоустойчивые механизмы, такие как попытка захвата захвата, а затем отчет об исключении
- Проверьте производительность SDK и подтвердите распределение модели в соответствии с фактическим использованием пользователя.
Интервьюер:Что касается ненормальной отчетности, которую вы только что упомянули, как разработана ваша стратегия отчетности?
О: После сбора показателей производительности лучше сначала отфильтровать аномалии данных. Однако дизайн стратегии отчетности можно разделить на несколько частей.
- Фильтрация данных журнала
- Сначала отфильтруйте исключения данных
- Аномальные данные включают ошибки вычислений, допустимые выбросы, максимальные значения, минимальные значения и т. д.
- Стратегия выборки данных
- Полные или выборочные данные зависят от ежедневной активности.
- Как правило, ежедневная активность составляет менее 10 Вт, и вы можете выбрать полную сумму. Для APP с ежедневной активностью 1000 Вт необходимо выполнить выборку.
- Выбор модели отчета
- О ситуации в сильной сети сообщается напрямую, а о ситуации в слабой сети сначала сохраняется локально, а затем сообщается в случае сильной сети.
- Другие включают отчеты при запуске приложения, отчеты о пакетных данных и т. Д.
резюме
Какого черта насчет десяти оптимизаций производительности? Другое назначение, чтобы продолжить оптимизацию производительности, что, черт возьми?В последующие дни я сталкивался с интервьюерами, и вопросы, которые не беспокоили меня в течение длительного времени, были окончательно решены.«Интервьюеры»Это получил ответ.
Она любит чай с молоком и кофе со вкусом клубники, но предпочитает клубничное мороженое. Цена на клубничное мороженое была написана рядом с маркой спецпредложения, и я закрывала глаза. Ты даже не видишь его, когда на него указывают пальцем, и втайне радуешься, когда слышишь, что хочешь чего-нибудь подешевле... Ты действительно считаешь людей глупыми?
Я заменил «она» на «интервьюер» и сказал новый абзац.
Интервьюер любит спрашивать, что вы сделали для оптимизации производительности, но интервьюер хочет знать, что сделали вы и чего не сделали другие. Рядом со старым четвертым типом написано, для какой сцены подходит, но я закрывал глаза. Если на тебя показывают пальцем, ты этого не понимаешь и втайне радуешься, когда слышишь что-то простое.Ты действительно глуп как интервьюер?
Так что, пожалуйста, поверьте, что свидания вслепую начинают противостоять друг другу с первой стороны. Тот, кто проигрывает первым, часто теряет инициативу. Если вы сами нанесли себе ущерб, вы потеряли достаточно острую наблюдательность. Человеческая природа одинакова, легко быть беспечным в отношении того, что вам нравится, и более бдительно в отношении того, что вам не нравится.
Наконец,Все, что достаточно глубоко, — это нож.Оптимизация производительности не является исключением.
(Всего наилучшего.)