- 締切済み
メモリの占有率を調べるには?
PerlやPHPでサーバーサイドプログラムを書いています。いずれはC++にも手を出す予定です。 プログラムを動作させる上で処理速度は大事なポイントですよね。 ある動作をさせるのに複数の方法があれば、膨大な回数ループさせてベンチマークテストして、もっともパフォーマンスが良いものを選ぶということは最近覚え、よく使っています。 しかしこの処理速度と「メモリの占有率」って別物ですよね? こんなページを見つけたのですが http://hakuhin.hp.infoseek.co.jp/main/as/bit.html これによると変数は32ビットのデータを格納でき、変数を用意する度に32ビットのメモリを確保してしまうので無駄がある、使用する変数(数値や文字列など)のビット数が大きくないのなら1変数がもつ32ビットのメモリを分割して使用することができる、というものらしいのです。しかしこれを実行させようとコードを書くと冗長になってしまいます。普通に必要な個数、変数を用意したくなってしまいますが、このページの方法は有用なものなのでしょうか?それを知りたく、皆様にメモリの占有率の調べ方をお聞きしたいのです。もしかして「結局は動作速度に関わってくるから従来のベンチマークテストで構わない」なんてことだったりしますか? ちなみにリンク先の内容は言語がActionScriptですが、論理演算の話なので他の言語でも流用できますよね?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★変数とビットを区別しましょう。 >これによると変数は32ビットのデータを格納でき、 >変数を用意する度に32ビットのメモリを確保してしまうので無駄がある、 ↑ 変数といっても 0、1 の2つの状態しか存在しないフラグ(ON,OFF)の場合だけです。 ・普通の整数変数は数値として +123 とか -999 とかを格納しますがこれにも種類があります。 例えば C/C++ などでは 8ビットの整数変数として char 型⇒0~255 または -128~+127 を表現可能。 16ビットの整数変数として short 型⇒0~65535 または -32768~+32767 を表現可能。 32ビットの整数変数として long 型⇒0~4294967295 または -2147483648~+2147483647 を表現可能。 64ビットの整数変数として long long 型⇒0~18446744073709551615 または -9223372036854775808~+9223372036854775807 を表現可能。 となっています。 メモリ量を気にするのなら表現できる範囲を限定して char、short、long、long long 型を 適切に選択します。特に膨大なデータを管理する場合は無駄のないようにします。 ・あと C/C++ では1つの整数変数(int型)をビット幅で分割して利用することが出来ます。 フラグの場合は 0、1 の 1 ビットですが 0~9 の範囲なら 4 ビットあれば足ります。 そこで int 型(32ビット)を 32÷4=8個に分割して利用することが出来るのです。 プログラミング的には struct { unsigned int a : 4; unsigned int b : 4; unsigned int c : 4; unsigned int d : 4; unsigned int e : 4; unsigned int f : 4; unsigned int g : 4; unsigned int h : 4; } bit4; と宣言して bit4.a = 1; bit4.b = 2; bit4.c = 3; : bit4.h = 8; と分割して利用することが出来ます。 これによりメモリは節約されますが1つの変数をビット幅で取り出す操作を行っていろいろと 演算(代入など)してまた1つの変数に戻す操作が行われます。これにより処理速度は遅くなります。 またプログラムのコード量(サイズ)も増えます。 ・よってメモリ量には (1)データのメモリ量 (2)コードのメモリ量 (3)ディスクのファイル量 の3つがあります。 まとめ: ・データ量を抑えようとするとプログラムのコード量が増加、処理速度も低下します。 コード量を抑えようとするとプログラムのデータ量が増加、処理速度は高速に出来るかも。 あまりアクセスしない変数ならデータをパックしてメモリ内に格納する方法もあります。 そしてアクセスするときにパックされたビットデータを1つの変数(32ビット)などに 展開してから処理をするように工夫などをすればバランスが取れます。 ・あと処理手順のアルゴリズムを見直すだけでも高速になります。これが一番大きい。 >このページの方法は有用なものなのでしょうか? ↑ 場合によっては有用ですよ。 >ちなみにリンク先の内容は言語がActionScriptですが、論理演算の話なので他の言語でも流用できますよね ↑ はい。出来ます。 例えビット操作(論理演算)がサポートされていなくてもメモリ内のイメージを持った上で プログラミングするのとイメージなしでは違います。重要なのはメモリ・イメージを持ち その上でプログラミング出来るかどうかです。 最後に: ・速度を気にするならインタプリタ(スクリプト言語)よりもコンパイラ型の C/C++ 言語を 使ってプログラムを作成すれば良いでしょう。C 言語がいまだに使われる一番の理由は プログラムを CPU で直接実行可能なネイティブ・コードに変換するため高速になるから。 と私は思います。Perl、PHP で速度面で不満が出たなら C/C++ で書き直すと良い。 ・ちなにみ google は C 言語で作成されていると聞いた事があります。 あっ、だから高速なんだ。ふ~ん。 じゃあ、他の検索エンジンが遅いのは多分 C 言語以外で作られるいるのかな?ってね。 ・以上。参考に。
- shirayukix
- ベストアンサー率43% (90/207)
どれが質問なんでしょうか? > 使用する変数(数値や文字列など)のビット数が大きくないのなら1変数がもつ32ビットのメモリを分割して使用することができる この部分について、 32ビットのアーキテクチャでは32ビットの演算が最も速いはずです。 質問のURLでは論理演算やシフト演算についてしか書かれていません。 変数を分割して使うと、四則演算の速度は格段に落ちますね。 …メモリの使用効率をある程度考慮しますが、ソースの可読性を取ります。
お礼
ご回答ありがとうございます。 重ね重ねの質問になってしまいますが、32ビットの演算というのは普段使ってる$a="This is"." a string";とか$b=4*10;のような演算のことでしょうか? また、「論理演算やシフト演算についてしか書かれていません」とありますが、他にどのような知識が必要なのでしょうか?
補足
失礼いたしました。 メモリの占有率の調べ方をお聞きしたいというのが質問です。 ・リンク先にある方法は有用なものか? ・ベンチマークテストで構わないのか? ・他の言語でも流用できるか? 以上の3つは確認のために軽く聞いてみたものです。 こちらもご回答いただければ幸いですが。 分かりにくい質問で申し訳ありませんでした。 どうかよろしくお願い致します。