JavaScript
処理の部分も判断と同様。 これは、roundrectを素直に使えた。 http://www.geocities.jp/pxu02524/personal/flowchart4.htm 処理よりどうしても小さくなりがちなので、 最小の大きさを決めたほうがいいかも。
判断の名前がやたらと長くなると、 それに応じてひし形も横長になる。 これを避けるために、"_"があったらそこで改行してもいいとする。 例えば、"aaa_bbb"なら、 aaa _bbb でもいいとする。 どこで改行するか、あるいは改行しないかは、 W+Hが最も小さくな…
今まで2回分の内容を表現した実際のページ上げた。 http://www.geocities.jp/pxu02524/personal/flowchart1.htm 数字を入れると中の長方形が大きくなり、 それに合わせて外のひし形が大きくなる。 http://www.geocities.jp/pxu02524/personal/flowchart2.htm…
判断の名前が実際に与えられたとき、 その表示の大きさを求める。 これはIEでしか使えないと思うが、 textRangeを使う。 <input type="text" id="forSize" value="aaa"></form> このようなテキストボックスを作っておいて、 var rng = form.forSize.createTextRange(); var w = rng.boundingWidth; var h = rng.b…
正規表現を使った文字列の検索が、 indexOfと比べて速度がどの程度なのか調べた。 以前と同様に調べた。 http://d.hatena.ne.jp/inamori/20061219正規表現は、いったん var reg = /b/;などとしてから使うと indexOfを使うのとそれほど速度が変わらなくなる。…
長さ100の文字列をカンマで結合した文字列を、 カンマでsplitしてn要素のArrayを作る。 これを10万/n回繰り返す。だいたいArrayの1要素あたり3μsかかっているので、 ほとんどArrayを作る時間になっている。 自作のコードはこちら。 String.prototype.split2 …
長さnで末尾だけが'b'の文字列を用意する。 この文字列を最初から'b'を検索する。 これを10万回繰り返す。 この実行時間の10回平均を出す。きれいに線形になる。 1文字を比較して進むのに、16ns程度かかるということか。
concatはconcatenateの略で文字列を連結させる。 var str = str2.concat(str3);は、 var str = str2 + str3;と同じ。 時間も、メソッド化で遅くなっただけ。 恐らく、こういうメソッドがあったほうが オブジェクト指向っぽく見えるからあるのだろう。 前回の…
substringはcharAtと同じ結果を出す場合、 2%ほど遅くなるようである。 また、違う位置の文字列を取り出してもほぼ同じ時間がかかる。 大きな文字列を取り出す場合は、やはり違ってくる。 文字列の結合のときと同じように、 http://d.hatena.ne.jp/inamori/2…
要旨 Arrayの初期化の動作がIEとFirefoxで違う。 ECMAの仕様通りなのはIE(JScript)、 っぽい。 経緯 自動巡回のスクリプトをWSH/JScriptで組んでいたが、 Windowsを98からMEに変えたとき、 ときどき動作がおかしいことがあった。 しかし、致命的ではないので…
ここからは、Stringのメソッドを取り上げていく。 charAtはさすがに自作で代替できないので、 このメソッドの速度だけを計測する。 長い文字列でも短い文字列でもどの位置でも同じ時間がかかるか。 長さ10〜100万まで行ってみたが、 いずれも1回当たり3.1μs…
Arrayには長さ1の文字列が2n個格納されているとする。 これを順に結合していくとする。 結合にかかる時間は、結合された結果の文字列の長さに比例し、 長さが1なら単位時間かかるとする。 すべての結合にかかる時間は、 2 + ... + 2n = 2n-1(2n + 1) - 1 と…
なぜ前回の自作joinメソッドが遅いかというと、 文字列の結合にかかる時間には次のような性質があるからだ。 長さnの文字列の結合を、1億/n回繰り返す。 この実行時間の10回平均を出す。結合した結果の文字列の長さが16k以内だと 結合の回数にだいたい比例し…
前にも書いたが、http://d.hatena.ne.jp/inamori/20060927JScriptでは、ある程度大きくなると文字列の結合が異常に遅い。 しかし、joinで結合すると非常に速くなる。 だから、新たにオブジェクトを作ってでもjoinを使うべきだ。 組込みのjoinと、単純に結合…
spliceは省略。 気が向いたらあとで。 大きさ10のArrayを用意して、 この反転を10万回繰り返す。 この実行時間の10回平均を出す。 結果は、 組込み459ms 自作1103ms となった。 Arrayが大きくなっても、だいたいこんなカンジ。 新たなオブジェクトの生成がま…
sliceは、Arrayの一部を取り出すメソッドである。 元のArrayは変わらない(ベンチマークしやすい)。 ary.slice(a, b);のように使い、 aは取り出し始めの位置、bは終わりの位置。 負なら後ろから数える。 ary.slice(0); // 0,1,2,3,4,5 ary.slice(1); // 1,2…
unshiftは、 Arrayの長さが大きいほうが当然時間がかかるが、 短くなるとメソッド呼び出しのコストが大きくなる。 unshiftとメソッドを呼び出さない方法で、 Arrayの頭に要素を追加する時間を比較しよう。 メソッドを呼び出さないコードは次のよう: functio…
unshiftはArrayの先頭に要素を追加し、Arrayを返す。 複数追加できる。 長さ0のArrayを用意して、 何も追加しないというのを10万回繰り返す。 この実行時間の10回平均を出す。 // 232ms function test1() { var a = [ ]; for(var i = 0; i a.unshift(); } }/…
長さ1000のArrayを用意して、 前から順に最後まで取り出していく。 これを10回繰り返して、平均を取る。 // 227ms function test1(a) { for(var i = 0; i a.shift(); } }shiftの代わりに次のようなコードも試した。 // 505ms function test2(a) { for(var i …
これから、JScriptの組込みオブジェクトのメソッドと それを自作したものとの速度を調べていこうと思う。 WSH/JScript5.6で。 まずは手っ取り早いpushから。 pushをm回続けて行う。 これをn=1e6/m回繰り返す。 この実行時間を10回測定する。 function test1(…
http://blog.livedoor.jp/dankogai/archives/50695905.html さもありなんという感じだ。 pushもsliceも遅かったし。 http://d.hatena.ne.jp/inamori/20061107 実際にやってみたところ、 IE6では自作ソートの方がやや遅い、 Firefox1.5でも同様だった。 ただ…
あとちょっとだけ。 約分のところを改善できる。 function fraction_normalize() { // ユークリッドの互除法 var a = this.a; var b = this.b; var a2, f; while(true) { if((a2 = a % b) == 0) { f = b; break; } if((b %= a) == 0) { f = a; break; } a = …
係数を分数にしよう。 fractionも今までと同じ手法で高速化を行った。 16.7sが、100回で34.3sと、約50倍速くなった。 もうちょっと速くなると思ってたんだが。ソースは隠しておく。
あと高速化していないのは、合成のメソッドくらいだが、 // 合成 function poly_synthesize(p) { if(!(p instanceof poly)) throw("unsupported argument in poly::synthesize"); var r = new poly(); for(var i = this.length - 1; i >= 0; i--) r = r.mult…
元々何をしようとしているか思い出しておこう。 0
2次と4次の多項式の掛け算は次のようになる。 f(x) = a0 + a1x + ... + a6x6 g(x) = b0 + b1x + ... + b2x2 h(x) = c0 + c1x + ... + c4x4 f(x) = g(x)h(x)とすると、 a0 = b0c0 a1 = b0c1 + b1c0 -------------------- a2 = b0c2 + b1c1 + b2c0 a3 = b0c3 +…
multiply 1に1+xを9回掛けるを1万回繰り返す。 // 13091ms this.multiply = function(p) { var r = new poly(); if(typeof p == "number") { for(var i = 0; i r.a[i] *= p; } else if(p instanceof poly) { for(var i = 0; i for(var j = 0; j if(r.a[i+j] …
型の判別 加算は、引数に数値と多項式が取れるようにしている。 this.add = function(p) { var r = new poly(); // 返り値の準備 if(typeof p == "number") { // 引数が数値だったときの処理 } else if(p instanceof poly) { // 多項式だったときの処理 } el…
ここからは個別に高速化していこうと思う。 あまり一般的な手法は得られない気がする。 add // 加算 this.add = function(p) { var r = this.copy(); if(typeof p == "number") r.a[0] += p; else if(p instanceof poly) { for(var i = 0; i if(i r.a[i] += …
まとめの後半。 6. 組込みオブジェクトを拡張すると速くなることがある Array.prototype.copy = poly_copy;function poly_copy(p) { ... }このようにすると、Arrayにcopyメソッドが追加される。 ユーザ定義型より組込み型のほうが速いときは、 こうすると速…