체감 성능

Perceived Performance

실제 로딩 시간이 아니라 사용자가 "빠르다고 느끼는" 정도. 같은 시간이어도 보여주는 방식에 따라 체감이 달라집니다.

다른 이름: Perceived speed
···
html
<div class="stage">
  <div class="pane"><div class="tag">✗</div>
    <div class="spin" id="sp"></div>
    <div class="loaded" id="l1"><div class="av"></div><div class="ln"></div><div class="ln short"></div></div>
  </div>
  <div class="pane"><div class="tag">✓</div>
    <div class="sk" id="sk"><div class="sk-av"></div><div class="sk-ln"></div><div class="sk-ln short"></div></div>
  </div>
</div>
css
.stage{width:94%;height:88%;display:flex;gap:6%}
.pane{position:relative;flex:1;border-radius:14px;border:1px solid var(--line);background:var(--surface);display:grid;place-items:center;overflow:hidden}
.tag{position:absolute;top:8px;left:10px;font:700 10.5px/1 monospace;color:var(--muted)}
.spin{width:22px;height:22px;border-radius:50%;border:3px solid var(--line);border-top-color:var(--accent);animation:spin .8s linear infinite}
.spin.hide{display:none}
.loaded{display:none;width:70%;gap:8px}
.loaded.show{display:grid}
@keyframes spin{to{transform:rotate(360deg)}}
.av{width:34px;height:34px;border-radius:50%;background:var(--accent)}
.ln{height:9px;border-radius:4px;background:var(--fg);opacity:.7}
.short{width:60%}
.sk{width:70%;display:grid;gap:8px;grid-template-columns:auto 1fr;align-items:center}
.sk-av{width:34px;height:34px;border-radius:50%;grid-row:span 2;background:linear-gradient(90deg,var(--line) 25%,var(--surface) 50%,var(--line) 75%);background-size:200% 100%;animation:shimmer 1.2s linear infinite}
.sk-ln{height:9px;border-radius:4px;background:linear-gradient(90deg,var(--line) 25%,var(--surface) 50%,var(--line) 75%);background-size:200% 100%;animation:shimmer 1.2s linear infinite}
.sk-ln.short{width:60%}
@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}
js
const sp = document.getElementById('sp');
const l1 = document.getElementById('l1');
function run() {
  sp.classList.remove('hide'); l1.classList.remove('show');
  setTimeout(() => { sp.classList.add('hide'); l1.classList.add('show'); }, 2400);
}
run();
setInterval(run, 3400);

아마존은 2006년 자사 연구에서 페이지 로딩 100ms가 늘어날 때마다 매출이 1% 줄어든다고 밝혔지만, 흥미롭게도 *체감* 속도는 실제 속도와 완전히 일치하지 않습니다. 사람은 "아무 반응 없이 멈춰있는 시간"을 유난히 길게 느끼고, 뭔가 움직이고 있으면 같은 시간도 짧게 느낍니다.

그래서 빈 화면 + 스피너보다 스켈레톤 화면(→ skeleton-screen)이나 단계적 콘텐츠 표시가 실제 로딩 시간을 줄이지 않고도 이탈을 줄입니다. 도허티 임계값(→ doherty-threshold)이 "즉시 반응"을 다룬다면, 이쪽은 "반응 이후 기다리는 동안의 체감"을 다룹니다.

데모는 같은 2.4초 동안, 왼쪽은 빈 화면에 스피너만 돌다가 한 번에 나타나고, 오른쪽은 스켈레톤이 바로 뜨고 콘텐츠가 순서대로 채워집니다.

언제 쓰나

로딩이 400ms를 넘어가는 화면엔 스피너 하나보다 스켈레톤·점진적 표시를 우선하세요. 실제 속도를 못 줄여도 이탈은 줄일 수 있습니다.