{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/benchmark-of-lazy-frame-loading/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"b77a9223-3388-5770-9d7b-f5ead4ae243d","excerpt":"Lazy load はよく知られた web サイトの高速化テクニックの１つですが、自前で lazy load を実装したりライブラリを使う必要がなくなる未来が実現しつつあります。 Chrome のレンダリングエンジンBlinkが 画像や iframe の LazyLoad…","html":"<p>Lazy load はよく知られた web サイトの高速化テクニックの１つですが、<strong>自前で lazy load を実装したりライブラリを使う必要がなくなる</strong>未来が実現しつつあります。<br>\nChrome のレンダリングエンジン<a href=\"https://www.chromium.org/blink\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Blink</a>が 画像や iframe の LazyLoad を試験的に実装しました。\n<a href=\"https://docs.google.com/document/d/1e8ZbVyUwgIkQMvJma3kKUDg8UUkLRRdANStqKuOIvHg\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">仕様</a>はこちらに詳しく書かれています。記事を公開した時点ではフラグを有効にすることで利用できるようになっていました。</p>\n<p>Chrome Blink についての説明は多くの参考になる記事があるので、そちらを参照してください。</p>\n<blockquote>\n<p>— <a href=\"https://www.suzukikenichi.com/blog/chrome-may-support-lazy-load-natively/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ブラウザの機能として Chrome が Lazy Load をサポートするかも。SEO と相性が悪い Lazy Load が不要になるか？ | 海外 SEO 情報ブログ</a></p>\n</blockquote>\n<blockquote>\n<p>— <a href=\"https://tech.recruit-mp.co.jp/front-end/post-17429/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Chrome の新機能 Blink LazyLoad の要点と注意点 – PSYENCE:MEDIA</a></p>\n</blockquote>\n<blockquote>\n<p>— <a href=\"https://1000ch.net/posts/2018/lazyload-attributes.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">img 要素と iframe 要素の lazyload 属性 - EagleLand</a></p>\n</blockquote>\n<p>当記事では「では実際にどれくらい速度改善されるのか？」を実験してみたので、その結果をまとめます。</p>\n<h2 id=\"lazy-frame-loading-を有効にする\" style=\"position:relative;\"><a href=\"#lazy-frame-loading-%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B\" aria-label=\"lazy frame loading を有効にする permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>lazy frame loading を有効にする</h2>\n<p><code>chrome://flags/#enable-lazy-frame-loading</code> から設定できます。この設定を有効にすると、<strong>明示的に OFF にしない限り自動的に iframe の LazyLoad が有効</strong>になります。</p>\n<p>蛇足ですが画像については lazy image loading という別のフラグになっているのでご注意ください。</p>\n<h2 id=\"明示的に-lazyload-を-off-にする\" style=\"position:relative;\"><a href=\"#%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AB-lazyload-%E3%82%92-off-%E3%81%AB%E3%81%99%E3%82%8B\" aria-label=\"明示的に lazyload を off にする permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>明示的に LazyLoad を off にする</h2>\n<p><code>lazyload=\"off\"</code>という属性を iframe に付与すると、LazyLoad が無効になり従来通りの挙動になります。ベンチマークついでに試してみましたが期待通りに動きました。</p>\n<h2 id=\"ベンチマーク\" style=\"position:relative;\"><a href=\"#%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF\" aria-label=\"ベンチマーク permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ベンチマーク</h2>\n<p>ベンチマークに使用した記事はこちらです。</p>\n<blockquote>\n<p>— <a href=\"https://blog.leko.jp/post/gatsby-remark-discoverable-oembed/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Gatsby の記事に oEmbed 準拠のコンテンツを埋め込めるようにした | WEB EGG</a></p>\n</blockquote>\n<p>上記の記事は iframe が４つ登場します。<br>\n当ブログは iframe の LazyLoad を実装してないため記事の表示した時点から画面外にある iframe のロードが走ってしまいます。</p>\n<p>計測方法は、</p>\n<ul>\n<li>開発者ツールの Network タブから<code>Disable cache</code>を有効にしておく</li>\n<li>対象の記事をリロードし Network タブに最下部に記載されている<code>Load</code>の時間（後述の画像参照）を比較\n<ul>\n<li>20 回くらい試してみて中央値を取る</li>\n</ul>\n</li>\n</ul>\n<p>なお計測に利用した環境は以下のとおりです。</p>\n<ul>\n<li>OS: Chrome OS (Version 72.0.3626.49 (Official Build) dev (64-bit))</li>\n<li>Google Chrome バージョン: 同上</li>\n<li>テザリング（こちらの<a href=\"https://fast.com/ja/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">サイト</a>でスピードテストしてみたら<code>1.9Mbps</code>だった）</li>\n</ul>\n<p>ネットワークがともなうベンチマークは回線やマシンの調子によって激しく差異が出るので、絶対値ではなくあくまでフラグの有無による相対値で比較をします。</p>\n<h2 id=\"ベンチマーク結果\" style=\"position:relative;\"><a href=\"#%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E7%B5%90%E6%9E%9C\" aria-label=\"ベンチマーク結果 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ベンチマーク結果</h2>\n<p>LazyLoad を無効のまま表示した結果がこちらです。\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 668px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e150c236cc8eec943c626757d9f8653a/8d68c/disabled.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 4.790419161676647%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'20\\'%20viewBox=\\'0%200%20400%2020\\'%20preserveAspectRatio=\\'none\\'/%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/e150c236cc8eec943c626757d9f8653a/5251b/disabled.webp 167w,\n/static/e150c236cc8eec943c626757d9f8653a/7390e/disabled.webp 334w,\n/static/e150c236cc8eec943c626757d9f8653a/7c056/disabled.webp 668w,\n/static/e150c236cc8eec943c626757d9f8653a/0a92e/disabled.webp 1002w,\n/static/e150c236cc8eec943c626757d9f8653a/5dcdf/disabled.webp 1234w\"\n              sizes=\"(max-width: 668px) 100vw, 668px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/e150c236cc8eec943c626757d9f8653a/21521/disabled.png 167w,\n/static/e150c236cc8eec943c626757d9f8653a/86d36/disabled.png 334w,\n/static/e150c236cc8eec943c626757d9f8653a/74866/disabled.png 668w,\n/static/e150c236cc8eec943c626757d9f8653a/d69c4/disabled.png 1002w,\n/static/e150c236cc8eec943c626757d9f8653a/8d68c/disabled.png 1234w\"\n            sizes=\"(max-width: 668px) 100vw, 668px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/e150c236cc8eec943c626757d9f8653a/74866/disabled.png\"\n            alt=\"disabled\"\n            title=\"disabled\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>LazyLoad を有効にしたときの結果がこちらです。\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 668px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/d65e5a85c00a23b366ad516bd56c4c18/7321b/enabled.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 5.389221556886227%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'21\\'%20viewBox=\\'0%200%20400%2021\\'%20preserveAspectRatio=\\'none\\'/%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/d65e5a85c00a23b366ad516bd56c4c18/5251b/enabled.webp 167w,\n/static/d65e5a85c00a23b366ad516bd56c4c18/7390e/enabled.webp 334w,\n/static/d65e5a85c00a23b366ad516bd56c4c18/7c056/enabled.webp 668w,\n/static/d65e5a85c00a23b366ad516bd56c4c18/0a92e/enabled.webp 1002w,\n/static/d65e5a85c00a23b366ad516bd56c4c18/2754d/enabled.webp 1184w\"\n              sizes=\"(max-width: 668px) 100vw, 668px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/d65e5a85c00a23b366ad516bd56c4c18/21521/enabled.png 167w,\n/static/d65e5a85c00a23b366ad516bd56c4c18/86d36/enabled.png 334w,\n/static/d65e5a85c00a23b366ad516bd56c4c18/74866/enabled.png 668w,\n/static/d65e5a85c00a23b366ad516bd56c4c18/d69c4/enabled.png 1002w,\n/static/d65e5a85c00a23b366ad516bd56c4c18/7321b/enabled.png 1184w\"\n            sizes=\"(max-width: 668px) 100vw, 668px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/d65e5a85c00a23b366ad516bd56c4c18/74866/enabled.png\"\n            alt=\"enabled\"\n            title=\"enabled\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>上記の画像を表形式でまとめたものがこちらです。</p>\n<table>\n<thead>\n<tr>\n<th>#</th>\n<th>default</th>\n<th>Lazyload</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Requests</td>\n<td>120</td>\n<td>19</td>\n</tr>\n<tr>\n<td>transferred</td>\n<td>2.6MB</td>\n<td>259KB</td>\n</tr>\n<tr>\n<td>DOMContentLoaded</td>\n<td>691ms</td>\n<td>610ms</td>\n</tr>\n<tr>\n<td>Load</td>\n<td>11.05s</td>\n<td><strong>1.15s</strong></td>\n</tr>\n<tr>\n<td>Finish</td>\n<td>11.08s</td>\n<td>1.16s</td>\n</tr>\n</tbody>\n</table>\n<p>リクエストの本数は 1/6 まで減少し、<strong>Load の時間は約 10 倍早くなりました</strong>。<br>\nフラグが無効のままでもファーストビューが表示されるまでの時間はそれほど違わないのですが、その後にずーっと通信中の表示が出ていました。\nLazyLoad を有効にすると、ページを下にスクロールしていくと徐々に iframe の中身がロードされるようになります。テザリング程度の回線速度でも該当要素までスクロールしたときに描画は完了しており、表示が遅延してる感じもありませんでした。</p>\n<h2 id=\"当ブログでの対応\" style=\"position:relative;\"><a href=\"#%E5%BD%93%E3%83%96%E3%83%AD%E3%82%B0%E3%81%A7%E3%81%AE%E5%AF%BE%E5%BF%9C\" aria-label=\"当ブログでの対応 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>当ブログでの対応</h2>\n<p>iframe は毎回登場するのもでもないので、（主要ブラウザが対応し切るまで何年かかるか分かりませんが）オレオレ LazyLoad は実装せず待つことにしました。\n画像に関しては Gaysby プラグインを使ってると勝手に有効になっちゃうのでオレオレ LazyLoad を使うようにしています。</p>\n<h2 id=\"さいごに\" style=\"position:relative;\"><a href=\"#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB\" aria-label=\"さいごに permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>さいごに</h2>\n<p>ぜひフラグを有効にして快適な表示を体験してみてください。<br>\n利用者としては嬉しい限りですが、このフラグがデフォルトで有効になった日にはアクセス解析提供してる会社さんは大変そうな予感がします。</p>\n<p>iframe といえばソーシャルボタンも多くが iframe で提供されています。表示が遅くなるので当ブログは付けてませんが、このあたりも劇的にパフォーマンス改善されるポイントになると思います。</p>","timeToRead":5,"frontmatter":{"title":"ChromeのBlink LazyLoadを有効にしたらページのロード時間が約10倍早くなった","tags":["JavaScript","Google Chrome"],"date":"January 12, 2019","featuredImage":null}}},"pageContext":{"slug":"/benchmark-of-lazy-frame-loading/","previous":{"fields":{"slug":"/gatsby-remark-discoverable-oembed/"},"frontmatter":{"title":"Gatsbyの記事にoEmbed準拠のコンテンツを埋め込めるようにした","tags":["JavaScript","Gatsby","oEmbed","AST","remark"]}},"next":{"fields":{"slug":"/code-reading-of-deno-boot-process/"},"frontmatter":{"title":"Dive into Deno：プロセス起動からTypeScriptが実行されるまで","tags":["JavaScript","TypeScript","Rust","Deno"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}