SlideShare a Scribd company logo
HTML5とか勉強会#60
2015年09月29日
ECMAScript 7
- SIMD.js -
ふろしき
ふろしきです。先月にNTTを卒業して、某お絵かき系サービスの中の人になりました!!
東京Web Performance
html5j パフォーマンス部
(先月から)ピクシブ株式会社
自己紹介
「東京Webパフォーマンス」というイベント
ピクシブのオフィスでひっそりとやっています
Webのパフォーマンスを改善する新しい機能を味見しまくる
そんなイベントを不定期で開いています
for文の話をしよう
突然だが…
普通のfor文による繰り返し、現場ではタブー感が
プログラミングの授業で習うfor文。
しかし世の言語は、これを使わせないようにする傾向にあります…なぜでしょう?
// 普通のfor文で各データに加算処理
for( var i=0; i<items.length ; i++ ) {
items[i].add(count);
}
正解…
なんだけど??
// イテレーターで各データに加算処理
for( let item of items ) {
item.add(count);
}
なぜ、わざわざ
こんな方法が…
パフォーマンスの問題を作ることがある!?
普通のfor文は、場合によってはパフォーマンスに問題を作ることがあります。
ループ文で処理する対象の特性にあった、対策が求められているのです
→
→
array[100000000]
繰り返し
実装がむき出し
な処理
iterator
効率よい
データストア
繰り返し
実装を隠蔽!!
データベースに接続しようが
  Generatorだろうが
    Immutable.jsだろうが
な処理
何を使ったっていい!!
API
ループはいつだって辛い
出来る限りループは効率化したい
SIMD
というアプローチについて
例えば、データAとデータBを足した結果をだしたい時、データが2つならカンタン
データA データB+
しかしそれが、あるひとかたまりのデータ同士を足し算したいときは?
データA[0] データB[0]
データA[1] データB[1]
データA[2] データB[2]
データA[3] データB[3]
データA[4] データB[4]
+
+
+
+
+
ループが避けられない
当然、あの忌々しいループが必要になってしまいます。
データA[0]
データA[1]
データA[2]
データA[3]
データA[4]
1回目 加算命令
加算命令
加算命令
加算命令
加算命令
2回目
3回目
4回目
5回目
データB[0]
データB[1]
データB[2]
データB[3]
データB[4]
+
+
+
+
+
SIMDは複数データの加算を1命令で実行!!
SIMDでは、2つの大量データ同士の計算について、
通常はループでやるような処理を、一回の命令を実行できるようにしパフォーマンスを改善します
処理
Single Instruction
Multi Data
データA[0]
データA[1]
データA[2]
データA[3]
データA[4]
データB[0]
データB[1]
データB[2]
データB[3]
データB[4]
+
+
+
+
+
SIMD.js
SIMD.jsとは? -> part of ECMAScript7
SIMD.jsは、Intelらが中心となり仕様の策定を進めている
JavaScriptでSIMDを扱う方法です。ECMAScript7に追加される予定です
→ Firefox
→ Edge
→ WebKit
←Intel(2014年ごろ)
SIMDはCPUの機能、それをJSのAPIから触る
厳密には複数のデータ領域を一回の命令で操作できるというCPUの機能で、
JSでラップされたAPIを経由して扱います
データ[0]
データ[1]
データ[2]
データ[3]
データ[4]
メモリ
CPU
ユーザーランド
JavaScript
による処理
ブラウザ
JavaScript
API
CPU/メモリの
低級な仕組みに
バイパス
高級な
APIによる
ラップ
デメリット
あらかじめ準備された命令しか使えないため、やや柔軟性に欠けますが…、ハマれば高速です
データ[0]
データ[1]
データ[2]
データ[3]
データ[4]
メモリ
CPU
加算
減算
コピー
XORShift
なんでもできるわけじゃない…
ループ文を置き換えれるなんて
そんなカンタンなものじゃない!!
Get Start
データ領域の確保
メモリ上から、SIMDに適したデータ領域を確保し初期化します
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
hoge fuga
var hoge = SIMD.Float32x4(1.0,2.0,3.0,4.0);
var fuga = SIMD.Float32x4(5.0,6.0,7.0,8.0);
計算する
計算して結果を格納します
var piyo = SIMD.Float32x4.add(hoge,fuga);
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
hoge fuga
6.0
8.0
10.0
12.0
piyo
出力する
結果を出力します
var foo = SIMD.Float32x4.extractLane(piyo,0);
6.0
8.0
10.0
12.0
piyo
6.0
foo
出力する
結果を出力します
SIMD.Float32x4.extractLane(piyo,0);
6.0
8.0
10.0
12.0
piyo
6.0
DEMO
もう少しだけ実用的に
waifu2xのJS実装を改善
画像を拡大した時のあのギザギザ感をなくし
シャープにみせるとあるアルゴリズムをSIMDで改善します!!
拡大
waifu2x
waifu2xのJS実装を改善
画像を拡大した時のあのギザギザ感をなくし
シャープにみせるとあるアルゴリズムをSIMDで改善します!!
拡大
waifu2x
DEMO
http://inside.pixiv.net/entry/2015/07/28/230317
今回やったデモの内容は、こちらに詳細があります!!
まとめ
まとめ
ブラウザ上でも、二次元画像みたいなバイナリを効率的に処理する術が増えてて嬉しいです
・WebAssemblyと同じ文脈で語られる
 パフォーマンス改善技術。
・大量のデータ同士の計算を
 ループ文無しでさせることができる。
・CPUのSIMD命令を、JavaScript APIから
 扱うことができる。
・ぶっちゃけ人間が使うやつじゃないですね!
Thank You!
@_ furoshiki

More Related Content

PDF
デブサミ2014【13-D-2】川田寛氏 HTML5がSIに与えた衝撃、エンジニアは何を学ぶべきか?
PDF
完全負け組なモバイルWebが、これから復活する(多分)
PDF
モバイルWebアプリのこれまでとこれから
PDF
これからのモバイルWebと最新動向
PDF
次世代Web業務アプリケーション
PDF
はじめてのモバイルウェブアプリ 1
PDF
はじめてのモバイルウェブアプリ 2
PDF
HTML5でできるカメラアプリを実際に体験しよう
デブサミ2014【13-D-2】川田寛氏 HTML5がSIに与えた衝撃、エンジニアは何を学ぶべきか?
完全負け組なモバイルWebが、これから復活する(多分)
モバイルWebアプリのこれまでとこれから
これからのモバイルWebと最新動向
次世代Web業務アプリケーション
はじめてのモバイルウェブアプリ 1
はじめてのモバイルウェブアプリ 2
HTML5でできるカメラアプリを実際に体験しよう

What's hot (20)

PDF
オープンソースで始めるオフラインアプリケーション開発入門
PDF
Yeomanではじめる爆速webアプリ開発
PDF
Swaggerのさわりだけ
PDF
業務系WebアプリケーションがStrutsから旅立つ日
PDF
業務アプリケーションにおけるモダンWeb開発の現状ーHTML5開発って簡単なの?
PPTX
Async awaitでの繰り返し処理についての小話
PDF
Web屋という仕事のこれから Web動向からWeb屋に必要な技術を考えてみる
PDF
モダンWeb開発ワークショップ
PDF
Ionicでハイブリッドアプリ入門①
ODP
HTML5 アプリ開発
PDF
JS非同期処理のいま
PDF
Angularモダンweb開発セミナー紹介 20170923
PDF
Espruinoの紹介
PDF
Windows ストアアプリから使かえるセンサーAPIとデバイスAPI
PPTX
Fetch apiについて
ODP
今流行りのウェブアプリ開発環境Yeoman
ODP
HTML5 のお話
PDF
BACKBONE.JSによるWebアプリケーション開発について
PDF
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
KEY
Platform.html5
オープンソースで始めるオフラインアプリケーション開発入門
Yeomanではじめる爆速webアプリ開発
Swaggerのさわりだけ
業務系WebアプリケーションがStrutsから旅立つ日
業務アプリケーションにおけるモダンWeb開発の現状ーHTML5開発って簡単なの?
Async awaitでの繰り返し処理についての小話
Web屋という仕事のこれから Web動向からWeb屋に必要な技術を考えてみる
モダンWeb開発ワークショップ
Ionicでハイブリッドアプリ入門①
HTML5 アプリ開発
JS非同期処理のいま
Angularモダンweb開発セミナー紹介 20170923
Espruinoの紹介
Windows ストアアプリから使かえるセンサーAPIとデバイスAPI
Fetch apiについて
今流行りのウェブアプリ開発環境Yeoman
HTML5 のお話
BACKBONE.JSによるWebアプリケーション開発について
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
Platform.html5
Ad

Viewers also liked (19)

PPTX
xUnitハンズオン第3回テキスト
PDF
JSer Class #3
PDF
JSer Class #2
PDF
One night Vue.js
PPTX
xUnitハンズオン第1回テキスト
PPTX
xUnitハンズオン第4回テキスト
PPTX
xUnitハンズオン第2回テキスト
PPTX
TypeScriptハンズオン第2回テキスト
PPTX
TypeScriptハンズオン第1回テキスト
PDF
JP1/AJS2オペレータ勉強会
PDF
JSer Class #1
PDF
Keypoints html5
PDF
Vue.js入門
PDF
3日時間をもらったのでTypeScriptを触ってみた
PDF
Flux react現状確認会
PPTX
TypeScriptをオススメする理由
PPTX
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
PDF
Vue.js with Go
PDF
ブラウザのPerformance APIの話
xUnitハンズオン第3回テキスト
JSer Class #3
JSer Class #2
One night Vue.js
xUnitハンズオン第1回テキスト
xUnitハンズオン第4回テキスト
xUnitハンズオン第2回テキスト
TypeScriptハンズオン第2回テキスト
TypeScriptハンズオン第1回テキスト
JP1/AJS2オペレータ勉強会
JSer Class #1
Keypoints html5
Vue.js入門
3日時間をもらったのでTypeScriptを触ってみた
Flux react現状確認会
TypeScriptをオススメする理由
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
Vue.js with Go
ブラウザのPerformance APIの話
Ad

SIMD.js(ECMAScript 7)