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
総合スコア82906
投稿2023/04/27 17:31
単に実測してみれば良いだけだと思うのですが??
2番目と3番目は、数値に変換せず、文字のままで比較すればもっと速いのでは?
#2
総合スコア18138
投稿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
総合スコア28650
投稿2023/04/27 21:56
意見なので、根拠はなくて大丈夫です。
質問も回答も読んでいませんが、最初のものだと思います。
#4
総合スコア144076
投稿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}
#5
総合スコア112620
投稿2023/04/28 03:30
みやすさだけで言えば正規表現の方がよいですね(圧倒的に遅いですけど)
javascript
1function isspace(c) { 2 return /^[\x09-\x13\x20]$/.test(c); 3}
#6
総合スコア679
投稿2023/04/28 03:43
編集2023/04/28 03:44速度でいえば、事実ベースで測定した
総合スコア18138
投稿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
(測定方法も問題ないと思います)
追記: 見やすさでいうと圧倒的に2番ですね。
見やすさも考慮したいのでしょうか?
個人的には見やすさ優先でいいと思います。
1000万回実行してたったそれだけの差ですので、
どの案を採用してもパフォーマンスに影響が出るとは思えません。
(もちろん利用シーンと実行回数によりますが)
用途によっては、速度よりもメモリ使用量の方を
優先しなくてはいけない場合もあると思います。
#7
総合スコア82906
投稿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
総合スコア112620
投稿2023/04/30 08:49
編集2023/04/30 08:52総合スコア82906
投稿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
のほうが速くて、
エスケープシーケンスで意味がわかるので簡明かと。
まあ普通はボトルネックで無い限りは正規表現でしょうか。
「"\t\n\v\f\r ".indexOf(c)!=-1」だと、例えば「isspace("\t\n")」もtrueを返しますが「isspace("\n\t")」はfalseとなり一貫性がないのでやめたほうがいいでしょう。
#9
総合スコア28650
投稿2023/04/30 09:02
質問の一番目を見ると、「全てのホワイトスペース 1 文字」になっているので、一貫性については今更のような気もします。
#10
総合スコア82906
投稿2023/04/30 09:20
charCodeAt
を使っているので、引数は1文字限定ですよね?
まあ、それをチェックすべきと言うことならチェックしてませんが、元のコードもチェックしてませんね。まあ、実用目的じゃないので、いいのでは?
#11
総合スコア789
投稿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" に一致します。
#12
総合スコア3965
投稿2023/05/15 15:28
プログラミングにおいては「推測するな、計測せよ」という格言があります。
速度を計測するコードを書いて実際に比較するべきです。
同じタグがついた質問を見る
JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。