1
3
少しでも高速化するためにどれが一番高速なのかを知りたいです。意見なので、根拠はなくて大丈夫です。
自分は1番は正規表現で内容を解析しないといけないためこれはないなと思います。問題は2番と3番ですかね。配列か演算子どちらが速いか。
js
1function isspace(c) { 2 return !!c.match(/^\s$/); 3}
js
1function isspace(c) { 2 return [9, 10, 11, 12, 13, 32].includes(c.charCodeAt()); 3}
js
1function isspace(c) { 2 let code = c.charCodeAt(); 3 return (9 <= code && code <= 13) || code === 32; 4}
追記: 見やすさでいうと圧倒的に2番ですね。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答12件
#1
総合スコア85974
投稿2023/04/27 17:31
単に実測してみれば良いだけだと思うのですが??
2番目と3番目は、数値に変換せず、文字のままで比較すればもっと速いのでは?
#2
総合スコア20697
投稿2023/04/27 17:42
編集2023/04/27 19:38意見なので、根拠はなくて大丈夫です。
一応、計測してみました。(Node.js v20.0.0
で実行)
javascript
1function isspace1(c) { 2 return !!c.match(/^\s$/); 3} 4 5function isspace2(c) { 6 return [9, 10, 11, 12, 13, 32].includes(c.charCodeAt()); 7} 8 9function isspace3(c) { 10 const code = c.charCodeAt(); 11 return (9 <= code && code <= 13) || code === 32; 12} 13 14function measure(func) { 15 const f = eval(`${func}`); 16 const startTime = performance.now(); 17 for (let i=0,ret=false;i<10000000;i++) { 18 ret = f(" "); 19 } 20 const endTime = performance.now(); 21 console.log(`${func}: ${endTime - startTime} milliseconds`); 22} 23 24for (const f of ["isspace1", "isspace2", "isspace3"]) { 25 measure(f); 26} 27 28// isspace1: 425.9242890179157 milliseconds 29// isspace2: 138.5725820064545 milliseconds 30// isspace3: 79.67670801281929 milliseconds
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#3
この回答は、運営により削除されました。
#4
総合スコア146149
投稿2023/04/27 23:48
オブジェクトで参照させてみてはどうでしょうか?
javascript
1// 事前に用意 2const table = Object.fromEntries(Array.from('\t\n\v\f\r ', (ch) => [ch, true])) 3 4function isspace4(c) { 5 return !!table[c]; 6}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#6
総合スコア684
投稿2023/04/28 03:43
編集2023/04/28 03:44速度でいえば、事実ベースで測定した#2 が正解だと思います。
(測定方法も問題ないと思います)
追記: 見やすさでいうと圧倒的に2番ですね。
見やすさも考慮したいのでしょうか?
個人的には見やすさ優先でいいと思います。
1000万回実行してたったそれだけの差ですので、
どの案を採用してもパフォーマンスに影響が出るとは思えません。
(もちろん利用シーンと実行回数によりますが)
用途によっては、速度よりもメモリ使用量の方を
優先しなくてはいけない場合もあると思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#7
総合スコア85974
投稿2023/04/28 11:47
個人的には見やすさ優先でいいと思います。
私もそう思います。このサイトでもコードを回答に書くときには、「簡明に書くと~~」と回答することが多いです。
速度を気にするのは、処理時間が問題になってその部分がボトルネックだとわかってからでしょうね。
ただし、今回は実用的な意味での質問ではなくて、興味本位での質問かと思っています。
手元の環境だと、(9 <= code && code <= 13) || code === 32
が最速ですが、
[9, 10, 11, 12, 13, 32].includes(c.charCodeAt())
よりは
"\t\n\v\f\r ".indexOf(c)!=-1
のほうが速くて、
エスケープシーケンスで意味がわかるので簡明かと。
まあ普通はボトルネックで無い限りは正規表現でしょうか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#8
総合スコア116907
投稿2023/04/30 08:49
編集2023/04/30 08:52「"\t\n\v\f\r ".indexOf(c)!=-1」だと、例えば「isspace("\t\n")」もtrueを返しますが「isspace("\n\t")」はfalseとなり一貫性がないのでやめたほうがいいでしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#11
退会済みユーザー
総合スコア0
投稿2023/05/14 23:38
要件もなく単純に比較するなら、同じロジックでないとダメだと思いますよ。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_expressions/Character_classes
\s
ホワイトスペース 1 文字に一致します。例えば空白、タブ、改ページ、改行、その他の Unicode 空白文字などです。 [\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] に相当します。例えば /\s\w*/ は "foo bar" の " bar" に一致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。