[過去ログ]
+ JavaScript の質問用スレッド vol.126 + [転載禁止]©2ch.net (1002レス)
+ JavaScript の質問用スレッド vol.126 + [転載禁止]©2ch.net http://peace.5ch.net/test/read.cgi/hp/1444186237/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
545: Name_Not_Found [sage] 2015/11/03(火) 20:53:49.90 ID:??? 完全な素人です >>544 ほかどんなものがお勧めでしょうか? http://peace.5ch.net/test/read.cgi/hp/1444186237/545
546: Name_Not_Found [sage] 2015/11/03(火) 21:21:54.76 ID:??? >>541 コードを読ませること自体はいいことだし、その教育方針も妥当だと思うが、 既に読んでいることを新人に期待するのは無理がある。それがないから新人なのだから。 とはいえ、JavaScript界隈はコードを読んでいる方だと思うぞ。 お前らも結局読んで返事をしているみたいだし、他の連中もそんな感じだ。 これは一つにはJavaScriptの構造上、基本的にコードは晒されるというのがあって、 読めるという前提で文化が醸成されているからだと思う。 これは他言語にはない特徴であり、JavaScript界隈が活発な一つの要因だと思う。 他言語の場合は、読みたくても読めないことが大半だからね。 http://peace.5ch.net/test/read.cgi/hp/1444186237/546
547: Name_Not_Found [sage] 2015/11/03(火) 21:38:56.03 ID:??? >>539 書いた http://jsfiddle.net/cau4mx8d/3/ Math.minは確かに迷った結果のコードだが、ダメとする絶対的な理由が足りない (他が比較演算子を使用するので統一感はないとは思うが) 処理順に関しては値の切り分けによって後述処理を都合よく処理する為だ falsy, truly な例外処理を先にするかは状況によるし、ポリシー次第だと思う (構造化プログラミング的にはこの手法はダメだが、出口を一つにするメリットがなかったので採用しなかった) そこまで否定される理由はないと思ったが、あなたはどのような理由でダメだと思った? >>541 では、美しいコードを見せてくれ http://peace.5ch.net/test/read.cgi/hp/1444186237/547
548: Name_Not_Found [sage] 2015/11/03(火) 23:40:45.08 ID:??? >>547 おー書いたか。ご苦労様。ならばその労に報いよう。 はじめに俺はJavaScriptが専門ではないと断っておく。しかしここら辺はプログラミングで共通だからね。 一般的に、JavaScriptではコード自体のフットプリントが問題になることはまずない。 したがって、実用的には A. 見やすいコード B. 速いコード のどちらかを採用することになる。逆にいえば、これ以外のコードは要らない。 ただしJavaScript特有として「イレギュラーに対する対処」を考慮する必要がある。(後述) ここではコードの量に異常にこだわる奴が散見されるが、見やすいコードというのは 「後で見た時に誤解がないコード」であり、タイピングが少ないことではない。 見やすい=後でメンテナンスしやすいであり、後でメンテナンスする気がないのなら見やすさなんて不要だからだ。 (お前らはコードのメンテナンスの経験が不十分だから、何が見やすいのか定義できていないように感じる) JavaScriptにおいて正規表現は標準だから、AについてはgetFirstLine3で決まりだろう。 正規表現の内容も、こう書くしかないというレベルのシンプルさだ。誤解しようがない。 となると残りはB(速度)を目指すコードしか要らない。(こんな実装も出来る俺カッケーなコードは死ねでいい) http://peace.5ch.net/test/read.cgi/hp/1444186237/548
549: Name_Not_Found [sage] 2015/11/03(火) 23:41:16.88 ID:??? getFirstLine2はcharAtを使うのならこの実装で妥当だろう。 イレギュラー対策をdo/whileにしてstring.chaAtで引っかけるというのは若干トリッキーではあるが、 これが許可されるのならこれでいい。(少なくとも速度オーバーヘッドはない) ただしJavaScriptだと一般的にはgetFirstLine1の方が速いはずなので、これが使われることはないだろう。 (C言語ならgetFirstLine2が最速) さてgetFirstLine1だが、先述の通り、ここはB(速度)を目指さないといけない。(存在価値がない) 記述にもこの意識は見られ、Stringオブジェクト変換を減らしている。この辺はいい。 そこで処理順なのだが、速度を目指すのだから、よくある順にショートカットにして組むことが必要になる。 つまり、-1 && -1 の「例外」を最初に見るのではなく、 20,21とかの「通常」のケースを最初に処理しないといけない。 ただし、 > ポリシー次第だと思う これはその通りで、「最初に例外処理を行うというルール」であれば、 最初に -1 && -1 を記述しなければならず、旧コードが妥当なものになる。 ただこのケースは余りないように思う。(後述) Math.minについては、比較演算子よりも遅く、今回は採用する理由がない。 速度を目指すコードである以上、可読性が極端に落ちない限りは速い記述を採用するべき。比較演算子は十分に分かりやすい。 この場合はindexOfの戻り値である以上、型はnumberで確定しているのだから、比較演算子で何も問題ない。 (そちらの指摘通り、「比較演算子」と「メソッド」のどちらかに統一しろというルールもあると思うが、 俺は見た目ではなく実用性を考えているので上記の理由になる。 多分そちらの「構造化プログラミング」ってのはreturnを1個にしろという話だろうけど、そういうのは俺は気にしていない。 あくまで実用性重視であり、見た目が欲しければ最初からA(getFirstLine3)を使って終わらせる。 わざわざgetFirstLine1を使うのは速度が欲しい時だけであり、中速で中途半端に整ったコードには実用性がない。) http://peace.5ch.net/test/read.cgi/hp/1444186237/549
550: Name_Not_Found [sage] 2015/11/03(火) 23:41:52.38 ID:??? さてイレギュラー対策だが、多分(ここら辺は本職から聞くべきだが) α. 安全重視、全箇所でチェック。 β 速度重視、最初にチェック、以降は「型」までは確定、値については保証無し。 のどちらかで組むのだと思われる。 ポリシーαで、どういう状態でも安全性を明示するために「最初に例外処理」のルールなら旧コードが妥当になるが、 実用的にこれはないように思われる。 普通の仕様としては、「イレギュラーなら例外、それ以外は正しく処理」であり、関数内の記述順まで規定される必要はない。 記述順を規定する=ソースコードを見てデバッグするということだが、その場合は普通は「例外を投げずに自分で処理しろ」となるからだ。 またJavaScriptの場合はgetFirstLine3のように「暗黙的なイレギュラー対策」が出来ることも多く、(確認していないが) 「明示的なイレギュラー対策を最初に行え」というルールだと色々無理が生じてしまう。 だから、お行儀がいいとは言えないが、 現実的にはgetFirstLine2のようなトリッキーなイレギュラー対策もありってことになっている場合が多いのではないかと推測される。 (ソースコードに明示的に書いてあるかどうかではなく、実際に動くかどうかが仕様) ただ、それ以前に、「どんな型でもちゃんと処理しろ」というのはやはり負担が大きく、どこかしらでバグるだろうから、 普通はポリシーβで、getFirstLineが呼ばれる時はstringが渡されるところまでは確定していると思う。 この場合は「正しく処理しろ」という仕様だろうから、-1 && -1 の処理は後回しでいい。(最初に書くことを強制されない) 俺の場合はポリシーβで、基本的に最初は全部Aで書いて、問題がある場合のみBに差し替えるという方法を採っている。 したがって中速コードは不要で、各関数に於ける例外処理も基本的に無しだ。だからこんな感じになる。 他のポリシーと記述スタイルなら他の考え方もありうるとは思うが、 上記のように現実的にはαは効率が悪くて無理だと思うし、 速度についてもソースから直接予想できるケースばかりでもないので、 結果的に本職も俺と同様のポリシーになっているのではないかとは思っている。 http://peace.5ch.net/test/read.cgi/hp/1444186237/550
551: Name_Not_Found [sage] 2015/11/03(火) 23:45:31.01 ID:??? まあ漏れらベテランは、nullが返されて、 nullオブジェクトで関数を呼んだら、 そんな関数はありませんという実行時エラーを、 無数に経験しているからな。 用心深くもなるわな >>542 Firefoxで、Selenium IDEで、 ボタンをクリックしたり、 ページをリロードしたり試してみれば? JavaScriptもプログラミング素人には難しいよ http://peace.5ch.net/test/read.cgi/hp/1444186237/551
552: Name_Not_Found [sage] 2015/11/03(火) 23:46:59.02 ID:??? gdgdはいいからはよコード書けよ http://peace.5ch.net/test/read.cgi/hp/1444186237/552
553: Name_Not_Found [sage] 2015/11/03(火) 23:54:26.37 ID:??? getFirstLine3が最速だろ 実際のコード書いてないのがバレバレ http://peace.5ch.net/test/read.cgi/hp/1444186237/553
554: Name_Not_Found [sage] 2015/11/04(水) 00:24:22.18 ID:??? >>547 ついで。もうコードは書かなくていいから。 細かいことを言うと、indexOf('\n')はLFのみのテキストの場合引っかからないので、最後まで見に行ってしまう。 結果、getFirstLine1はMac/UNIXの大規模テキストを食わされると極度に遅くなる。 とはいえ、良い対策は無い。 この危険性は 2/3 にはない。 だからまあ、普通は 3 を使っておけということになる。 http://peace.5ch.net/test/read.cgi/hp/1444186237/554
555: Name_Not_Found [sage] 2015/11/04(水) 00:30:30.32 ID:??? >>551 試してみたんですが、タイマーが機能せず、 同時実行無理なんですよね・・・あきらめまs http://peace.5ch.net/test/read.cgi/hp/1444186237/555
556: Name_Not_Found [sage] 2015/11/04(水) 00:57:32.21 ID:??? >>551 本職か? ならば俺の見解は550の通りだが、そちらの見解を聞きたい。 現実的には安全策を採って色々あるのだと思うし、 それ以前に各種ブラウザ対策でルールが埋まっている気もするが。 http://peace.5ch.net/test/read.cgi/hp/1444186237/556
557: 547 [] 2015/11/04(水) 01:22:32.48 ID:pUq54Vxq >>548-549 > さてgetFirstLine1だが、先述の通り、ここはB(速度)を目指さないといけない。(存在価値がない) どんなコードでも催促のコードを書くことを目指すべきという考え方は好感が持てるものだが、正規表現エンジンの速度は最適化具合によって異なる getFirstLine1 と getFirstLine3 のどちらが速いかは実装依存だろう > そこで処理順なのだが、速度を目指すのだから、よくある順にショートカットにして組むことが必要になる。 その通りだが、「よくある順」を知っているのは質問者だけだ 私は getFirstLine1 の用途を想定できないのでそれは質問者に委ねることになる 具体的にはよくある文字列が「1行」「\rだけ含む」「\nだけ含む」「\r\nを含む」のどれなのかを想定できない だから、速度重視としてはアルゴリズムか実装の最適化具合に応じて組むことになる > 多分そちらの「構造化プログラミング」ってのはreturnを1個にしろという話だろうけど、そういうのは俺は気にしていない。 これは安全性重視の考え方だ 速度重視なら採用価値がないが、想定要素が違うのでポリシー次第だろう > getFirstLine2はcharAtを使うのならこの実装で妥当だろう。 どういう理由で妥当なのだ? 速度重視ならこのコードはあり得ないし、私としては妥協した結果なのだが 空文字を引数にとる場合、do-while では速度上で問題が出るだろう(ただし、空文字でも charSt は適切に処理できるはずだ) getFirstLine1 に気が向いていたので妥協したが、while 文にした方が速いだろう http://jsfiddle.net/cau4mx8d/4/ http://peace.5ch.net/test/read.cgi/hp/1444186237/557
558: 547 [] 2015/11/04(水) 01:32:27.89 ID:pUq54Vxq >>550 > ただ、それ以前に、「どんな型でもちゃんと処理しろ」というのはやはり負担が大きく、どこかしらでバグるだろうから、 そんなことはない どんな型でも安全に処理すべきだし、私のポリシーは「1: 安全、2: 速度」だ ECMAScript は型が緩いといわれるが、それは内部的に型変換して処理しているからだ ほとんどの演算子、関数は内部的に始めの処理でキャスト(型変換)している 従って、始めの処理で引数をキャストしておけば「どんな型でも適切に処理」することは難しくない ここで回答する時には「例外処理ぐらいは自分でやってくれ」のスタンスで意識的に省略することがあるが、>>537の指摘は妥当なものだ 例えば、RegExp.prototype.exec は第一引数を ToString (String型に変換) するのでどんな型でも適切に処理できる http://www.ecma-international.org/ecma-262/6.0/#sec-regexp.prototype.exec >>531は String.prototype.match を使用しているが、これは String 型を引数に持たない場合に適切に処理できないので妥当ではない ES 仕様で内部的に型変換してくれるのならそれを利用すべきだ ネイティブ関数の内部処理でキャストする方が String() でキャストするよりも速度面で有利だからだ しかし、速度重視のスタンスの割には getFirstLine1 で i1 === -1 の比較回数に触れられていないのが意外だ 私としては速度的にまだ満足できるレベルではなかったので、あなたが「最良のアルゴリズム」を出してくれることを期待していたのだが getFirstLine1 は i1 の比較が最大で3回実行されるというのが無駄だと思っている var has1 = i1 !== -1; のように結果をキャッシュさせる事も対策の一つとして考えられるが、比較回数を減らすのが重要だろう http://jsfiddle.net/cau4mx8d/4/ ECMAScript はスコープチェーンで変数を参照するのでグローバル変数は基本的に遅い その為、String() を使うときにはクロージャに閉じ込める等してスコープ走査回数を抑える実装にする事がある ここでは getFirstLine1 はグローバル関数なので気にする必要がないが、実際に運用では気をつけるべきだろう また、String() ではなく、arg + '' で型変換する方法もあるが、この方法は ToString() とは違うので基本使わない http://peace.5ch.net/test/read.cgi/hp/1444186237/558
559: Name_Not_Found [sage] 2015/11/04(水) 01:47:06.19 ID:??? >>506的なのやりたいときこんな感じにしてたわ for (var i=0,l=text.length,;i<l;i++) { if (text[i]=="\r" || text[i]=="\n") { break; } } http://peace.5ch.net/test/read.cgi/hp/1444186237/559
560: 547 [] 2015/11/04(水) 02:09:19.37 ID:pUq54Vxq >>554 > 結果、getFirstLine1はMac/UNIXの大規模テキストを食わされると極度に遅くなる。 > とはいえ、良い対策は無い。 確かに2回走査するのは getFirstLine1 の弱点だ 対策としては string.indexOf('\n'); の後に string.slice(0, i1) する方法が考えられる 「\n がなく、\r がある巨大なテキスト」「\nも\rもない巨大なテキスト」には対応できてないので根本的な解決ではないが、UNIXなテキストには一応対応できる http://jsfiddle.net/cau4mx8d/5/ http://peace.5ch.net/test/read.cgi/hp/1444186237/560
561: Name_Not_Found [sage] 2015/11/04(水) 02:54:17.38 ID:??? > >>557 若干被るかもしれないが、とりあえず書いたから投稿しておく。 > どんなコードでも催促のコードを書くことを目指すべき 違う。常に何のためのコードなのかを考えろということ。 見た目のわかりやすさなのか、速度なのか。安全性ならそれはそれでいい。 > 正規表現エンジンの速度は最適化具合によって異なる これはその通りだが、通常は軽い仕様の方が速い。(正規表現は色々出来る分遅い) 1つのindexOfとexecで両方が同一箇所でマッチする時、(今回なら\rの検索) 通常はindexOfの方が速い、というか、indexOfの方が遅くなる実装を作ることの方が難しい。 既に書いたが、ヒットしないケースでキャッシュに収まらないほどのテキストを食わされると、 2回転させる必要のある1は劇的に遅くなる。ただ、そうでない場合は、indexOf2回転の方が速いはず。 ググれば分かるが、正規表現オブジェクトの作成が実はそこそこ重く、 3は正規表現リテラルをクロージャでくくりだしてしまうだけでも高速化する。(ただし自動化されている場合もある) > 「よくある順」を知っているのは質問者だけだ 違う。普通の入力を想定しろということ。 -1 && -1 は改行がなかった場合だ。それが主な場合にはこういう仕様の関数にはならない。 普通はこの手の関数は>>536のとおり、ファイルの頭切り出しとかに使う。だからそれを想定しろということ。 >>506にもその通り記述されている。 > 改行文字で区切られた複数行の文字列が入った変数 text があったとする http://peace.5ch.net/test/read.cgi/hp/1444186237/561
562: Name_Not_Found [sage] 2015/11/04(水) 02:54:58.75 ID:??? > 空文字を引数にとる場合、do-while では速度上で問題が出るだろう > getFirstLine1 に気が向いていたので妥協したが、while 文にした方が速いだろう 何故だ?cau4mx8d/3/とcau4mx8d/4/では速度差は出ないはずだが。(中身は同じだ) 多分ただの勘違いだと思うが、do/whileもショートカット論理で動く。 > ES 仕様で内部的に型変換してくれるのならそれを利用すべきだ もちろんその通りだが、バグを少なくするコツは「簡単にすること」だ。 だから、単純に「どんな型が来るか分かりません」よりも「必ずstring型が来ます」の方がバグらない。 ポリシーとしては、多分、 α:各関数で型チェック、つまり各関数は複雑になりますが、個々で安全を保証します。 β:入力先頭で型チェック、つまり各関数は型決めうちでシンプル、ただし入力の最初に必ず型保証を入れる必要があります。 のどちらかになる。JavaScriptの場合はどこで入力しているか見やすいので、多分βの方が全体的に簡単になると見ている。 ただここら辺は本職に確認した方がいい。 > あなたが「最良のアルゴリズム」を出してくれることを期待していたのだが 俺は俺ツエーするために書いているわけではないからね。それは君が君自身のためにやるべき事だ。 ただ、速くしたいだけなら他にも策はあって、 例えば今回はCRLFまたはLFなのだから、indexOf('\n')ではなく indexOf('\r')-1をチェックすればいい。 -1の比較回数を減らすのは実は余り効かない。それはループではないから。(関数で1回だから) ただ、それをしたいのならすればいいし、そういうところにはこだわるべきだと思う。 とはいえ、cau4mx8d/4/のコードだと i1=-1, i2=-1の場合、2つ目のsliceに当たってしまうぞ。 > String() を使うときにはクロージャに閉じ込める等してスコープ走査回数を抑える実装にする事がある これな、以前は確かにこの通りだったが結局最適化で何とかなったらしく、String()はイラネーみたいな記事もあって、 実際のところこちらでも大して変わらなかった記憶がある。 (以前の実装用に最適化したJSはバッドプラクティスになった!みたいな書き方だったが、俺が試した限り、遅くもなかった) http://peace.5ch.net/test/read.cgi/hp/1444186237/562
563: Name_Not_Found [sage] 2015/11/04(水) 03:02:56.66 ID:??? ああすまん、俺のCRとLFが逆だな。これまで全部。 悪いが脳内変換してくれ。まあ分かる範囲だろw http://peace.5ch.net/test/read.cgi/hp/1444186237/563
564: Name_Not_Found [sage] 2015/11/04(水) 03:20:12.69 ID:??? >>560 cau4mx8d/5/ で俺はいいと思うけどね。 > 「\n がなく、\r がある巨大なテキスト」 昔のMacだけだから問題ない。 > 「\nも\rもない巨大なテキスト」 どの実装でも遅いから問題ない。 http://peace.5ch.net/test/read.cgi/hp/1444186237/564
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 438 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.353s*