質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

意見交換

クローズ

11回答

3192閲覧

3つのコードの中ではどれが一番高速だと思いますか?

ypp

総合スコア66

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

3クリップ

投稿2023/04/27 16:39

編集2024/03/28 11:17

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番ですね。

kosu_ke👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答11

#1

otn

総合スコア84423

投稿2023/04/27 17:31

単に実測してみれば良いだけだと思うのですが??

2番目と3番目は、数値に変換せず、文字のままで比較すればもっと速いのでは?

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

melian

総合スコア19618

投稿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

maisumakun

総合スコア145123

投稿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

yambejp

総合スコア114585

投稿2023/04/28 03:30

みやすさだけで言えば正規表現の方がよいですね(圧倒的に遅いですけど)

javascript

1function isspace(c) { 2 return /^[\x09-\x13\x20]$/.test(c); 3}

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#6

pippi19

総合スコア679

投稿2023/04/28 03:43

編集2023/04/28 03:44

速度でいえば、事実ベースで測定した#2 が正解だと思います。
(測定方法も問題ないと思います)

追記: 見やすさでいうと圧倒的に2番ですね。

見やすさも考慮したいのでしょうか?
個人的には見やすさ優先でいいと思います。

1000万回実行してたったそれだけの差ですので、
どの案を採用してもパフォーマンスに影響が出るとは思えません。
(もちろん利用シーンと実行回数によりますが)

用途によっては、速度よりもメモリ使用量の方を
優先しなくてはいけない場合もあると思います。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#7

otn

総合スコア84423

投稿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

yambejp

総合スコア114585

投稿2023/04/30 08:49

編集2023/04/30 08:52

#7

「"\t\n\v\f\r ".indexOf(c)!=-1」だと、例えば「isspace("\t\n")」もtrueを返しますが「isspace("\n\t")」はfalseとなり一貫性がないのでやめたほうがいいでしょう。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#9

Zuishin

総合スコア28656

投稿2023/04/30 09:02

質問の一番目を見ると、「全てのホワイトスペース 1 文字」になっているので、一貫性については今更のような気もします。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#10

otn

総合スコア84423

投稿2023/04/30 09:20

charCodeAtを使っているので、引数は1文字限定ですよね?
まあ、それをチェックすべきと言うことならチェックしてませんが、元のコードもチェックしてませんね。まあ、実用目的じゃないので、いいのでは?

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#11

dameo

総合スコア943

投稿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

mingos

総合スコア4025

投稿2023/05/15 15:28

プログラミングにおいては「推測するな、計測せよ」という格言があります。
速度を計測するコードを書いて実際に比較するべきです。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問