変数の型と計算速度

解決


倉戸 有珠  2013-09-29 09:56:26  No: 45346

WinXP,Vista Lazarus1.0.12 の環境でゲーム作成をしています。
シューティングをつくっているんですが、変数の型で解らないところがあります(計算速度の比較)。

①整数計算  Byte,ShortInt型とInteger型の計算速度の差
②実数計算  Single型,Double型,Currency型の計算速度の差
③RecordとPackedRecordの違い

①、②ともに、計算処理速度の速い方を使おうと思っています(メモリは気にしません)。リンクでもいいのでお願いします。
③はどのような違いがあるか教えてください。


DEKO  2013-09-29 18:55:04  No: 45347

演算速度に関しては実測してみればいいのではないかと。

・演算回数を最小にするようなコーディングにする。
  (ループの中で変化しない計算式は変数を使ってループの外に出す等)
・使う変数の型の数を最小限に抑える (DWORD と Single しか使わないとか)。
・乗除算等のコストの掛かる計算はなるべく避ける。
・可能な限り整数演算しかしない。
なんだかんだ言っても、大昔のプログラミングの参考書に
書いてあったような事が一番効きます (実測すれば判ります)。

record と packed record についてですが、

procedure TForm1.Button1Click(Sender: TObject);
type
  TRec1 =
    record
      a: array [0..9] of Boolean;
      b: array [0..9] of Byte;
      c: array [0..9] of Integer;
      d: array [0..9] of Double;
    end;
  TRec2 =
    packed record
      a: array [0..9] of Boolean;
      b: array [0..9] of Byte;
      c: array [0..9] of Integer;
      d: array [0..9] of Double;
    end;
begin
  ShowMessage(IntToStr(SizeOf(TRec1)));
  ShowMessage(IntToStr(SizeOf(TRec2)));
end;

これがどういう結果になるのかを調べてみてください。
両者の違いはワード/バイトアライメントを行うか否かです。
http://docwiki.embarcadero.com/RADStudio/ja/%E6%A7%8B%E9%80%A0%E5%8C%96%E5%9E%8B
http://docwiki.embarcadero.com/RADStudio/ja/%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E3%82%A2%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%B3%E3%83%88%EF%BC%88Delphi%EF%BC%89

> WinXP,Vista Lazarus1.0.12 の環境で...

・Delphi 使いの皆が皆 Lazarus / FPC を使っているとは限りません。
・Delphi 使いの皆が皆 Lazarus / FPC に精通しているとは限りません。
・Delphi と FPC の挙動は異なる事があるため、
  Delphi で通用する事が FPC でも通用するとは限りません。

ここは Delphi Q&A なので、FPC での正確な挙動が知りたければ、
Lazarus / FPC のコミュニティでお聞きください。


有珠  2013-10-01 05:07:29  No: 45348

回答ありがとうございます。
Lazarusのコミュニティが見つからなかったので、ここで質問させていただきました(Delphiトライアルとか入れてみた方がいいんですかね...)。

packed recordを使ってもさほどサイズも減らないようなので、recordのアンパックドレコードにしようと思います。

計算速度はやっぱり努力ですか...


DEKO  2013-10-01 07:23:37  No: 45349

> Lazarusのコミュニティが見つからなかったので
あるにはありますよ。

[Pascalにホエ口!Lazarus,FreePascal (free-ml)]
http://www.freeml.com/lazarus
# 紹介しといてアレですが、あまり活発ではありません。

タイトルに "エ口" が含まれるのでこの掲示板の
NG ワードに引っ掛かってしまうのも困りモノです (^^;A
# "ろ"ではなく漢字の "くち" で代用してあります。

> Delphiトライアルとか入れてみた方がいいんですかね...
いあいあ、そういう事ではなく、Delphi と FPC は別のコンパイラなのですから、
Lazarus を使うのであれば、Delphi の事を聞いても参考にならない事が多いと思うのです。
ライブラリにしたって Delphi の VCL と FPC の LCL は互換性がありませんしね。 

> packed recordを使ってもさほどサイズも減らないようなので
ん?話の流れからして「速度重視」の事かと思っていました。
速度重視なら packed を使う事はまずないでしょう。

> 計算速度はやっぱり努力ですか...
"地道な作業" という意味では努力ですね。


倉戸 有珠  2013-10-02 09:06:42  No: 45350

Lazarusコミュニティあったんですか...。
とりあえず登録はしてみましたが・・・。活発じゃなさそうですね(笑)

Delphi導入は見送って、Lazarusで頑張っていこうと思います。

packed recordの件は速度重視のつもりで書いたんですが、計算は、サイズが小さければ早いものだと思っていたので。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加