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.
27. 事前計算
定数畳み込み
⁃ JSXのソースコード:
const name = ”John”;
…
console.log(”Hello, ” + N);
⁃ コンパイル結果 (JavaScript):
console.log(”Hello, John”);
JSX 速さの秘密 - 高速なJavaScriptを書く方法
27
Copyright (C) 2013 DeNA Co.,Ltd. All Rights Reserved.
28. 事前計算 (その2)
Dead-code Elimination
⁃ JSXのソースコード:
const DEBUG = 0;
…
if (DEBUG) console.log(”in debug mode”);
⁃ コンパイル結果 (JavaScript):
// からっぽ
JSX 速さの秘密 - 高速なJavaScriptを書く方法
28
Copyright (C) 2013 DeNA Co.,Ltd. All Rights Reserved.
29. LTO (リンク時最適化)
以下のコードで、mの型は何?
function transform(m: Matrix, pt : Point) : Point {
return m.rotate(pt);
}
mの型はMatrix型かもしれないし、Matrixの派生型かも
⁃ これでは、rotateの実装を特定できない
•
→ rotateをインライン展開できない
そこでLTO!
⁃ LTO: プログラムが使用する全てのコードに関する情
報を使って(つまり、リンク時に)最適化
⁃ Matrixを継承した型がなければ、mの型はMatrix型
JSX 速さの秘密 - 高速なJavaScriptを書く方法
29
Copyright (C) 2013 DeNA Co.,Ltd. All Rights Reserved.
30. アフィン変換 (クラス定義)
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のソースコード:
var pt = 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.