- 153 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 09:41:30 ]
- 変数を宣言する=メモリ上に領域を確保する
変数に代入する=メモリ上に書き込む こんな基本も分かってないようじゃ駄目だろ。 でも、キャッシュから追い出される前に破棄できるデータ領域は重要だよな。 1ms以下で終わる関数は終了までキャッシュメモリから追い出されない可能性あると思うし、 使い終わったらすぐ破棄すれば、その分多くグローバル/スタティックデータをキャッシュで保持できるようになる。 ところで、CPUロジック的には破棄したデータ領域の変更内容ってメインメモリに反映されるんだっけ? キャッシュが破棄されるのって内容が同一のときだけだろ? じゃあいくら破棄しても中身書き換えた以上はメインメモリに書き込むんじゃね? メインメモリへの書き込みを減らすには、できるだけ同じデータ領域を使いまわすのがいいんじゃないかな。 ヒープ領域とかなら繰り返し使われるよね。 でもJavaの場合で最小値が2MBだって。 優先的に実行されるアプリじゃない限り使い回しは難しいね。 確実に使いまわせるのはやっぱりスタック領域だよね。 直近の4kByteが必ず1次キャッシュに入る。 スタックに確保するには、引数渡ししたデータと普通に宣言した変数だよね。 少々のデータなら参照渡しするより値渡ししたほうがキャッシュ効率がいい事になる。 わけないか。 使った分だけ古いのがキャッシュから追い出されるんだ。 だから、ループで散らばったデータを使うくらいなら、ループだけを関数宣言してでもデータを一箇所に集めることが重要なのかな。 あ、そこで書き込みしないデータをループの直前でフォーカス作って変数宣言してコピーしたらいいわけだ。 結局おんなじか。 何度もスタックをキャッシュから追い出すくらいなら普通にヒープにまとめて領域取ったほうがいいな。 変更しなければ書き戻されはしないんだし。 結局小さいデータはオート変数ででっかいデータはアロケート・・ごく普通だな。
|

|