JavaScript

フローチャートを描く(5)

処理の部分も判断と同様。 これは、roundrectを素直に使えた。 http://www.geocities.jp/pxu02524/personal/flowchart4.htm 処理よりどうしても小さくなりがちなので、 最小の大きさを決めたほうがいいかも。

フローチャートを描く(4)

判断の名前がやたらと長くなると、 それに応じてひし形も横長になる。 これを避けるために、"_"があったらそこで改行してもいいとする。 例えば、"aaa_bbb"なら、 aaa _bbb でもいいとする。 どこで改行するか、あるいは改行しないかは、 W+Hが最も小さくな…

フローチャートを描く(3)

今まで2回分の内容を表現した実際のページ上げた。 http://www.geocities.jp/pxu02524/personal/flowchart1.htm 数字を入れると中の長方形が大きくなり、 それに合わせて外のひし形が大きくなる。 http://www.geocities.jp/pxu02524/personal/flowchart2.htm…

フローチャートを描く(2)

判断の名前が実際に与えられたとき、 その表示の大きさを求める。 これはIEでしか使えないと思うが、 textRangeを使う。 <input type="text" id="forSize" value="aaa"></form> このようなテキストボックスを作っておいて、 var rng = form.forSize.createTextRange(); var w = rng.boundingWidth; var h = rng.b…

JScriptのメソッドの速度/test(1)

正規表現を使った文字列の検索が、 indexOfと比べて速度がどの程度なのか調べた。 以前と同様に調べた。 http://d.hatena.ne.jp/inamori/20061219正規表現は、いったん var reg = /b/;などとしてから使うと indexOfを使うのとそれほど速度が変わらなくなる。…

JScriptのメソッドの速度/split

長さ100の文字列をカンマで結合した文字列を、 カンマでsplitしてn要素のArrayを作る。 これを10万/n回繰り返す。だいたいArrayの1要素あたり3μsかかっているので、 ほとんどArrayを作る時間になっている。 自作のコードはこちら。 String.prototype.split2 …

JScriptのメソッドの速度/indexOf

長さnで末尾だけが'b'の文字列を用意する。 この文字列を最初から'b'を検索する。 これを10万回繰り返す。 この実行時間の10回平均を出す。きれいに線形になる。 1文字を比較して進むのに、16ns程度かかるということか。

JScriptのメソッドの速度/concat

concatはconcatenateの略で文字列を連結させる。 var str = str2.concat(str3);は、 var str = str2 + str3;と同じ。 時間も、メソッド化で遅くなっただけ。 恐らく、こういうメソッドがあったほうが オブジェクト指向っぽく見えるからあるのだろう。 前回の…

JScriptのメソッドの速度/substring

substringはcharAtと同じ結果を出す場合、 2%ほど遅くなるようである。 また、違う位置の文字列を取り出してもほぼ同じ時間がかかる。 大きな文字列を取り出す場合は、やはり違ってくる。 文字列の結合のときと同じように、 http://d.hatena.ne.jp/inamori/2…

Arrayの初期化子の末尾のカンマ

要旨 Arrayの初期化の動作がIEとFirefoxで違う。 ECMAの仕様通りなのはIE(JScript)、 っぽい。 経緯 自動巡回のスクリプトをWSH/JScriptで組んでいたが、 Windowsを98からMEに変えたとき、 ときどき動作がおかしいことがあった。 しかし、致命的ではないので…

JScriptのメソッドの速度/charAt

ここからは、Stringのメソッドを取り上げていく。 charAtはさすがに自作で代替できないので、 このメソッドの速度だけを計測する。 長い文字列でも短い文字列でもどの位置でも同じ時間がかかるか。 長さ10〜100万まで行ってみたが、 いずれも1回当たり3.1μs…

JScriptのメソッドの速度/join(3)

Arrayには長さ1の文字列が2n個格納されているとする。 これを順に結合していくとする。 結合にかかる時間は、結合された結果の文字列の長さに比例し、 長さが1なら単位時間かかるとする。 すべての結合にかかる時間は、 2 + ... + 2n = 2n-1(2n + 1) - 1 と…

JScriptのメソッドの速度/join(2)

なぜ前回の自作joinメソッドが遅いかというと、 文字列の結合にかかる時間には次のような性質があるからだ。 長さnの文字列の結合を、1億/n回繰り返す。 この実行時間の10回平均を出す。結合した結果の文字列の長さが16k以内だと 結合の回数にだいたい比例し…

JScriptのメソッドの速度/join(1)

前にも書いたが、http://d.hatena.ne.jp/inamori/20060927JScriptでは、ある程度大きくなると文字列の結合が異常に遅い。 しかし、joinで結合すると非常に速くなる。 だから、新たにオブジェクトを作ってでもjoinを使うべきだ。 組込みのjoinと、単純に結合…

JScriptのメソッドの速度/reverse

spliceは省略。 気が向いたらあとで。 大きさ10のArrayを用意して、 この反転を10万回繰り返す。 この実行時間の10回平均を出す。 結果は、 組込み459ms 自作1103ms となった。 Arrayが大きくなっても、だいたいこんなカンジ。 新たなオブジェクトの生成がま…

JScriptのメソッドの速度/slice

sliceは、Arrayの一部を取り出すメソッドである。 元のArrayは変わらない(ベンチマークしやすい)。 ary.slice(a, b);のように使い、 aは取り出し始めの位置、bは終わりの位置。 負なら後ろから数える。 ary.slice(0); // 0,1,2,3,4,5 ary.slice(1); // 1,2…

JScriptのメソッドの速度/unshift(2)

unshiftは、 Arrayの長さが大きいほうが当然時間がかかるが、 短くなるとメソッド呼び出しのコストが大きくなる。 unshiftとメソッドを呼び出さない方法で、 Arrayの頭に要素を追加する時間を比較しよう。 メソッドを呼び出さないコードは次のよう: functio…

JScriptのメソッドの速度/unshift(1)

unshiftはArrayの先頭に要素を追加し、Arrayを返す。 複数追加できる。 長さ0のArrayを用意して、 何も追加しないというのを10万回繰り返す。 この実行時間の10回平均を出す。 // 232ms function test1() { var a = [ ]; for(var i = 0; i a.unshift(); } }/…

JScriptのメソッドの速度/shift

長さ1000のArrayを用意して、 前から順に最後まで取り出していく。 これを10回繰り返して、平均を取る。 // 227ms function test1(a) { for(var i = 0; i a.shift(); } }shiftの代わりに次のようなコードも試した。 // 505ms function test2(a) { for(var i …

JScriptのメソッドの速度/push

これから、JScriptの組込みオブジェクトのメソッドと それを自作したものとの速度を調べていこうと思う。 WSH/JScript5.6で。 まずは手っ取り早いpushから。 pushをm回続けて行う。 これをn=1e6/m回繰り返す。 この実行時間を10回測定する。 function test1(…

組込みのsortが自作ソートより遅いらしい

http://blog.livedoor.jp/dankogai/archives/50695905.html さもありなんという感じだ。 pushもsliceも遅かったし。 http://d.hatena.ne.jp/inamori/20061107 実際にやってみたところ、 IE6では自作ソートの方がやや遅い、 Firefox1.5でも同様だった。 ただ…

JScript高速化(17)

あとちょっとだけ。 約分のところを改善できる。 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 = …

JScript高速化(16)

係数を分数にしよう。 fractionも今までと同じ手法で高速化を行った。 16.7sが、100回で34.3sと、約50倍速くなった。 もうちょっと速くなると思ってたんだが。ソースは隠しておく。

JScript高速化(15)

あと高速化していないのは、合成のメソッドくらいだが、 // 合成 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…

JScript高速化(14)

元々何をしようとしているか思い出しておこう。 0

JScript高速化(13)

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 +…

JScript高速化(12)

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] …

JScript高速化(11)

型の判別 加算は、引数に数値と多項式が取れるようにしている。 this.add = function(p) { var r = new poly(); // 返り値の準備 if(typeof p == "number") { // 引数が数値だったときの処理 } else if(p instanceof poly) { // 多項式だったときの処理 } el…

JScript高速化(10)

ここからは個別に高速化していこうと思う。 あまり一般的な手法は得られない気がする。 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] += …

JScript高速化(9)

まとめの後半。 6. 組込みオブジェクトを拡張すると速くなることがある Array.prototype.copy = poly_copy;function poly_copy(p) { ... }このようにすると、Arrayにcopyメソッドが追加される。 ユーザ定義型より組込み型のほうが速いときは、 こうすると速…