自分のセンスや笑いの好みに影響を受けた作品を教えて

VisualStudio2008の最適化について

こんにちは。

質問させてください。

現在VisualStudioでとある処理を書きました。
わかりやすく以下のコードを書いたとします。

#include <stdio.h>
#include <windows.h>

#pragma comment ( lib, "winmm" )

int main()
{
  DWORD t = timeGetTime();

  int sum=0;
  int i=0;
  for( i=0;i<0x7fffffff;++i )
    ++sum;

  t = timeGetTime() - t;

  printf( "time -> %d\n", t );

  return 0;
}

今回は単純にfor文の時間を計測したいとします。
上記コードをReleaseモード実行速度重視 (/O2)でコンパイルし、実行すると出力は必ず

time -> 0

と出力されます。
上記コードをReleaseモード実行速度重視 (/O2)でコンパイルしアセンブリとして出力したものです。

CONSTSEGMENT
??_C@_0M@DAGCMHCE@time?5?9?$DO?5?$CFd?6?$AA@ DB 'time -> %d', 0aH, 00H ; `string'

push esi
mov esi, DWORD PTR __imp__timeGetTime@0
push edi
call esi
mov edi, eax
call esi
sub eax, edi
push eax
push OFFSET ??_C@_0M@DAGCMHCE@time?5?9?$DO?5?$CFd?6?$AA@
call DWORD PTR __imp__printf
add esp, 8
pop edi
xor eax, eax
pop esi
ret 0

アセンブリコードを見るとするとint sumはコード中でインクリメントされるだけで他に使用されないので、最適化によって削除されてしまっているようです。

この、時間を計測したいところだけ適度に最適化させつつ、処理が残るようにするような命令はありませんでしょうか?
pragmaでかこったりするだけで処理が消されない程度に最適化されるとうれしいのですが・・・
よろしくお願いします。


/*
  VisualaStudio 2008 academic Edition

  今回のテストケースではsumの値もコンソールに出力すれば最適化で消されずに済むのですが最適化の計算によってforループは削除され、代わりに即値(0x7fffffff)がそのまま表示されるように最適化されてしまいます。
  ですので今回は
  ・使用した変数を使用するように書き換える
  ・最適化で消されないようにコードを記述しなおす
  ・inlineアセンブラで最適化させない
  といった解決策以外でよろしくお願いします。
*/

A 回答 (2件)

optimize プラグマ


http://msdn.microsoft.com/ja-jp/library/xz7ttk5s …

ただ、CPU自体の実行時の動作最適化はどうしようもないので、CPU型番毎の動作は異なるものと思われます。あとクロックがターボブーストする可能性もありますよ。

それに昔のPentimumと今のiCoreでは同じCPUクロックでも結果の実行クロック数は全く違いますから。
検証自体にどのぐらいの意味があるか疑問です。
    • good
    • 0

sumが消えないようにするだけでいいなら宣言をvolatile intにしとけばいいんじゃないでしょうか。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報