ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 07:03

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - ガベージコレクションを使ってみよう
作成者 メッセージ
  記事の件名:  ガベージコレクションを使ってみよう  引用付きで返信する
さてさて、折角AB5CP3でGCに対応した(つもりになっている!?)ので、ABにおけるGCのメリット/デメリットと簡単な使い方を書いてみようと思います。あまり詳しくない方のために、GCとは?というご説明からさせていただきます。


【GCとは】
ガベージコレクション(GC)とはプログラミングを行う際、メモリ管理をプログラマーではなく、システム側が自動的に行ってくれるという画期的な仕組みのことを言います。
一般的に、プログラマーが扱えるメモリオブジェクトは下記の3つが挙げられます。

グローバルメモリオブジェクト … グローバル変数のこと。プロセスメモリの専用セクションに配置されます。
ローカルメモリオブジェクト … ローカル変数のこと。スタック上に配置されるので、関数を抜け出すときに勝手に解放されます。
ヒープメモリオブジェクト … malloc関数で取得できるメモリオブジェクトのこと。使い終わったらfree関数で解放しなければなりません。

GCはヒープメモリオブジェクトの解放を自動的にやってくれるのでプログラマーは取得したメモリオブジェクトに対して、いちいちfree関数を呼び出さなくても良いことになります。これにより、プログラマーは下記のようなメリットを得ることになります。


【メリット】
1. メモリオブジェクトの解放のし忘れの心配が無い
2. 利用中のメモリオブジェクトを誤って解放してしまう心配が無い
3. freeのタイミングを考えなくても良い

1番目、人間がコーディングをする以上「忘れる」という事象はいつだって生じる可能性があります。しかし、GCを活用したコーディングスタイルを確立すれば、少なくともfreeし忘れるという心配からは抜け出せます。
2番目は人為的なミスによる不正メモリ空間へのアクセスによる強制終了が激減することを意味します。GCを活用すれば、今までよりもコードの信頼性が向上する可能性があります。
3番目は開発効率の向上を意味します。大量のソースコードをコーディングしているとわかることなのですが、どこでfreeを書いてやればよいのか悩んでしまうことがあります。GCが察知できることについて人間が考え、時間を浪費するのは勿体無いことなのかもしれませんね。

この他にも、ABが採用するGCでは、malloc/freeとの完全な混在が可能になっています。過去のソースコードとの互換性を十分に保ちながら、GCを活用したコーディングを行っていただけます。

と、メリットを挙げれるとこんな感じかと思いますが、勿論デメリットだって存在するんです。


【デメリット】
1. GCによるメモリ回収中はスレッドが停止する
2. 動作速度が鈍る

ABで実現されるGCにおいての最大の欠点は動作速度に支障をきたすところにあります。ABはMark&Sweepという方式のGCを採用しており、更に保守的GCでもあります(これら2つの用語が気になる方、Webで調べてみてください)。しかし、動作速度の問題は実はGCの活用テクニックでいくらかは解消することができます。具体的な解消法は後で述べます。



【使い方リファレンス】
mallocの部分をGC_mallocに書き換え、対象となるfree呼び出しを取り除くだけで今すぐ利用することができます。
GCは必要に応じてメモリ回収を行いますが、大量のメモリを検査するのは時間のかかる処理であることも事実です。この処理をできるだけ軽減させるため、ポインタ値を含まないメモリオブジェクト(文字列データ用など…)を取得する場合はGC_malloc_atomic関数の利用を推奨します。
コード:
Dim buffer As LPSTR
Dim i As Long
For i=1 To 10000
	buffer=GC_malloc(1024*100)
Next
このプログラムは100KBの無駄メモリを10000回に渡って確保するものです。計1GBのメモリを確保することになりますので、単純にmallocをするだけのプログラムを書くと使用メモリがグングン上昇します。
下にmallocとGC_mallocの実行比較図を示します。

画像

ABのGCはMark&Sweep方式で実装されています。若干ながら、GCを使ったプログラムのほうが実行時間が長いことがお分かりいただけますでしょうか。この遅延時間は下記のような方法を用いることで縮めることができます。

GC_mallocを適切な場面でGC_malloc_atomicに書き換える
GC_mallocでは大量のメモリ空間を一度に確保しない


【補足(開発中であるということ)】
AB5CP3に付属のGC機能は下記のような機能が未完成です。次回のバージョンアップで改良を行う予定ですので、今しばらくお待ちください。

・GCNew(GC_mallocのオブジェクト生成バージョン。delete不要)
・マルチスレッドアプリケーションにおけるGC

マルチスレッドでのGCに関しては、GC対応型のスレッドクラスを別途に用意し、対応させていこうと考えています。ライブラリ開発チームの皆さん、サポートをお願いしますね!
投稿記事 Posted: 2006年9月25日(月) 11:03

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean