Suche senden
Hochladen
Dalvik仮想マシンのアーキテクチャ 改訂版
•
11 gefällt mir
•
5,376 views
Takuya Matsunaga
Folgen
Melden
Teilen
Melden
Teilen
1 von 20
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
Twitterのsnowflakeについて
Twitterのsnowflakeについて
moai kids
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
Mr. Vengineer
目grep入門 +解説
目grep入門 +解説
murachue
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
NGINX, Inc.
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
Empfohlen
Twitterのsnowflakeについて
Twitterのsnowflakeについて
moai kids
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
Mr. Vengineer
目grep入門 +解説
目grep入門 +解説
murachue
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
NGINX, Inc.
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門
NVIDIA Japan
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
例外設計における大罪
例外設計における大罪
Takuto Wada
FIDO認証によるパスワードレスログイン実装入門
FIDO認証によるパスワードレスログイン実装入門
Yahoo!デベロッパーネットワーク
ゆるバグ
ゆるバグ
MITSUNARI Shigeo
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
Java8でRDBMS作ったよ
Java8でRDBMS作ったよ
なおき きしだ
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
DeNA
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
Masahiro Nishimi
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
Kazuhito Miura
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
Fixstars Corporation
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
Takuya Matsunaga
Weitere ähnliche Inhalte
Was ist angesagt?
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門
NVIDIA Japan
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
例外設計における大罪
例外設計における大罪
Takuto Wada
FIDO認証によるパスワードレスログイン実装入門
FIDO認証によるパスワードレスログイン実装入門
Yahoo!デベロッパーネットワーク
ゆるバグ
ゆるバグ
MITSUNARI Shigeo
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
Java8でRDBMS作ったよ
Java8でRDBMS作ったよ
なおき きしだ
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
DeNA
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
Masahiro Nishimi
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
Kazuhito Miura
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
Fixstars Corporation
Was ist angesagt?
(20)
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
例外設計における大罪
例外設計における大罪
FIDO認証によるパスワードレスログイン実装入門
FIDO認証によるパスワードレスログイン実装入門
ゆるバグ
ゆるバグ
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
Java8でRDBMS作ったよ
Java8でRDBMS作ったよ
Pythonによる黒魔術入門
Pythonによる黒魔術入門
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
PostgreSQLアンチパターン
PostgreSQLアンチパターン
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
Andere mochten auch
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
Takuya Matsunaga
ここが変だよDalvik仮想マシン
ここが変だよDalvik仮想マシン
Takuya Matsunaga
Deep Leaningと超解像
Deep Leaningと超解像
Takuya Matsunaga
Java 7 invokedynamic の概要
Java 7 invokedynamic の概要
Taku Miyakawa
Understanding the Dalvik Virtual Machine
Understanding the Dalvik Virtual Machine
National Cheng Kung University
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
Taku Miyakawa
進化するArt
進化するArt
Takuya Matsunaga
Andere mochten auch
(8)
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
ここが変だよDalvik仮想マシン
ここが変だよDalvik仮想マシン
Deep Leaningと超解像
Deep Leaningと超解像
Java 7 invokedynamic の概要
Java 7 invokedynamic の概要
Understanding the Dalvik Virtual Machine
Understanding the Dalvik Virtual Machine
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
進化するArt
進化するArt
Ähnlich wie Dalvik仮想マシンのアーキテクチャ 改訂版
4章 Linuxカーネル - 割り込み・例外 4
4章 Linuxカーネル - 割り込み・例外 4
mao999
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
Exploring the x64
Exploring the x64
FFRI, Inc.
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点
Kuniyasu Suzaki
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
VxRail ChampionClub
seccamp2012 チューター発表
seccamp2012 チューター発表
Hirotaka Kawata
[cb22] Wslinkのマルチレイヤーな仮想環境について by Vladislav Hrčka
[cb22] Wslinkのマルチレイヤーな仮想環境について by Vladislav Hrčka
CODE BLUE
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
Preferred Networks
Android デバッグ小ネタ
Android デバッグ小ネタ
l_b__
Let's play with Goldfish
Let's play with Goldfish
Tetsuyuki Kobayashi
Interrupts on xv6
Interrupts on xv6
Takuya ASADA
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
産学間連携推進室(AC部屋) 2012 成果報告会
産学間連携推進室(AC部屋) 2012 成果報告会
Hirotaka Kawata
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
Mikiya Okuno
Java 9で進化する診断ツール
Java 9で進化する診断ツール
Yasumasa Suenaga
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
IBM Analytics Japan
Reconf 201901
Reconf 201901
Takefumi MIYOSHI
2014 dart flight school in Tokyo
2014 dart flight school in Tokyo
nothingcosmos
Ähnlich wie Dalvik仮想マシンのアーキテクチャ 改訂版
(20)
4章 Linuxカーネル - 割り込み・例外 4
4章 Linuxカーネル - 割り込み・例外 4
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Exploring the x64
Exploring the x64
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
seccamp2012 チューター発表
seccamp2012 チューター発表
[cb22] Wslinkのマルチレイヤーな仮想環境について by Vladislav Hrčka
[cb22] Wslinkのマルチレイヤーな仮想環境について by Vladislav Hrčka
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
Android デバッグ小ネタ
Android デバッグ小ネタ
Let's play with Goldfish
Let's play with Goldfish
Interrupts on xv6
Interrupts on xv6
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
産学間連携推進室(AC部屋) 2012 成果報告会
産学間連携推進室(AC部屋) 2012 成果報告会
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
Java 9で進化する診断ツール
Java 9で進化する診断ツール
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
Reconf 201901
Reconf 201901
2014 dart flight school in Tokyo
2014 dart flight school in Tokyo
Mehr von Takuya Matsunaga
光コラボは契約してはいけない
光コラボは契約してはいけない
Takuya Matsunaga
ソフトウェア組織マインド
ソフトウェア組織マインド
Takuya Matsunaga
ある製造業のチームトポロジー
ある製造業のチームトポロジー
Takuya Matsunaga
クリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみた
Takuya Matsunaga
組込エンジニアのための深層学習
組込エンジニアのための深層学習
Takuya Matsunaga
Design by contractとホーア論理
Design by contractとホーア論理
Takuya Matsunaga
Mehr von Takuya Matsunaga
(6)
光コラボは契約してはいけない
光コラボは契約してはいけない
ソフトウェア組織マインド
ソフトウェア組織マインド
ある製造業のチームトポロジー
ある製造業のチームトポロジー
クリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみた
組込エンジニアのための深層学習
組込エンジニアのための深層学習
Design by contractとホーア論理
Design by contractとホーア論理
Dalvik仮想マシンのアーキテクチャ 改訂版
1.
Dalvik仮想マシンの アーキテクチャ 僻地からの出稼ぎプログラマ
kmt-t
2.
自己紹介 Web上での活動 ・ハンドルネーム
: kmt-t ・はてなダイアリ ID : kmt-t2 ・Twitter ID : kmt_t 属性 属性 ・鳥取県から大阪に出稼ぎ中です ・組み込みプログラマらしい ・ミドルウェアが得意です →画像処理(2D/3D)、ファイルシステム、仮想マシンが専門です ・使用言語はC++(not C)/C#/Python →C++11とかC#の最新の仕様がキャッチアップできていません…
3.
発表の構成 Dalvik仮想マシン3部作 Dalvik仮想マシンの発表を以下の3回にわけて行います 1. Dalvik仮想マシンのアーキテクチャ ←今回はここの発表 2.
Dalvikバイトコードのリファレンスの読み方 3. DEXファイルフォーマット 発表の目的 1. Dalvik仮想マシンのソースコードが誰でも読めるようにする 2. Dalvik仮想マシンに対するみんなのリテラシを上げる 3. より深い部分の発表をするための下地をつくる
4.
本日の発表の概要 Java仮想マシンとの比較 Java仮想マシンはスタックマシン、 Dalvik仮想マシンはレジスタマシン ・スタックマシンとは何か? ・レジスタマシンとは何か? ・両者の比較とトレードオフをはっきりさせる
インタープリタの設計 Dalvik仮想マシンで採用されているスレッドインタープリタとは何か? 参考文献 Java仮想マシン仕様 (ISBN:489471356X)
5.
Java仮想マシン スタックマシン スタックマシンの基本動作 スタックマシンの基本動作 スタックマシンは演算を行うための「オペランドスタック」を持つ 1. 演算に使う値をオペランドスタックに積む 2. スタックから値をポップしてその値で演算をする 3.
演算結果をスタックに積む Push Pop 演算 メモリ 値3 値3 値2 値2 値1 値1 オペランドスタック オペランドスタック
6.
Dalvik仮想マシン レジスタマシン レジスタマシンの基本動作 レジスタマシンは演算を行うための「レジスタ」と呼ばれる領域を持つ 1. 演算に使う値をメモリからレジスタにコピーする 2. レジスタ上の値を演算し、レジスタに結果を保存する 3.
演算結果をメモリへコピーする レジスタ6 メモリ レジスタ5 レジスタ4 レジスタ3 レジスタ2 演算 レジスタ1 レジスタ
7.
Dalvik仮想マシン レジスタマシンの補足 Dalvik仮想マシンは特殊なレジスタマシン ・レジスタはメソッド呼び出し時にスタック領域に確保される →確保されるレジスタは0~65535個までの可変数 ・メソッド終了時にスタック領域に確保されたレジスタは開放される ・レジスタにはレジスタを識別する番号、「レジスタ番号」が割り振られる ・Dalvik仮想マシンのレジスタとは一般的にいわれるレジスタとは違い、 演算に使うメモリ領域をレジスタと呼んでいる
メソッドB R0 メソッドAから 成 メソッドB R1 メソッドB呼出 長 (VM-specific internal goop) 方 メソッドA R0 向 メソッドA R1 スタック
8.
CPUの機械語や 仮想マシンバイトコードの基礎用語 最小の構成要素 機械語やバイトコードの命令には最低以下の情報が必要 ・命令の種類を示す「オペコード」 ・命令の演算対象となる値を示す「オペランド」 →オペランドにはレジスタ番号や即値が指定される
命令長 機械語やバイトコードの命令のバイナリサイズを「命令長」と呼ぶ →スタックマシンとレジスタマシンとの比較の大きなポイント ちなみに、命令長はCPU、仮想マシンごとに可変長のものと固定長の ものと、どちらも存在する ・固定長 – MIPS/ARMなど ・可変長 – x86/Java仮想マシン/Dalvik仮想マシンなど
9.
仮想マシンバイトコード 命令のイメージ (架空の例)
たとえば レジスタAとレジスタBを加算してレジスタCに格納する命令の例 オペコード オペランド オペランド オペランド ADD レジスタ番号C レジスタ番号A レジスタ番号B (8bit) (8bit) (8bit) (8bit) 命令長=32bit
10.
Java仮想マシン スタックマシンの特徴
特徴 ・可変長命令フォーマット ・オペランドは8bit ・演算対象はオペランドスタックのトップと決まっている命令が多い →この場合オペランドが省略可能 ・オペランドスタックを操作するための命令が必要なケースがある →そのため命令数がレジスタマシンにくらべて多くなるケースがある まとめると ・バイトコードのサイズは小さい (オペランドが省略できるため) ・同じ処理をした場合の命令数はレジスタマシンにくらべて多い
11.
Dalvik仮想マシン レジスタマシンの特徴
特徴 ・可変長命令フォーマット ・オペランドは8bit ・レジスタがオペランドとなる場合、オペランドサイズは最大16bitになる →レジスタが最大65535個あるため ・命令は16bitでアライメントされている ・オペランドスタックを操作するための命令が不要である まとめると ・バイトコードのサイズは大きい (オペランドが大きいため) ・同じ処理をした場合の命令数はスタックマシンにくらべて少ない
12.
Dalvikバイトコードの命令長が 長い問題に対する対策 長い命令長 レジスタをオペランドとした場合、オペランドが巨大化
その対策 すべての命令の種類ですべてのレジスタを参照することをあきらめる →参照するレジスタ番号を制限することによりオペランドを小さくする 命令により以下のレンジで参照できるレジスタ番号を制限 ・レジスタ番号0~15 (オペランド4bit) ・レジスタ番号0~255 (オペランド8bit) ・レジスタ番号0~65535 (オペランド16bit)
13.
なぜDalvik仮想マシンは レジスタマシンなのか? スタックマシンの欠点 ・オペランドスタックを操作するための命令が必要なケースがある →そのため命令数がレジスタマシンにくらべて多くなるケースがある
パフォーマンスの問題 ・命令数が多いことによる「インタープリタでの」パフォーマンス低下 →インタープリタの設計と実装を理解すると理由がわかる ・JITコンパイラでは起こりにくい問題 →初期のDalvik仮想マシンはインタープリタのみであったのと関連? →インタープリタのパフォーマンスを優先した可能性がある
14.
一般的なインタープリタの実装 擬似コードによる例 素朴に書くと擬似コードのようになる。実はオーバーヘッドが大きい。 →どの辺りがオーバーヘッドが大きいのか? # INSTR
= 現在実行中のバイトコード命令 # TBL = オペコードに対応した処理の関数テーブル LOOP : FUNC = TBL[INSTR->OPCODE] CALL FUNC(INSTR) # 関数呼び出し NEXT INSTR # 次の命令に移動する GOTO LOOP # 繰り返し
15.
一般的なインタープリタの 問題点 重い処理が多い ・ジャンプが多い
(ジャンプは最悪10CPUサイクル以上かかる処理) 1. 命令ごとにループを回す箇所のジャンプ 2.命令実行ルーチンに飛ぶためのジャンプ →このジャンプはCPUによる最適化処理(分岐予測)が効かない 3. 命令実行ルーチンから戻るためのジャンプ ・テーブル参照がある 巨大なオーバーヘッド バイトコード命令が単なる加算である場合は、それそのものの処理は 数CPUサイクルで完了するが、バイトコード命令ごとに発生する インタープリタのオーバーヘッドは数十サイクル以上ある
16.
Dalvik仮想マシンの インタープリタの実装
擬似コードによる例 ・スレッドインタープリタと呼ばれる方式 # 最初の命令処理ルーチンのアドレスをBASE_ADDRとする # 各命令処理ルーチンの間隔は64バイトでアライメント .ALIGN 64 OP_A : … # ここで命令実行 NEXT INSTR # 次の命令に移動する GOTO BASE_ADDR + 64 * INSTR->OPCODE .ALIGN 64 OP_B : … # ここで命令実行 NEXT INSTR # 次の命令に移動する GOTO BASE_ADDR + 64 * INSTR->OPCODE … # 以下繰り返し
17.
Dalvik仮想マシン インタープリタの改善点 重い処理が少ない ・ジャンプが命令実行ルーチンに飛ぶためのジャンプのみ →ただしこのジャンプはCPUによる最適化処理(分岐予測)が効かない ・テーブル参照がない →次の命令のジャンプ先を演算で算出できる オーバーヘッドが低減 素朴なインタープリタとくらべるとオーバヘッドが数分の一
18.
ちなみにJITコンパイラを使うと 重い処理がない ・命令実行のためにジャンプする必要がない ・テーブル参照はない
更に ・命令の「フェッチ(読み込み処理)」が不要 ・命令の「デコード(命令の意味解釈処理)」が不要 まとめると ・速いのは当たり前 ・実行するバイトコードの命令数の多い少ないはあまり関係ない
19.
まとめ
要約 ・実行するバイトコード命令ごとに発生するオーバーヘッドは大きい ・Dalvik仮想マシンではインタープリタを改良、改善している ・しかし依然として実行するバイトコード命令の数は少ないほうが良い まとめ ・バイナリサイズはJava仮想マシンの方がだいぶん小さい ・実行速度はDalvik仮想マシンの方が高速にできる「かもしれない」 →インタープリタのパフォーマンスでは有利 →JITコンパイラを採用するとどちらが有利か微妙
20.
おわり
ご清聴ありがとうございました
Jetzt herunterladen