JavaScript

JScript高速化(8)

ここでいったんまとめを。 Arrayオブジェクトの拡張というのはちょっと気持ち悪いから、 本当は継承できたらいいのだが、 どうもうまくいかないし、 できても遅そうなので追究はしない。 まとめ 1. Arrayのpushは使うな 2. Arrayのコンストラクタは[ ]を使う…

JScript高速化(7)

r[i] = this[i];はエラーだったが、 そういえば、これをやっていなかったような気もする。 var a = this; r[i] = a[i];あ、動くね。 やったと思っていたのに。 function poly_copy() { var r = new poly(); var a = this; for(var i = this.length - 1; i >=…

JScript高速化(6)

prototype 昨日のはメソッドを書いていなかったから、 それを書き足すと、 // 5027ms function poly(a) { ... this.copy = poly_copy; this.add = poly_add; this.subtract = poly_subtract; this.multiply = poly_multiply; this.value = poly_value; this.…

JScript高速化(5)

前回は、 単純なオブジェクトの生成と polyオブジェクトの生成との間に大きな差があることが分かった。 この差はなんなのかつきつめていこう。 そのために、単純なオブジェクトから少しずつプロパティを追加していく。 // 1597ms function poly() { this.a =…

JScript高速化(4)

new 前回、コンストラクタのコストが高いことが分かったので、 これをどうにかしよう。 まず、最小のユーザ定義オブジェクトの生成を見てみよう。 function poly() { ; }この生成を10万回実行する。 // 642ms for(var i = 0; i new poly(); // 33ms for(var …

JScript高速化(3)

具体的な問題に入っていこう。 copy var p = new poly([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]); for(var i = 0; i var r = p.copy();を速くすることを考えよう。 ここで、polyの係数はfractionでなく値とする。 copyは、 function poly() { var args = poly.argu…

JScript高速化(2)

もっとまじめに考えよう。 プロパティへの代入ってどうなんだろう。 こんなコードを考えてみよう。 var n = 100000;// 509ms var a = [ ]; for(var i = 0; i for(var j = 0; j a[j] = j; } // 203ms var a = [ ]; for(var i = 0; i for(var j = 0; j ; }つま…

JScript高速化(1)

多項式クラスを速くしたいが、 そのために基礎的な実験をしておこう。 push Arrayのpushを派手に使っている。 使い勝手や見栄えがいいのでついつい使っているが、 これはたぶん遅い。 Arrayオブジェクトを作って0〜9を代入することを考える。 これを10万回実…

大きな文字列が猛烈に遅い(3)

大きな文字列の結合が遅いことを以前示したが、 その際、結果の文字列の長さが効くのか、 連結前の文字列の長さが効くのかを調べるのを忘れていた。 次のようなコードで試してみた。 for(var i = 1000; i var i1, i2; for(var i1 = i >> 1; i1 > 100; i1 >>=…

正規分布の近似(14)

結局、分数クラスを作った。 思っていたほどは苦労しなかったが、 やはりデバッグがいやな作業だった。 p10,0 = 1/362880x^9 p10,1 = 1/36288-1/4032x+1/1008x^2-1/432x^3+1/288x^4-1/288x^5+1/432x^6-1/1008x^7+1/4032x^8-1/40320x^9 p10,2 = -329/5184+115…

正規分布の近似(14)

例えば、0.2142857142857という小数を考える。 この逆数を取ると、4.6666666666667、 小数部分を取ると、0.6666666666667、 この逆数を取ると、1.5、 小数部分を取ると、0.5、 この逆数を取ると、2、 小数部分を取ると、0 この手順を逆に辿っていくと分数に…

正規分布の近似(13)

そういえば忘れていたが、 求めた多項式を具体的に表示していなかった。 p10,0 = 0.0000027557319223985892x^9 p10,1 = 0.00002755731922398474-0.0002480158730158727x+0.0009920634920634933x^2-0.002314814814814814x^3+0.0034722222222222194x^4-0.00347…

正規分布の近似(12)

多項式のライブラリを書けばあとは簡単。 var n = 10; var p = [ ]; p[1] = [ ]; p[1][0] = new poly(1); for(var i = 2; i p[i] = [ ]; for(var j = 0; j if(j == 0) p[i][j] = p[i-1][0].integral( 0, new poly(0, 1)); else if(j == i - 1) p[i][j] = p[i…

正規分布の近似(11)

積分を含んだ多項式の漸化式を計算するためのプログラムを書く準備をする。 プログラムはお手軽にJavaScriptで書く。 要するにここでは、多項式のユーザ定義オブジェクトのコードを書く。 プロパティ 多項式の係数を配列として持つ。 function poly() { this…

大きな文字列が猛烈に遅い(2)

いちおう、もうちょっとまじめに探ってみよう。 こんな風に、文字列の結合にかかる時間を計ってみる。 for(var i = 1000; i var s = makeString(i); // 長さiの文字列を作る var d = (new Date()).getTime(); for(var j = 0; j var str = s + s; WScript.Ech…

大きな文字列が猛烈に遅い

http://www.geocities.jp/pxu02524/personal/prime.htm Ajaxで、 例えばcsvファイルをXMLHttpRequestで読んで、 それをテーブルにして表示する、 ということを考える。 こんな感じ: var data;function readData() { ... reqPrime.onreadystatechange = func…

thisは何を指す?(2)

thisは、 オブジェクトの中ではオブジェクトを指し、 イベントハンドラではイベントが起こったオブジェクトを指す。 それでは、オブジェクトの中のオブジェクトでイベントが起こったときはどうなるだろう。 function Num2(n) { this.n = n; this.div = docum…

thisは何を指す?(1)

thisはC++のそれと似たようなもので、 要するに自分自身を指す。 次は、ユーザー定義オブジェクトでの例。 function Person(age) { this.age = age; this.getAge = function() { return this.age; } } var p = new Person(14); alert(p.getAge() + "歳");ま…

イベントハンドラに引数を渡す

HTMLでアンカーをクリックするとある関数が走るとする。 <div id="div1"> <a href="javascript:void(0)" onclick="test(1)">test</a> </div>これを動的に生成しようと考える。 しかも、test1はこのアンカーから見えないとする。 (今から書くスクリプトからは見える) var div = document.getElementById("div1"); var aNode = documen…

文字列の数値への自動変換

var a = "077" - 0; // 77 var b = "0x77" - 0; // 119"0"がついていても8進数とはみなされない。

変数は基本的に参照

var d = new Date(); var d2 = d; d.setMonth(2); WScript.Echo(d2);これを、〜.jsと名前をつけてダブルクリックすると、 Wed Mar 8 21:25:32 UTC+0900 2006などと表示される。 数値と文字列以外は参照だったはず。 文字列は本当は参照なのだが、 あたかも値…