<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>sawara.me Blog</title>
        <link>https://sawara.me/en/blog</link>
        <description>sawara.me Blog</description>
        <lastBuildDate>Fri, 01 May 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Web快適度測定について]]></title>
            <link>https://sawara.me/en/blog/benchmark/20260501</link>
            <guid>https://sawara.me/en/blog/benchmark/20260501</guid>
            <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Web快適度測定について]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Web快適度測定について" src="https://sawara.me/en/assets/images/benchmark_result-18617f801d746bbce63682c98802f89d.webp" width="1200" height="628" class="img_ev3q"></p>
<p>今回は、本サイト上でブラウザ上でベンチマークを行うことができる「Web快適度測定」というツールについて、なぜこれを作ったのか、そして中身はどうなっているのか、少しだけ深掘りして紹介してみようと思います。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="開発の経緯対応デバイスを決めるのむずくない">開発の経緯：対応デバイスを決めるの、むずくない？<a href="https://sawara.me/en/blog/benchmark/20260501#%E9%96%8B%E7%99%BA%E3%81%AE%E7%B5%8C%E7%B7%AF%E5%AF%BE%E5%BF%9C%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B%E3%81%AE%E3%82%80%E3%81%9A%E3%81%8F%E3%81%AA%E3%81%84" class="hash-link" aria-label="Direct link to 開発の経緯：対応デバイスを決めるの、むずくない？" title="Direct link to 開発の経緯：対応デバイスを決めるの、むずくない？" translate="no">​</a></h3>
<p>この機能を作ったきっかけは、現在業務で開発しているサービスの「対応デバイス」を検討していた時のことでした。</p>
<p>「AndroidはOS12以上」「Safari 16以上」「Chrome 110以上」といった基準はよくありますが、実際にはスペックの低いAndroid端末もあれば、OSやブラウザは最新でもパワーが不足しているデバイス、逆に古くてもパワーのある旧ハイエンド端末もあったりします。
開発チームで「どこまでの低スペック端末を切り捨てるか」を議論する際、明確な基準がないことに非常に苦労しました。</p>
<p>そこで、「ブラウザ上で手軽に動かせて、その端末の『Web的な実力』を数値化できるベンチマークがあれば、そのスコアを基準に対応デバイスを定義できるのでは？」と思いついたのが、この機能の始まりです。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="web快適度測定の基本仕様">Web快適度測定の基本仕様<a href="https://sawara.me/en/blog/benchmark/20260501#web%E5%BF%AB%E9%81%A9%E5%BA%A6%E6%B8%AC%E5%AE%9A%E3%81%AE%E5%9F%BA%E6%9C%AC%E4%BB%95%E6%A7%98" class="hash-link" aria-label="Direct link to Web快適度測定の基本仕様" title="Direct link to Web快適度測定の基本仕様" translate="no">​</a></h3>
<p>このツールは、大きく分けて2つの測定を行います。</p>
<ol>
<li class=""><strong>演算性能の測定（スコア化）</strong>:<br>
<!-- -->端末のCPUパワーを測定し、シングルコア・マルチコアそれぞれのスコアとランク（S〜F）を出します。</li>
<li class=""><strong>ブラウザ機能サポート状況</strong>:<br>
<!-- -->最新のWeb API（WebGPU, Passkeys, WebP等）がそのブラウザで使えるかをチェックします。</li>
</ol>
<p>スコアとサポート状況は計測後、画面に表示されます。</p>
<p>また、測定して終わりではなく、結果を誰かに伝えたり記録したりしやすいよう、共有機能も追加しています。ブラウザの <strong>Web Share API</strong> を使ってOS標準の共有メニューを直接呼び出せます。HTML5 Canvas を使用し、スコア・ランク・環境情報を表示した結果画像を自動で作成し、そのままX（旧Twitter）やLINE、メッセージアプリへ送信できます。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ベンチマークの処理の詳細">ベンチマークの処理の詳細<a href="https://sawara.me/en/blog/benchmark/20260501#%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E8%A9%B3%E7%B4%B0" class="hash-link" aria-label="Direct link to ベンチマークの処理の詳細" title="Direct link to ベンチマークの処理の詳細" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-web-workerによる正確な測定">1. Web Workerによる正確な測定<a href="https://sawara.me/en/blog/benchmark/20260501#1-web-worker%E3%81%AB%E3%82%88%E3%82%8B%E6%AD%A3%E7%A2%BA%E3%81%AA%E6%B8%AC%E5%AE%9A" class="hash-link" aria-label="Direct link to 1. Web Workerによる正確な測定" title="Direct link to 1. Web Workerによる正確な測定" translate="no">​</a></h4>
<p>ベンチマーク中、メインスレッド（UIを動かすスレッド）が固まらないようにするため、演算処理はすべてWeb Workerで実行するようにしています。</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Web Worker 上で実行される演算ロジックの一部</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> workerScript </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">self.onmessage = function(e) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  // 1. 浮動小数点演算 (sin, cos, sqrt)</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  let floatSum = 0;</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  for (let i = 0; i &lt; 10000000; i++) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">    floatSum += Math.sin(i) * Math.cos(i) + Math.sqrt(i);</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="display:inline-block;color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  // 2. 整数・ビット演算</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  let intSum = 0;</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  for (let i = 0; i &lt; 50000000; i++) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">    intSum += (i * 1337) ^ (i &lt;&lt; 2);</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="display:inline-block;color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  // 3. メモリアクセス</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  const size = 5000000;</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  const arr = new Int32Array(size);</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  // ... 配列へのランダムアクセス処理</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="display:inline-block;color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  // 処理終了をメインスレッドに通知</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  self.postMessage({ type: 'done', avgTime: 123 /* 実際は計算値 */ });</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">};</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c"></span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Web Workerを生成して実行し、結果をPromiseで返す関数</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">runWorkerTask</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">passes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Promise</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">resolve</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 文字列として定義したスクリプトをBlob化してWorkerとして読み込む</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> blob </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Blob</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">workerScript</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/javascript"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> worker </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Worker</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">URL</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createObjectURL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">blob</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    worker</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method-variable function-variable method function property-access" style="color:#d73a49">onmessage</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"done"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        worker</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">terminate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 終わったらWorkerを破棄</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">resolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">avgTime</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Workerに実行命令（パス回数など）を送信</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    worker</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">postMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> passes </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-マルチコア測定の実装">2. マルチコア測定の実装<a href="https://sawara.me/en/blog/benchmark/20260501#2-%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B3%E3%82%A2%E6%B8%AC%E5%AE%9A%E3%81%AE%E5%AE%9F%E8%A3%85" class="hash-link" aria-label="Direct link to 2. マルチコア測定の実装" title="Direct link to 2. マルチコア測定の実装" translate="no">​</a></h4>
<p>デバイスの論理コア数（<code>navigator.hardwareConcurrency</code>）を取得し、その数だけ同時に Worker を立ち上げて並列処理を行わせます。<code>Promise.all</code> を活用して全ての Worker の完了を待機し、総合的なスループットからスコアを算出するようにしました。これにより、最近の多コアスマホの実力をしっかり引き出せるようにしています。</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">runMultiCoreBenchmark</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">cores</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> passes</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> onProgress</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> workers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> startAll </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">performance</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> completedPasses </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> totalPasses </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> passes </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> cores</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// デバイスの論理コア数分だけ Worker を作成して実行</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> cores</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    workers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">runWorkerTask</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">passes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        completedPasses</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// 全体の進捗率を計算してUIに通知</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">onProgress</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> percent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">completedPasses </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> totalPasses</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token function" style="color:#d73a49">onProgress</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">マルチコア測定中... (</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">percent</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">%)</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// すべての並列処理が終わるまで待機</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token known-class-name class-name">Promise</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">all</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">workers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> endAll </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">performance</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 実行時間から最終的なマルチコアスコアを計算</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> totalTime </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> endAll </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> startAll</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">500_000</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> cores </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> passes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> totalTime</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-ブラウザ機能のサポートチェック">3. ブラウザ機能のサポートチェック<a href="https://sawara.me/en/blog/benchmark/20260501#3-%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%A9%9F%E8%83%BD%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF" class="hash-link" aria-label="Direct link to 3. ブラウザ機能のサポートチェック" title="Direct link to 3. ブラウザ機能のサポートチェック" translate="no">​</a></h4>
<p>単に計算が速いだけでなく、現代のWebサービスを支える最新のAPIに対応しているかどうかも、体験の質に大きく関わります。以下の4つのカテゴリで診断を行っています。</p>
<ul>
<li class=""><strong>SNS・メディア閲覧</strong><br>
<!-- -->「SNSや動画サイト等が快適に動作するか」を判定します。次世代画像の <strong>AVIF/WebP</strong> や、高効率ビデオコーデックの <strong>AV1</strong>、優先読み込みを行う <strong>fetchpriority</strong> などをチェック。これらに対応していると、表示速度が劇的に向上し、通信量も抑えられます。</li>
<li class=""><strong>ビジネス・ツール</strong><br>
<!-- -->「NotionやFigma等のアプリ級サイトが快適に動くか」を判定します。ポップアップを制御する <strong>Popover API</strong> や、ブラウザ上でのZIP圧縮を可能にする <strong>Compression Streams</strong>、オフライン対応の <strong>IndexedDB v3</strong> などをチェック。これらは高機能なWebツールの安定性に直結します。</li>
<li class=""><strong>エンタメ・クリエイティブ</strong><br>
<!-- -->「3D、アニメーション、ゲームが快適に動作するか」を判定します。次世代3Dグラフィックスの <strong>WebGPU</strong> や、滑らかな画面遷移を実現する <strong>View Transitions API</strong>、スクロール連動演出の <strong>Scroll-driven Animations</strong> などをチェック。リッチな視覚表現が可能になります。</li>
<li class=""><strong>システム・その他</strong>:<br>
<!-- -->「アプリ化、通知、ログインの快適さ」を判定します。指紋・顔認証でのログインを可能にする <strong>Passkeys (WebAuthn)</strong> や、画面をスリープさせない <strong>Screen Wake Lock API</strong>、ローカルファイルを直接編集できる <strong>File System Access API</strong> などをチェックしています。</li>
</ul>
<p>これらの判定結果を表示し、アコーディオン形式でそれぞれどの機能に現在使用しているブラウザが対応しているか、確認できるようになっています。</p>
<p><img decoding="async" loading="lazy" alt="Web快適度測定:ブラウザ機能サポート状況" src="https://sawara.me/en/assets/images/browser_support-974e3e7c5d95620c1c655091db3e98f9.webp" width="862" height="702" class="img_ev3q"></p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="便利な使い方活用シーン">便利な使い方・活用シーン<a href="https://sawara.me/en/blog/benchmark/20260501#%E4%BE%BF%E5%88%A9%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9%E6%B4%BB%E7%94%A8%E3%82%B7%E3%83%BC%E3%83%B3" class="hash-link" aria-label="Direct link to 便利な使い方・活用シーン" title="Direct link to 便利な使い方・活用シーン" translate="no">​</a></h3>
<p>単なる「性能測定」以上に、以下のような具体的なシーンで活用してもらえると嬉しいです！</p>
<ul>
<li class=""><strong>手元のデバイスのWeb性能のベンチマーク</strong><br>
<!-- -->手元にあるスマートフォンやタブレット、PCがどれくらいのWeb処理能力があるのか確認することができます。特にミドルレンジ以下の端末では、最新機能のサポート状況を知る良い指標になります。</li>
<li class=""><strong>ブラウザによる性能特性の比較</strong><br>
<!-- -->同じデバイスでも、Safari（WebKit）とChrome（Blink）ではJSエンジンの実装が異なります。どちらが演算に強く、最新機能に対応しているかを比べてみて、自分のデバイスにあったブラウザを見つけてみてください。</li>
<li class=""><strong>プロジェクトのターゲットデバイス選定</strong>:<br>
<!-- -->開発プロジェクトで「今回はDランク以上の端末を推奨環境とする」といった具体的な数値を定義するために。OSバージョンや発売日といった曖昧な指標ではなく、現在のWebブラウザにおける「実力値」をベースにした議論が可能になります。</li>
</ul>
<p>ぜひ、皆さんの手元のデバイスでも <a class="" href="https://sawara.me/en/benchmark">Web快適度測定</a> を試してみてください！</p>]]></content:encoded>
            <category>Web快適度測定</category>
        </item>
        <item>
            <title><![CDATA[このサイトについて]]></title>
            <link>https://sawara.me/en/blog/introducing-sawarame</link>
            <guid>https://sawara.me/en/blog/introducing-sawarame</guid>
            <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Web快適度測定について]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Web快適度測定について" src="data:image/webp;base64,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" width="600" height="315" class="img_ev3q"></p>
<p>こんにちは。管理人の sawarame です。</p>
<p>このサイトは、個人的に日々の生活や仕事の中で「ちょっとこういうツールが欲しいな」と思ったものを形にして集めた、ツール集です。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="なぜ作ったのか">なぜ作ったのか？<a href="https://sawara.me/en/blog/introducing-sawarame#%E3%81%AA%E3%81%9C%E4%BD%9C%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B" class="hash-link" aria-label="Direct link to なぜ作ったのか？" title="Direct link to なぜ作ったのか？" translate="no">​</a></h3>
<p>世の中には便利なツールが溢れていますが、意外と「痒いところに手が届かない」ことや、「自分のデータをサーバーに送りたくない」という不安を感じることがありました。</p>
<p>そのため、このサイトのすべてのツールは <strong>ブラウザ上で完結（クライアントサイド処理）</strong> するように作られています。画像やPDF、パスワードの生成などは、サーバーに送られたりデバイスの外にデータが出ることはありませんので、安心して使うことができます。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="公開しているツールについて">公開しているツールについて<a href="https://sawara.me/en/blog/introducing-sawarame#%E5%85%AC%E9%96%8B%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="Direct link to 公開しているツールについて" title="Direct link to 公開しているツールについて" translate="no">​</a></h3>
<p>現在公開しているツールには、それぞれ地味ながらこだわったポイントがあります。似たようなツールは他にもありますが、自分なりに使いやすい機能に仕上げています。</p>
<ol>
<li class=""><strong>パスワードジェネレーター</strong><br>
<!-- -->単にパスワードを自動生成するだけでなく、<strong>URLパラメータとの同期</strong>にこだわりました。長さや使用文字の設定がすべてURLに反映されるので、お気に入りの設定をブックマークしたり、チームで「この設定でパスワード作って」と共有したりできます。</li>
<li class=""><strong>テキスト保存場所</strong><br>
<!-- -->ブラウザのローカルストレージを利用した、テキストデータを保存できる場所です。ブラウザを閉じてもデータが消えず、何かふと思ったことメモしておける機能として開発しました。よくコピペするワードとかを置いておけるスニペットとして使うこともできます。　<strong>ピン留め機能</strong> を実装したので、作業中に何度も使うテンプレを常に最上部に置いておけます。</li>
<li class=""><strong>デバイス情報チェッカー</strong><br>
<!-- -->デバイスの画面サイズやユーザーエージェントを確認できます。意外とスマホやタブレットのサイズってよくわからないことがあるので、実機でアクセスすることで実際の画面サイズを確認することができます。レスポンシブサイトとかを開発する際に役に立ちます。</li>
<li class=""><strong>QRコード作成</strong><br>
<!-- -->Wi-Fi、連絡先、カレンダー登録など、多彩なフォーマットに対応しています。ロゴ埋め込みもできるので、販促チラシを作成する際にオリジナリティのあるQRコードが作成できます。。</li>
<li class=""><strong>日付比較ツール</strong><br>
<!-- -->「2026年4月30日」といった日本語形式やUNIX TIMESTAMPなど、<strong>入力フォーマットの寛容さ</strong>にこだわりました。どんな形式でコピーしてきても、いい感じにパースして差分を出してくれます。常に現在時刻との比較を出すこともできますので、Xデーまでのカウントダウンや、過去の日付からどらくらいの時間が経過したか出力しておくこともできます。</li>
<li class=""><strong>写真Exif情報チェッカー</strong><br>
<!-- -->写真データからExifデータを取得し表示します。撮影条件だけでなく、GPS情報があれば緯度経度を表示し、<strong>Googleマップへのリンク</strong>を即座に生成します。</li>
<li class=""><strong>画像軽量化・クロップツール</strong><br>
<strong>WebPへの変換</strong>はもちろん、スライダーによる<strong>Before/Afterの比較プレビュー</strong>、主要なSNS（OGPやX）に合わせたアスペクト比プリセットなど、サイト・ブログ・SNS運営に便利な機能となるように開発しました。</li>
<li class=""><strong>PDF画像変換</strong><br>
<!-- -->ブラウザ内でPDFをレンダリングし、画像データに変換します。<strong>必要なページだけを選んでZIPで固める</strong> という、シンプルな機能でスムーズに使用できるようになっています。</li>
<li class=""><strong>Web快適度測定（ベンチマーク）</strong><br>
<!-- -->ただのスコア測定ではなく、<strong>Web Workerを用いたマルチスレッド演算</strong> によるマルチコアのベンチマークができます。また、最新のWeb技術（WebGPUやPasskeys等）への対応状況をカテゴリ別に診断する機能もあり、自分の環境の「モダンさ」を可視化できるようにしています。</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ブラウザ拡張機能も公開中">ブラウザ拡張機能も公開中<a href="https://sawara.me/en/blog/introducing-sawarame#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E3%82%82%E5%85%AC%E9%96%8B%E4%B8%AD" class="hash-link" aria-label="Direct link to ブラウザ拡張機能も公開中" title="Direct link to ブラウザ拡張機能も公開中" translate="no">​</a></h3>
<p>日々のブラウジングを少し便利にする拡張機能も、Chrome Web Store で公開しています。</p>
<ul>
<li class=""><strong>EnvIcon</strong>:<br>
<!-- -->本番・検証・開発環境でfaviconを動的に書き換えます。「検証環境のつもりで本番を触っていた」という、<strong>エンジニアなら一度はやるヒヤリハット</strong> を防ぎたくて作りました。faviconの書き換えだけではなく、ページ内でのバッジ表示や、デベロッパーツールのコンソールの環境表示に対応しています。</li>
<li class=""><strong>Gemini Spark</strong>:<br>
<!-- -->Google Gemini のWEB UIのプロンプト入力を「Enterで改行、Cmd+Enterで送信」という挙動に変更します。改行しようと思っただけなのに、何度も送信してしまうことがあったので作ってみました。今後GeminiのWEB UIをアップグレードする機能を追加しようと思っているのですが、今のところ何も思いついていません、、、</li>
<li class=""><strong>MdPicker</strong>:<br>
<!-- -->閲覧中のページタイトルとURLを、ワンクリックでMarkdown形式のリンクにしてコピーします。ブログ執筆やドキュメント作成のスピードを上げるための必須ツールです。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="これから">これから<a href="https://sawara.me/en/blog/introducing-sawarame#%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89" class="hash-link" aria-label="Direct link to これから" title="Direct link to これから" translate="no">​</a></h3>
<p>自分自身が使いやすいと思うものを、これからも少しずつ増やしていく予定です。
「痒いところに手が届く」そんな場所を目指しています。</p>]]></content:encoded>
            <category>sawara.me</category>
        </item>
    </channel>
</rss>