SlideShare a Scribd company logo
1 of 24
Download to read offline
Kanazawa Institute of Technology
情報科学における
18のメタテクニック
2015年4月30日
金沢工業大学 情報工学科 中野 淳
http://www.nakanolab.net/
K.I.T.情報科学における18のメタテクニック
1. キャッシング
2. ブロッキング
vs. ノンブロッキング
3. プロファイリング
4. パイプライニング
5. 投機的実行(予測)
6. 条件の緩和
7. すぐやる vs. 先延ばし
8. フィルタリング
9. 再利用
10. 並列化
11. 結合 vs. 分離
12. 多階層、クラスター化
13. 先読み、先取り
14. 動的(適応)
15. 複製
16. 仮想化
17. チェックポイント、
スナップショット
18. トランザクション
長いこと情報科学に関わってきて、似たような技法が分野をまたがって繰り返し現
れているのを見てきました。ここではそれらの技法を「メタテクニック」と称して
紹介します。全部で18個ありますが順番に意味はありません。また、取り上げた
例は若干コンピューターアーキテクチャーに偏っていることをお断りしておきます。
2情報科学における18のメタテクニック
K.I.T.
#1 Caching
#2 Blocking vs. Non-blocking
#3 Profiling
#4 Pipelining
#5 Speculation
#6 Relaxation
#7 Eager vs. Lazy
#8 Filtering
#9 Reuse
#10 Parallelization
#11 Coupling vs. Decoupling
#12 Hierarchy, Clustering
#13 Lookahead, Prefetch
#14 Dynamic Adaptation
#15 Replication
#16 Virtualization
#17 Checkpoints, Snapshots
#18 Transaction
3情報科学における18のメタテクニック
K.I.T.#1 キャッシング(Caching)
 着想
 空間的ローカリティーの利用
 時間的ローカリティーの利用
 80:20 の法則
 例
 データキャッシュ
 命令キャッシュ: 静的、動的(Pentium 4 のトレースキャッシュ)
 ファイルシステムや DBMS のバッファーキャッシュ
 Web ブラウザーのキャッシュ
 プロキシーサーバー
 メモ化(Memoization)
 LZW 圧縮アルゴリズム(高頻度のデータ並びを辞書に登録)
4情報科学における18のメタテクニック
K.I.T.#2 ブロッキング vs. ノンブロッキング
 着想
 何かを待っている時間を有効活用する
 例
 マルチタスク(OS のスケジューラー)
 マルチスレッド
 非同期 I/O
 MPI(Message Passing Interface)における非同期通信(通信と
計算のオーバーラップ)
 プロセッサーにおける命令の out-of-order 実行
 キャッシュミス時であっても、別のキャッシュラインの読み込みを
許可する(MSHR: Miss Status Holding Register)
5情報科学における18のメタテクニック
K.I.T.#3 プロファイリング
 着想
 実行時の情報を有効活用して、実行の最適化
 例
 プログラムの高速化にあたっては、一番時間をくっている部分
(ホットスポット)からとりかかる(gprof などを利用)
 コンパイラの研究に多くの例がみられる(コードのレイアウトの
最適化を行う Spike など)
6情報科学における18のメタテクニック
K.I.T.#4 パイプライニング
 着想
 より高いスループット
 例
 プロセッサーのパイプライン(フェッチ、デコード、実行、メモリ
アクセス、レジスタへのライトバック)
A
B
C
D
A
B
C
D
タスク
時間 時間
洗濯
乾燥
折畳み
逐次的洗濯 パイプライン化された洗濯
出典: http://www.cs.berkeley.edu/~pattrsn/252S01/
7情報科学における18のメタテクニック
K.I.T.#5 投機的実行(予測)
 着想
 自分はラッキーだと信じて
山を張ってみる
 例
 分岐予測
 データのプリフェッチ
 関数の返り値の予測
 メインスレッドのキャッシュミスによる遅延を隠蔽するための
投機的ヘルパースレッド
8情報科学における18のメタテクニック
K.I.T.#6 条件の緩和(Relaxation)
 着想
 制約条件を除いてみたらどうなるかを考える
 例
 マルチプロセッサーシステムの relaxed memory consistency
» Sequential consistency はプログラマーにとっては都合がよいが、
アーキテクチャー上の最適化を阻む
» そこでプログラマーの利便性を多少犠牲にして性能向上をはかった
(Write Buffer など)
 分散ハッシュテーブルの eventual consistency
9情報科学における18のメタテクニック
K.I.T.
#1 Caching
#2 Blocking vs. Non-blocking
#3 Profiling
#4 Pipelining
#5 Speculation
#6 Relaxation
#7 Eager vs. Lazy
#8 Filtering
#9 Reuse
#10 Parallelization
#11 Coupling vs. Decoupling
#12 Hierarchy, Clustering
#13 Lookahead, Prefetch
#14 Dynamic Adaptation
#15 Replication
#16 Virtualization
#17 Checkpoints, Snapshots
#18 Transaction
10情報科学における18のメタテクニック
K.I.T.#7 すぐやる vs. 先延ばし(Eager vs. Lazy)
 着想
 すぐやる
» 後で必ず必要になるとわかっているときや、
» 今すぐやっても安全でコストも安いとき
 先延ばしする
» 上記が当てはまらないときは、本当に必要になるまでやらない
 例
 要求ページング(先延ばし)
 Copy on write(先延ばし)
 フィボナッチヒープ等、償却計算量の低減を目指したデータ構造
(先延ばし)
 Java の Just-in-time コンパイラ(両方ありうる)
 MPI (Message Passing Interface) のプロトコル (udp的 vs. tcp的)
» Eager: 受け手の準備状況によらずデータを送りつける(小さい msg)
» Rendezvous: ちゃんとネゴシエーションしてからデータを送る(大きい
msg)
11情報科学における18のメタテクニック
K.I.T.#8 フィルタリング
 着想
 より深く潜っていく必要があるかないかを素早く判断
 例
 キャッシュ階層
» L1 キャッシュ → L2 キャッシュ → メインメモリー
 Bloom filter
12情報科学における18のメタテクニック
K.I.T.#9 再利用(Reuse)
 着想
 同じことの繰り返しを避ける
» もし f(x) の計算コストが高くて、しかも頻繁に必要になるならば、一度
だけ計算して結果を覚えておく(時間とスペースのトレードオフ)
 例
 メモ化(Memoization)
 Dynamic Instruction Reuse (Sodani and Sohi, ISCA 1997)
13情報科学における18のメタテクニック
K.I.T.#10 並列化
 着想
 2倍の計算資源を使って、時間を半分に短縮
» 現実には Amdahl の法則に留意
 例
 SMP
 マルチコア
 クラスター
 MapReduce
14情報科学における18のメタテクニック
#11 結合 vs. 分離(Coupling vs. Decoupling)
 着想
 分離することによって相互依存性を下げ、
個々の部品の自由度をアップ
 例
 キャッシュ
» L1 キャッシュ: データキャッシュと命令キャッシュに分離
» L2 キャッシュ: 通常データと命令の両方を格納
 ソフトウェア工学ではしばしば分離が好まれる
» インターフェースと実装の分離(オブジェクト指向)
» ポリシーとメカニズムの分離(コンピューターネットワーク)
» SDN (Software Defined Networking) における control plane と
data plane
» TCP/IP の階層構造(物理層、データリンク層、ネットワーク層、
トランスポート層、アプリケーション層)
» データベースにおけるリレーションの正規化
15情報科学における18のメタテクニック
K.I.T.#12 多階層、クラスター化
 着想
 いろいろなものをきちんと整理
 例
 キャッシュ階層
 ファイルシステム
 TCP/IP
16情報科学における18のメタテクニック
K.I.T.
#1 Caching
#2 Blocking vs. Non-blocking
#3 Profiling
#4 Pipelining
#5 Speculation
#6 Relaxation
#7 Eager vs. Lazy
#8 Filtering
#9 Reuse
#10 Parallelization
#11 Coupling vs. Decoupling
#12 Hierarchy, Clustering
#13 Lookahead, Prefetch
#14 Dynamic Adaptation
#15 Replication
#16 Virtualization
#17 Checkpoints, Snapshots
#18 Transaction
17情報科学における18のメタテクニック
#13 先読み、先取り(Lookahead, Prefetching)
 着想
 必要なものが必要な時に手元にあるようにする
 例
 メモリーからのデータのプリフェッチ
 キャッシュライン
18情報科学における18のメタテクニック
K.I.T.#14 動的(適応)
 着想
 実行中にも実行時情報を利用(⇔ プロファイリング)
 例
 Java の Just-in-time コンパイラ
 LLVM の動的最適化
 Web サーバー群のロードバランサー(Load Balancer)
19情報科学における18のメタテクニック
K.I.T.#15 複製(Replication)
 着想
 より良いローカリティと信頼性
 例
 ディスクのミラー化
 分散データベースにおけるレプリケーション
 分散ハッシュテーブルにおけるレプリカ
 CDN (Content Delivery Network): Akamai 社など
 GFS (Google File System)
20情報科学における18のメタテクニック
K.I.T.#16 仮想化(Virtualization)
 着想
 物理的制限を超える
 リダイレクト
 例
 仮想メモリー
 仮想デバイス
 仮想マシン
 仮想ファイルシステム
 データベースのビュー (View)
 Windows のショートカットや UNIX のシンボリックリンク
仮想的幻想
物理的実体
21情報科学における18のメタテクニック
K.I.T.#17 チェックポイント、スナップショット
 着想
 障害や人的ミスに対する備え
» ただし Output commit problem に留意
 例
 データベース
 Copy on write
22情報科学における18のメタテクニック
K.I.T.#18 トランザクション(Transaction)
 着想
 複数の操作を不可分のものとして扱う
 例
 データベース
 トランザクショナルメモリー
» 性能と正確さのトレードオフ
• ロックを駆使して正確で速いプログラムを書くことは可能では
あるが、熟練を要する
• トランザクショナルメモリーを使えば、多少のオーバーヘッドは
あるものの、安全なプログラムが書きやすくなる
23情報科学における18のメタテクニック
K.I.T.まとめ
1. キャッシング
2. ブロッキング
vs. ノンブロッキング
3. プロファイリング
4. パイプライニング
5. 投機的実行(予測)
6. 条件の緩和
7. すぐやる vs. 先延ばし
8. フィルタリング
9. 再利用
10. 並列化
11. 結合 vs. 分離
12. 多階層、クラスター化
13. 先読み、先取り
14. 動的(適応)
15. 複製
16. 仮想化
17. チェックポイント、
スナップショット
18. トランザクション
18のメタテクニックを列挙してきましたが、実際に自分の問題に適用する上では、
 エンジニアリングでは何事にもトレードオフがつきものであることと、
 "Devil is in the details."
であることを忘れずに! ここに書いたことは特効薬ではなく、あくまでも
"Food for Thought" くらいに思ってください。
24情報科学における18のメタテクニック

More Related Content

What's hot

What's hot (20)

実務と論文で学ぶジョブレコメンデーション最前線2022
実務と論文で学ぶジョブレコメンデーション最前線2022実務と論文で学ぶジョブレコメンデーション最前線2022
実務と論文で学ぶジョブレコメンデーション最前線2022
 
ゼロから始める転移学習
ゼロから始める転移学習ゼロから始める転移学習
ゼロから始める転移学習
 
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
 
研究発表を準備する(2022年版)
研究発表を準備する(2022年版)研究発表を準備する(2022年版)
研究発表を準備する(2022年版)
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論
 
UXデザイン概論 2019
UXデザイン概論 2019UXデザイン概論 2019
UXデザイン概論 2019
 
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
4つの戦犯から考えるサービスづくりの失敗
4つの戦犯から考えるサービスづくりの失敗4つの戦犯から考えるサービスづくりの失敗
4つの戦犯から考えるサービスづくりの失敗
 
ウォーターフォールとアジャイルを考える #ita_ws
ウォーターフォールとアジャイルを考える #ita_wsウォーターフォールとアジャイルを考える #ita_ws
ウォーターフォールとアジャイルを考える #ita_ws
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン
 
ラボラトリーオートメーションのためのソフトウェア思想教育(非プログラマ―が知っておくべきプログラミングの本質)
ラボラトリーオートメーションのためのソフトウェア思想教育(非プログラマ―が知っておくべきプログラミングの本質)ラボラトリーオートメーションのためのソフトウェア思想教育(非プログラマ―が知っておくべきプログラミングの本質)
ラボラトリーオートメーションのためのソフトウェア思想教育(非プログラマ―が知っておくべきプログラミングの本質)
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 

Viewers also liked

MongoDB全機能解説1
MongoDB全機能解説1MongoDB全機能解説1
MongoDB全機能解説1
Takahiro Inoue
 

Viewers also liked (20)

Cognitoハンズオン
CognitoハンズオンCognitoハンズオン
Cognitoハンズオン
 
Cache勉強会
Cache勉強会Cache勉強会
Cache勉強会
 
あるキャッシュメモリの話
あるキャッシュメモリの話あるキャッシュメモリの話
あるキャッシュメモリの話
 
[20171031 db tech salon] クラウド移行をベトナムで!? by 株式会社インサイトテクノロジー 森 茂紀
[20171031 db tech salon] クラウド移行をベトナムで!? by 株式会社インサイトテクノロジー 森 茂紀[20171031 db tech salon] クラウド移行をベトナムで!? by 株式会社インサイトテクノロジー 森 茂紀
[20171031 db tech salon] クラウド移行をベトナムで!? by 株式会社インサイトテクノロジー 森 茂紀
 
20170518_今さら聞けないHANAのハナシの基本のき by SAPジャパン株式会社 新久保浩二
20170518_今さら聞けないHANAのハナシの基本のき by SAPジャパン株式会社 新久保浩二20170518_今さら聞けないHANAのハナシの基本のき by SAPジャパン株式会社 新久保浩二
20170518_今さら聞けないHANAのハナシの基本のき by SAPジャパン株式会社 新久保浩二
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
MongoDB全機能解説1
MongoDB全機能解説1MongoDB全機能解説1
MongoDB全機能解説1
 
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察
 
MySQLやSSDとかの話 前編
MySQLやSSDとかの話 前編MySQLやSSDとかの話 前編
MySQLやSSDとかの話 前編
 
性能測定道 実践編
性能測定道 実践編性能測定道 実践編
性能測定道 実践編
 
MySQLやSSDとかの話 後編
MySQLやSSDとかの話 後編MySQLやSSDとかの話 後編
MySQLやSSDとかの話 後編
 
Cephを用いたwordpressの構築[LT版]
Cephを用いたwordpressの構築[LT版] Cephを用いたwordpressの構築[LT版]
Cephを用いたwordpressの構築[LT版]
 
Advanced technic for OS upgrading in 3 minutes
Advanced technic for OS upgrading in 3 minutesAdvanced technic for OS upgrading in 3 minutes
Advanced technic for OS upgrading in 3 minutes
 
Prometheus触ってみた
Prometheus触ってみたPrometheus触ってみた
Prometheus触ってみた
 
性能測定道 事始め編
性能測定道 事始め編性能測定道 事始め編
性能測定道 事始め編
 
Web現場Meetup #2 圧倒的成長環境の作り方
Web現場Meetup #2 圧倒的成長環境の作り方Web現場Meetup #2 圧倒的成長環境の作り方
Web現場Meetup #2 圧倒的成長環境の作り方
 
スクラムを導入してみて一回挫折したけど再起させた話
スクラムを導入してみて一回挫折したけど再起させた話スクラムを導入してみて一回挫折したけど再起させた話
スクラムを導入してみて一回挫折したけど再起させた話
 
サービスのスケール化のための検索システム改善
サービスのスケール化のための検索システム改善サービスのスケール化のための検索システム改善
サービスのスケール化のための検索システム改善
 
ウェブエンジニアのための色の話
ウェブエンジニアのための色の話ウェブエンジニアのための色の話
ウェブエンジニアのための色の話
 
プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話
 

情報科学における18のメタテクニック

  • 1. Kanazawa Institute of Technology 情報科学における 18のメタテクニック 2015年4月30日 金沢工業大学 情報工学科 中野 淳 http://www.nakanolab.net/
  • 2. K.I.T.情報科学における18のメタテクニック 1. キャッシング 2. ブロッキング vs. ノンブロッキング 3. プロファイリング 4. パイプライニング 5. 投機的実行(予測) 6. 条件の緩和 7. すぐやる vs. 先延ばし 8. フィルタリング 9. 再利用 10. 並列化 11. 結合 vs. 分離 12. 多階層、クラスター化 13. 先読み、先取り 14. 動的(適応) 15. 複製 16. 仮想化 17. チェックポイント、 スナップショット 18. トランザクション 長いこと情報科学に関わってきて、似たような技法が分野をまたがって繰り返し現 れているのを見てきました。ここではそれらの技法を「メタテクニック」と称して 紹介します。全部で18個ありますが順番に意味はありません。また、取り上げた 例は若干コンピューターアーキテクチャーに偏っていることをお断りしておきます。 2情報科学における18のメタテクニック
  • 3. K.I.T. #1 Caching #2 Blocking vs. Non-blocking #3 Profiling #4 Pipelining #5 Speculation #6 Relaxation #7 Eager vs. Lazy #8 Filtering #9 Reuse #10 Parallelization #11 Coupling vs. Decoupling #12 Hierarchy, Clustering #13 Lookahead, Prefetch #14 Dynamic Adaptation #15 Replication #16 Virtualization #17 Checkpoints, Snapshots #18 Transaction 3情報科学における18のメタテクニック
  • 4. K.I.T.#1 キャッシング(Caching)  着想  空間的ローカリティーの利用  時間的ローカリティーの利用  80:20 の法則  例  データキャッシュ  命令キャッシュ: 静的、動的(Pentium 4 のトレースキャッシュ)  ファイルシステムや DBMS のバッファーキャッシュ  Web ブラウザーのキャッシュ  プロキシーサーバー  メモ化(Memoization)  LZW 圧縮アルゴリズム(高頻度のデータ並びを辞書に登録) 4情報科学における18のメタテクニック
  • 5. K.I.T.#2 ブロッキング vs. ノンブロッキング  着想  何かを待っている時間を有効活用する  例  マルチタスク(OS のスケジューラー)  マルチスレッド  非同期 I/O  MPI(Message Passing Interface)における非同期通信(通信と 計算のオーバーラップ)  プロセッサーにおける命令の out-of-order 実行  キャッシュミス時であっても、別のキャッシュラインの読み込みを 許可する(MSHR: Miss Status Holding Register) 5情報科学における18のメタテクニック
  • 6. K.I.T.#3 プロファイリング  着想  実行時の情報を有効活用して、実行の最適化  例  プログラムの高速化にあたっては、一番時間をくっている部分 (ホットスポット)からとりかかる(gprof などを利用)  コンパイラの研究に多くの例がみられる(コードのレイアウトの 最適化を行う Spike など) 6情報科学における18のメタテクニック
  • 7. K.I.T.#4 パイプライニング  着想  より高いスループット  例  プロセッサーのパイプライン(フェッチ、デコード、実行、メモリ アクセス、レジスタへのライトバック) A B C D A B C D タスク 時間 時間 洗濯 乾燥 折畳み 逐次的洗濯 パイプライン化された洗濯 出典: http://www.cs.berkeley.edu/~pattrsn/252S01/ 7情報科学における18のメタテクニック
  • 8. K.I.T.#5 投機的実行(予測)  着想  自分はラッキーだと信じて 山を張ってみる  例  分岐予測  データのプリフェッチ  関数の返り値の予測  メインスレッドのキャッシュミスによる遅延を隠蔽するための 投機的ヘルパースレッド 8情報科学における18のメタテクニック
  • 9. K.I.T.#6 条件の緩和(Relaxation)  着想  制約条件を除いてみたらどうなるかを考える  例  マルチプロセッサーシステムの relaxed memory consistency » Sequential consistency はプログラマーにとっては都合がよいが、 アーキテクチャー上の最適化を阻む » そこでプログラマーの利便性を多少犠牲にして性能向上をはかった (Write Buffer など)  分散ハッシュテーブルの eventual consistency 9情報科学における18のメタテクニック
  • 10. K.I.T. #1 Caching #2 Blocking vs. Non-blocking #3 Profiling #4 Pipelining #5 Speculation #6 Relaxation #7 Eager vs. Lazy #8 Filtering #9 Reuse #10 Parallelization #11 Coupling vs. Decoupling #12 Hierarchy, Clustering #13 Lookahead, Prefetch #14 Dynamic Adaptation #15 Replication #16 Virtualization #17 Checkpoints, Snapshots #18 Transaction 10情報科学における18のメタテクニック
  • 11. K.I.T.#7 すぐやる vs. 先延ばし(Eager vs. Lazy)  着想  すぐやる » 後で必ず必要になるとわかっているときや、 » 今すぐやっても安全でコストも安いとき  先延ばしする » 上記が当てはまらないときは、本当に必要になるまでやらない  例  要求ページング(先延ばし)  Copy on write(先延ばし)  フィボナッチヒープ等、償却計算量の低減を目指したデータ構造 (先延ばし)  Java の Just-in-time コンパイラ(両方ありうる)  MPI (Message Passing Interface) のプロトコル (udp的 vs. tcp的) » Eager: 受け手の準備状況によらずデータを送りつける(小さい msg) » Rendezvous: ちゃんとネゴシエーションしてからデータを送る(大きい msg) 11情報科学における18のメタテクニック
  • 12. K.I.T.#8 フィルタリング  着想  より深く潜っていく必要があるかないかを素早く判断  例  キャッシュ階層 » L1 キャッシュ → L2 キャッシュ → メインメモリー  Bloom filter 12情報科学における18のメタテクニック
  • 13. K.I.T.#9 再利用(Reuse)  着想  同じことの繰り返しを避ける » もし f(x) の計算コストが高くて、しかも頻繁に必要になるならば、一度 だけ計算して結果を覚えておく(時間とスペースのトレードオフ)  例  メモ化(Memoization)  Dynamic Instruction Reuse (Sodani and Sohi, ISCA 1997) 13情報科学における18のメタテクニック
  • 14. K.I.T.#10 並列化  着想  2倍の計算資源を使って、時間を半分に短縮 » 現実には Amdahl の法則に留意  例  SMP  マルチコア  クラスター  MapReduce 14情報科学における18のメタテクニック
  • 15. #11 結合 vs. 分離(Coupling vs. Decoupling)  着想  分離することによって相互依存性を下げ、 個々の部品の自由度をアップ  例  キャッシュ » L1 キャッシュ: データキャッシュと命令キャッシュに分離 » L2 キャッシュ: 通常データと命令の両方を格納  ソフトウェア工学ではしばしば分離が好まれる » インターフェースと実装の分離(オブジェクト指向) » ポリシーとメカニズムの分離(コンピューターネットワーク) » SDN (Software Defined Networking) における control plane と data plane » TCP/IP の階層構造(物理層、データリンク層、ネットワーク層、 トランスポート層、アプリケーション層) » データベースにおけるリレーションの正規化 15情報科学における18のメタテクニック
  • 16. K.I.T.#12 多階層、クラスター化  着想  いろいろなものをきちんと整理  例  キャッシュ階層  ファイルシステム  TCP/IP 16情報科学における18のメタテクニック
  • 17. K.I.T. #1 Caching #2 Blocking vs. Non-blocking #3 Profiling #4 Pipelining #5 Speculation #6 Relaxation #7 Eager vs. Lazy #8 Filtering #9 Reuse #10 Parallelization #11 Coupling vs. Decoupling #12 Hierarchy, Clustering #13 Lookahead, Prefetch #14 Dynamic Adaptation #15 Replication #16 Virtualization #17 Checkpoints, Snapshots #18 Transaction 17情報科学における18のメタテクニック
  • 18. #13 先読み、先取り(Lookahead, Prefetching)  着想  必要なものが必要な時に手元にあるようにする  例  メモリーからのデータのプリフェッチ  キャッシュライン 18情報科学における18のメタテクニック
  • 19. K.I.T.#14 動的(適応)  着想  実行中にも実行時情報を利用(⇔ プロファイリング)  例  Java の Just-in-time コンパイラ  LLVM の動的最適化  Web サーバー群のロードバランサー(Load Balancer) 19情報科学における18のメタテクニック
  • 20. K.I.T.#15 複製(Replication)  着想  より良いローカリティと信頼性  例  ディスクのミラー化  分散データベースにおけるレプリケーション  分散ハッシュテーブルにおけるレプリカ  CDN (Content Delivery Network): Akamai 社など  GFS (Google File System) 20情報科学における18のメタテクニック
  • 21. K.I.T.#16 仮想化(Virtualization)  着想  物理的制限を超える  リダイレクト  例  仮想メモリー  仮想デバイス  仮想マシン  仮想ファイルシステム  データベースのビュー (View)  Windows のショートカットや UNIX のシンボリックリンク 仮想的幻想 物理的実体 21情報科学における18のメタテクニック
  • 22. K.I.T.#17 チェックポイント、スナップショット  着想  障害や人的ミスに対する備え » ただし Output commit problem に留意  例  データベース  Copy on write 22情報科学における18のメタテクニック
  • 23. K.I.T.#18 トランザクション(Transaction)  着想  複数の操作を不可分のものとして扱う  例  データベース  トランザクショナルメモリー » 性能と正確さのトレードオフ • ロックを駆使して正確で速いプログラムを書くことは可能では あるが、熟練を要する • トランザクショナルメモリーを使えば、多少のオーバーヘッドは あるものの、安全なプログラムが書きやすくなる 23情報科学における18のメタテクニック
  • 24. K.I.T.まとめ 1. キャッシング 2. ブロッキング vs. ノンブロッキング 3. プロファイリング 4. パイプライニング 5. 投機的実行(予測) 6. 条件の緩和 7. すぐやる vs. 先延ばし 8. フィルタリング 9. 再利用 10. 並列化 11. 結合 vs. 分離 12. 多階層、クラスター化 13. 先読み、先取り 14. 動的(適応) 15. 複製 16. 仮想化 17. チェックポイント、 スナップショット 18. トランザクション 18のメタテクニックを列挙してきましたが、実際に自分の問題に適用する上では、  エンジニアリングでは何事にもトレードオフがつきものであることと、  "Devil is in the details." であることを忘れずに! ここに書いたことは特効薬ではなく、あくまでも "Food for Thought" くらいに思ってください。 24情報科学における18のメタテクニック