argumentsを使わない – JSXの場合
そもそも arguments がない
関数のオーバーロードが可能
⁃ コンパイル時に別名になる
// コンパイル後の名前: set$Lpoint
function set(pt : Point) : void {
this.x = pt.x;
this.y = pt.y;
}
// コンパイル後の名前: set$NN
function set(x : number, y : number) : void {
this.x = x;
this.y = y;
}
JSX 速さの秘密 - 高速なJavaScriptを書く方法
16
Copyright (C) 2013 DeNA Co.,Ltd. All Rights Reserved.
17.
コンストラクタのオーバーロード
通常の関数は名前を変えることでオーバーロード可能
Q.コンストラクタの場合、どうするか?
A. こんなコードを書く (JSXの内部実装より抜粋)
function $__jsx_extend(derivations, base) {
var ctor = function () {};
ctor.prototype = base.prototype;
var proto = new ctor();
for (var i in derivations)
derivations[i].prototype = proto;
}
function Point1(pt) { this.x = pt.x; this.y = pt.y; }
function Point2(x, y) { this.x = x; this.y = y; }
// new Point1 しても new Point2 しても同じ型のオブジェクトが生成するおまじない
$__jsx_extend([ Point1, Point2 ], Object);
JSX 速さの秘密 - 高速なJavaScriptを書く方法
17
Copyright (C) 2013 DeNA Co.,Ltd. All Rights Reserved.
組み込み関数が速いとは限らない (3)
JSXの場合:
⁃Function.prototype 系は存在しない
⁃ クロージャがthisを引き継げるような言語仕様
•
→ bindの必要性が低い
•
JSXのソースコード:
var f = function () : void {
this.n++;
};
•
コンパイル結果 (JavaScript):
var $this = this;
var f = function (){
$this.n++;
};
JSX 速さの秘密 - 高速なJavaScriptを書く方法
23
Copyright (C) 2013 DeNA Co.,Ltd. All Rights Reserved.
24.
組み込み関数が速いとは限らない (4)
JSXの場合:
⁃Array#forEachは独自に実装
⁃ 言語仕様が硬い分、JavaScriptよりも処理が単純に
⁃ 参照:
http://d.hatena.ne.jp/kazuhooku/20120612/133948
9758
JSX 速さの秘密 - 高速なJavaScriptを書く方法
24
Copyright (C) 2013 DeNA Co.,Ltd. All Rights Reserved.
アフィン変換 (クラス定義)
class Matrix{
var m11 : number; var m21 : number; var m31 : number;
var m12 : number; var m22 : number; var m32 : number;
...
function transform(pt : Point): Point {
return new Point(
this.m11 * pt.x + this.m21 * pt.y + this.m31,
this.m12 * pt.x + this.m22 * pt.y + this.m32);
}
}
class Point {
var x : number; var y : number;
function constructor(x : number, y : number) {
this.x = x;
this.y = y;
}
...
JSX 速さの秘密 - 高速なJavaScriptを書く方法
30
Copyright (C) 2013 DeNA Co.,Ltd. All Rights Reserved.
31.
アフィン変換 (コンパイル例)
JSXのソースコード:
varpt = new Matrix(1, 0, 0, 0, 2, 0).transform(new Point(x, y));
x = pt.x;
y = pt.y;
最適化コンパイル後 (JavaScript):
var pt$x = x + 0 * y;
y = 0 * x + 2 * y;
x = pt$x;
適用された最適化手法:
⁃ LTO (transformの実装を確定)
⁃ インライン展開
⁃ Unboxing
⁃ 定数畳み込みとDCE
JSX 速さの秘密 - 高速なJavaScriptを書く方法
31
Copyright (C) 2013 DeNA Co.,Ltd. All Rights Reserved.
32.
まとめ
JSX 速さの秘密 -高速なJavaScriptを書く方法
32
Copyright (C) 2013 DeNA Co.,Ltd. All Rights Reserved.