SlideShare una empresa de Scribd logo
1 de 16
Descargar para leer sin conexión
Precise Garbage Collection for C
            の紹介


        CSNagoya 三浦英樹
Precise Garbage Collection for C
著者
 Jon Rafkind, Adam Wick, John Regehr, Matthew Flatt
入手先
http://www.cs.utah.edu/~regehr/papers/ismm15-rafkind.pdf
CのプログラムでもGC使いたい
• 普通、保守的 GCでしょう
• たとえば、Boehm GCとか
• でも、長い時間使ってるとメモリー使用量
  がすごく増大する場合があるみたいだよ
• 証拠は?
• それは、次のスライドの心だー
PLT Schemeにあった怖い話
• PLT Schemeを使用したプログラム環境
  DrSchemeは毎日再起動をしなければならなかっ
  た。でも、正確なGCに変えたら再起動が必要なく
  なった
• バイトコードとドキュメントを生成すると、正確な
  GCだと200MBで済むところが、保守的GCだと
  700MBも必要だった
• PLT Schemeで作ったmail clientを1日おきに再起
  動していたが、正確なGCに変えたら再起動しなく
  て済むようになった
正確なGCを実現するためには
• 次の2つが重要
 – 生きているポインタとそうでないものを分ける

 – アロケーションしたものとその中身がなんなのかをしっ
   かり関連付ける


• 簡単に言うけど難しいよーだってCだもん
 – コンパイラ相当のものを作って、もってる型情報とか
   駆使して頑張る
サポートしています
• 配列なんかの途中を指しているポインタ
 – 効率が悪くなるから出来る限り使わない方が
   いいみたい

• 共用体
 – いまどのメンバーを使っているか記録する
 – 代入したメンバーと違うメンバーを使う行儀の
   悪いことはサポートしない。
サポートしていません
• いったん、範囲外にポインタを動かしてもう一度
  範囲内に戻す
 p = malloc(1024)
  p -= 1024
  p[1025] /* access 1024 to 2047 */
• ポインタでxorをとってみたり
 – xor linked listとか。頭いい人っているねー
• 一旦整数にcastしてまたポインタにcast
 – CRubyはgive up
• ライブラリの中でアロケーションしちゃったりとか
ローカル変数
ポインタの情報を配列に入れる                    // TRANSFORMED
                                  int cheeseburger(int* x) {
                                  void* gc_stack_frame[3];
→ プログラム変換を行う                      /* chain to previous frame: */
                                  void* last_stack_frame = GC_last_stack_frame();
                                  gc_stack_frame[0] = last_stack_frame;
                                  /* number of elements + shape category: */
                                  gc_stack_frame[1] = (1 << 2) + GC_POINTER_TYPE;
                                  /* variable address: */
 // ORIGINAL
                                  gc_stack_frame[2] = &x;
 int cheeseburger(int* x) {       /* install frame: */
                                  GC_set_stack_frame(gc_stack_frame);
 add_cheese(x);
                                  add_cheese(x);
 return x[17];                    /* restore old GC frame */
                                  GC_set_stack_frame(last_stack_frame);
 }
                                  return x[17];
                                  }
変換後プログラム拡大
// TRANSFORMED                            /* variable address: */
int cheeseburger(int* x) {                gc_stack_frame[2] = &x;

void* gc_stack_frame[3];                  /* install frame: */
                                          GC_set_stack_frame(gc_stack_frame);
/* chain to previous frame: */
                                          add_cheese(x);
void* last_stack_frame =
   GC_last_stack_frame();                 /* restore old GC frame */

gc_stack_frame[0] = last_stack_frame;     GC_set_stack_frame(last_stack_frame);
                                          return x[17];
/* number of elements + shape category:
    */                                    }

gc_stack_frame[1] = (1 << 2) +
   GC_POINTER_TYPE;
結局
• GCのシステムにどのローカル変数が生き
  ているポインタを持っているかを教える
 – コンパイラが変数の型を把握していることを利
   用
 malloc部分の変換
• mallocってこんな感じで使うよね
        malloc(sizeof(foo) * 5)
• これをみると、アロケーションするタイプ
  (foo)と数(5)が分かるわけだ。
• 正確なGCだと何の型のデータをアロケーションしたかの
  情報も必要なのでこんな感じで変換
       GC_malloc(sizeof(foo) * 5, gc_foo_tag)

• で、foo_tagってなんなの?
  – それは次のスライドの心だー
gc_foo_tagって?
• gc_tag_struct型の構造体
• アローケートしたオブジェクトと型を結びつける
• 内容はmarkとrepair(コンパクション) 処理を行う
  関数へのポインタ
 struct foo { int *x; int *y;} とするとmarkを行う関数
  void gc_mark_struct_foo (void * x_) {
      struct foo *tmp = (struct foo *) x_;
      GC_mark(tmp->x);
      GC_mark(tmp->y);
  }
 こんな関数をコンパイル時に自動生成する。
 ユーザがmark/repair関数をカスタマイズすることも可能
いろいろやってみた
       (PTL Scheme)
• PLT SchemeのGCをConservative GCから
  Precise GCにしてみた
• 最初に説明した通り、メモリ使用量が激減
• 実行速度は
  – メモリアロケーションが多いベンチマークは20%
    くらい速くなる
  – メモリアロケーションが少ないベンチマークは1
    0~20 %遅くなる 
いろいろやってみた
    (Linuxカーネル!)
• カーネルなんて絶対メモリーリークしちゃい
  かんし、GCが欲しいよね
• なんかいろいろ面倒だったみたい。続きは
  論文で
• tmpfsからddコマンドでファイルアクセス
 – GC付きのものが4割ほど遅い
•  HDDからddコマンドでファイルアクセス
 – あまり変わらない
まとめ
• この技術すげー。今後、いろんなところで
  使われるようになるはず。

• GC本第2版は保守的GCの章を書き換えな
  いといかんかもしれませんねー

• 8ccでサポート予定だから楽しみ
    http://github.com/rui314/8cc
ご清聴
   


 ありがとう
ございました

Más contenido relacionado

La actualidad más candente

きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4Takeshi Yamamuro
 
ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GParsTakahiro Sugiura
 
V6でJIT・部分適用・継続
V6でJIT・部分適用・継続V6でJIT・部分適用・継続
V6でJIT・部分適用・継続7shi
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
 
Boost.B-tree introduction
Boost.B-tree introductionBoost.B-tree introduction
Boost.B-tree introductionTakayuki Goto
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementationMITSUNARI Shigeo
 
巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table についてHaruka Ozaki
 
テーマ「最適化 その2」
テーマ「最適化 その2」テーマ「最適化 その2」
テーマ「最適化 その2」technocat
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能MITSUNARI Shigeo
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep LearningSatoshi imai
 
Delimited Dynamic Binding
Delimited Dynamic BindingDelimited Dynamic Binding
Delimited Dynamic BindingYouyou Cong
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mclMITSUNARI Shigeo
 
Spmv9forpublic
Spmv9forpublicSpmv9forpublic
Spmv9forpublicT2C_
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介MITSUNARI Shigeo
 

La actualidad más candente (20)

きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
 
ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GPars
 
V6でJIT・部分適用・継続
V6でJIT・部分適用・継続V6でJIT・部分適用・継続
V6でJIT・部分適用・継続
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 
Qt × Reactive Extensions
Qt × Reactive ExtensionsQt × Reactive Extensions
Qt × Reactive Extensions
 
llvm入門
llvm入門llvm入門
llvm入門
 
Boost.B-tree introduction
Boost.B-tree introductionBoost.B-tree introduction
Boost.B-tree introduction
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
 
巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について
 
テーマ「最適化 その2」
テーマ「最適化 その2」テーマ「最適化 その2」
テーマ「最適化 その2」
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
Delimited Dynamic Binding
Delimited Dynamic BindingDelimited Dynamic Binding
Delimited Dynamic Binding
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
 
Spmv9forpublic
Spmv9forpublicSpmv9forpublic
Spmv9forpublic
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
 

Similar a Precise garbage collection for c

Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsKohei KaiGai
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another sideKiwamu Okabe
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsKohei KaiGai
 
20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8Kohei KaiGai
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Fixstars Corporation
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LTKohei KaiGai
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!Yohei Fushii
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)RCCSRENKEI
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfaceKohei KaiGai
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングKiwamu Okabe
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml ssuser3a4b8c
 
これからのコンピューティングとJava(Hacker Tackle)
これからのコンピューティングとJava(Hacker Tackle)これからのコンピューティングとJava(Hacker Tackle)
これからのコンピューティングとJava(Hacker Tackle)なおき きしだ
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするKiyoshi Sawada
 
Pub/Sub model, msm, and asio
Pub/Sub model, msm, and asioPub/Sub model, msm, and asio
Pub/Sub model, msm, and asioTakatoshi Kondo
 

Similar a Precise garbage collection for c (20)

emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database Analytics
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8
 
SystemV IPC
SystemV IPCSystemV IPC
SystemV IPC
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
TVM の紹介
TVM の紹介TVM の紹介
TVM の紹介
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join Interface
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml
 
これからのコンピューティングとJava(Hacker Tackle)
これからのコンピューティングとJava(Hacker Tackle)これからのコンピューティングとJava(Hacker Tackle)
これからのコンピューティングとJava(Hacker Tackle)
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
Pub/Sub model, msm, and asio
Pub/Sub model, msm, and asioPub/Sub model, msm, and asio
Pub/Sub model, msm, and asio
 

Precise garbage collection for c

  • 1. Precise Garbage Collection for C の紹介 CSNagoya 三浦英樹
  • 2. Precise Garbage Collection for C 著者  Jon Rafkind, Adam Wick, John Regehr, Matthew Flatt 入手先 http://www.cs.utah.edu/~regehr/papers/ismm15-rafkind.pdf
  • 3. CのプログラムでもGC使いたい • 普通、保守的 GCでしょう • たとえば、Boehm GCとか • でも、長い時間使ってるとメモリー使用量 がすごく増大する場合があるみたいだよ • 証拠は? • それは、次のスライドの心だー
  • 4. PLT Schemeにあった怖い話 • PLT Schemeを使用したプログラム環境 DrSchemeは毎日再起動をしなければならなかっ た。でも、正確なGCに変えたら再起動が必要なく なった • バイトコードとドキュメントを生成すると、正確な GCだと200MBで済むところが、保守的GCだと 700MBも必要だった • PLT Schemeで作ったmail clientを1日おきに再起 動していたが、正確なGCに変えたら再起動しなく て済むようになった
  • 5. 正確なGCを実現するためには • 次の2つが重要 – 生きているポインタとそうでないものを分ける – アロケーションしたものとその中身がなんなのかをしっ かり関連付ける • 簡単に言うけど難しいよーだってCだもん – コンパイラ相当のものを作って、もってる型情報とか 駆使して頑張る
  • 6. サポートしています • 配列なんかの途中を指しているポインタ – 効率が悪くなるから出来る限り使わない方が いいみたい • 共用体 – いまどのメンバーを使っているか記録する – 代入したメンバーと違うメンバーを使う行儀の 悪いことはサポートしない。
  • 7. サポートしていません • いったん、範囲外にポインタを動かしてもう一度 範囲内に戻す p = malloc(1024) p -= 1024 p[1025] /* access 1024 to 2047 */ • ポインタでxorをとってみたり – xor linked listとか。頭いい人っているねー • 一旦整数にcastしてまたポインタにcast – CRubyはgive up • ライブラリの中でアロケーションしちゃったりとか
  • 8. ローカル変数 ポインタの情報を配列に入れる // TRANSFORMED int cheeseburger(int* x) { void* gc_stack_frame[3]; → プログラム変換を行う /* chain to previous frame: */ void* last_stack_frame = GC_last_stack_frame(); gc_stack_frame[0] = last_stack_frame; /* number of elements + shape category: */ gc_stack_frame[1] = (1 << 2) + GC_POINTER_TYPE; /* variable address: */ // ORIGINAL gc_stack_frame[2] = &x; int cheeseburger(int* x) { /* install frame: */ GC_set_stack_frame(gc_stack_frame); add_cheese(x); add_cheese(x); return x[17]; /* restore old GC frame */ GC_set_stack_frame(last_stack_frame); } return x[17]; }
  • 9. 変換後プログラム拡大 // TRANSFORMED /* variable address: */ int cheeseburger(int* x) { gc_stack_frame[2] = &x; void* gc_stack_frame[3]; /* install frame: */ GC_set_stack_frame(gc_stack_frame); /* chain to previous frame: */ add_cheese(x); void* last_stack_frame = GC_last_stack_frame(); /* restore old GC frame */ gc_stack_frame[0] = last_stack_frame; GC_set_stack_frame(last_stack_frame); return x[17]; /* number of elements + shape category: */ } gc_stack_frame[1] = (1 << 2) + GC_POINTER_TYPE;
  • 10. 結局 • GCのシステムにどのローカル変数が生き ているポインタを持っているかを教える – コンパイラが変数の型を把握していることを利 用
  • 11.  malloc部分の変換 • mallocってこんな感じで使うよね malloc(sizeof(foo) * 5) • これをみると、アロケーションするタイプ (foo)と数(5)が分かるわけだ。 • 正確なGCだと何の型のデータをアロケーションしたかの 情報も必要なのでこんな感じで変換  GC_malloc(sizeof(foo) * 5, gc_foo_tag) • で、foo_tagってなんなの? – それは次のスライドの心だー
  • 12. gc_foo_tagって? • gc_tag_struct型の構造体 • アローケートしたオブジェクトと型を結びつける • 内容はmarkとrepair(コンパクション) 処理を行う 関数へのポインタ struct foo { int *x; int *y;} とするとmarkを行う関数  void gc_mark_struct_foo (void * x_) { struct foo *tmp = (struct foo *) x_; GC_mark(tmp->x); GC_mark(tmp->y); } こんな関数をコンパイル時に自動生成する。 ユーザがmark/repair関数をカスタマイズすることも可能
  • 13. いろいろやってみた (PTL Scheme) • PLT SchemeのGCをConservative GCから Precise GCにしてみた • 最初に説明した通り、メモリ使用量が激減 • 実行速度は – メモリアロケーションが多いベンチマークは20% くらい速くなる – メモリアロケーションが少ないベンチマークは1 0~20 %遅くなる 
  • 14. いろいろやってみた (Linuxカーネル!) • カーネルなんて絶対メモリーリークしちゃい かんし、GCが欲しいよね • なんかいろいろ面倒だったみたい。続きは 論文で • tmpfsからddコマンドでファイルアクセス – GC付きのものが4割ほど遅い •  HDDからddコマンドでファイルアクセス – あまり変わらない
  • 15. まとめ • この技術すげー。今後、いろんなところで 使われるようになるはず。 • GC本第2版は保守的GCの章を書き換えな いといかんかもしれませんねー • 8ccでサポート予定だから楽しみ     http://github.com/rui314/8cc