トップページ⇒tech
64コメント14KB

VC++の最適化

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
VC++の最適化について語りましょう
0002デフォルトの名無しさんNGNG
スレ立てるほどのことなんだろうか?
0003デフォルトの名無しさんNGNG
__forceinlineはとても役に立ちました。
0004デフォルトの名無しさんNGNG
演算は最適化されてるとこんな感じで展開されるのかな・・・?

int i, j;
...
i = i + 1; >>>> i++;
i = i + 3; >>>> i += 3;
i = 1 + 2 + 3; >>>> i = 6;
i = j * 8; >>>> i = j << 3;
i = 7 + j / 4; i = 7 + j >> 2;
0005デフォルトの名無しさんNGNG
>> i = 7 + j / 4; i = 7 + j >> 2;
i = 7 + j / 4; >>>> i = 7 + j >> 2;
0006デフォルトの名無しさんNGNG
ちょっと待てよ
0007デフォルトの名無しさんNGNG

割り算はビットシフトにはならなくない?
-1/4 != -1>>2
じゃないかなぁ?
0008デフォルトの名無しさんNGNG
>>7
負の除算はそうかも

あと
typedef struct{
int i;
int *p;
} sXYZ, *pXYZ;

int i;
sXYZ sxyz;
pXYZ pxyz;
i = sizeof(sxyz); >>>> i = 8;
i = sizeof(sXYZ); >>>> i = 8;
i = sizeof(pxyz); >>>> i = 4;
i = sizeof(pXYZ); >>>> i = 4;
かな?
0009デフォルトの名無しさんNGNG
>i = j * 8; >>>> i = j << 3;
違うと思う。
0010デフォルトの名無しさんNGNG
j = 0xfffffffeであって

int j;なら
j = j / 2; >>>> j /= 2; のままで (j = -1
unsigned int j;なら
j = j / 2; >>>> j >>= 2; になるとか・・・(j = 21........
0011デフォルトの名無しさんNGNG
WORDを使うかDWORDを使うかは悩みどころ。
その時々で違うと思うけど、掛け算のときはWORDのほうが早いよね。
DWORD hage = hoge()&0xFFFF;
としておくと、コンパイラがhageを16bitとして扱って最適化してくれるみたい。
0012デフォルトの名無しさんNGNG
>>9
int だから?

でも何かの参考書では(MASMアセンブラの参考書だったかな?
<< は正負関係なく正常に動作する >> は負だとだめと書いてあったような
0013デフォルトの名無しさんNGNG
>>11
ん・・・そうなの?

座標とかサイズの変数いつも4バイトにしてるから
イメージの拡大縮小とかで4バイト同士の乗除算になるかな・・・(^^;

int x;
int y;
DWORD width;
DWORD height;
POINT cursorpos;
SIZE imagesize;
RECT screenrect;
などなど・・・
001411NGNG
>>13
不確かな情報でふが・・・
αブレンドのときに、
右にシフトしてからadlpha値をかけて左シフトで元に戻すほうが、
その場でalpha値をかけて&0xFF00でマスクかけるよりもかなーり早かった。
0015デフォルトの名無しさんNGNG
引数や戻り値はboolはダメでBOOLって本当?
0016デフォルトの名無しさんNGNG
比較はBOOLのほうが速い。代入はboolのほうが速い。だっけ?
0017デフォルトの名無しさんNGNG
WORDを演算で扱うと、パーシャルレジスタストールでない?
コンパイラがその辺も考慮してくれるの?
0018デフォルトの名無しさんNGNG
boolは全く使わないなぁ
BOOLばっかし


あとは#defineとconst(グローバル)の違いとか・・・

const int ABC = 4;
#define DEF 4
main()
{
int i = ABC;
const int j = ABC;
const int k = DEF;
}
※この場合最適化されると
j は定数として扱われるのかな?


EffectiveC++(?)には定数は#define よりも
const使いなさいみたいなこと書いてあったけど
0019デフォルトの名無しさんNGNG
>>j は定数として扱われるのかな?
j, k は定数として扱われるのかな?
0020デフォルトの名無しさんNGNG
僕は貧乏だから、VC++の最適化オプションはグレーです・・・
0021デフォルトの名無しさんNGNG
age
0022 ◆coMPIlL. NGNG
>>18
定数扱いになるよ。

#include "stdafx.h"
#include <iostream>
using std::cout; using std::endl;

#define DEFINE 5
const int CONSTANT = 6;

void dummyFunc( int i, int j)
{
cout << i << j << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
volatile int a = DEFINE;
volatile int b = CONSTANT;

volatile const int ca = DEFINE;
volatile const int cb = CONSTANT;

dummyFunc( a, b);
dummyFunc(ca, cb);

return 0;
}

で、

sub esp,0Ch

mov dword ptr [esp+4],5
mov dword ptr [esp],6

mov dword ptr [esp+8],5
mov dword ptr [esp+8],6

mov eax,dword ptr [esp]
mov ecx,dword ptr [esp+4]
push eax
push ecx
call dummyFunc
push 6
push 5
call dummyFunc
xor eax,eax

こうなる。

volatile つけたから一応実体はできたけど、
volatile なくすとそれすらなくなる。
0023デフォルトの名無しさんNGNG
呼び出しにレジスタ使うオプションなかったけ
0024デフォルトの名無しさんNGNG
>>23
__fastcall?
0025デフォルトの名無しさんNGNG
VisualStudio.NETのコンパイラが6.0より馬鹿になっとる・・・。
昔作ったゲームをコンパイルし直したら54fps->51fpsにダウンした。
あらゆる最適化オプションを試したが、ファイルサイズがでかくなるだけで、
1fpsも速くならなかった。

M$なんとかしる!
0026デフォルトの名無しさんNGNG
>>25
所詮メーカー品、どうしようもないね。
gccのソース、チューニングするのなんてどう?
0027デフォルトの名無しさんNGNG
gccは遅い、これ定説
0028デフォルトの名無しさんNGNG
VisualSudio.NETにVC++6のC++プロジェクトをインポートすると
勝手にC++例外処理が有効になる罠。
0029デフォルトの名無しさんNGNG
iccは速い。
0030 ◆4COMPILE NGNG
>>28
そうなんや、例外必ず有効にするから知らなかった。
0031デフォルトの名無しさんNGNG
例外が有効になっただけで効率が落ちるコード化居てる奴が悪い
003225NGNG
何回もコンパイルしていたら54fpsに戻ったよ・・・。
どうなっとんじゃゴラァ
0033デフォルトの名無しさんNGNG
単に実行したときに裏で何か動いてたとかじゃないのか?
0034デフォルトの名無しさんNGNG
例外が有効になったせいで効率落ちたら例外じゃなくてただのチェッカだ。
0035デフォルトの名無しさんNGNG
例外は認めません。
0036デフォルトの名無しさんNGNG
例外使わないC++なんてやってらんない。
0037デフォルトの名無しさんNGNG
私はVC++6.0のStandardEditionなので最適化が使えません。
画像処理とかではなく、純粋に計算に時間がかかっている
プログラムの場合、最適化にる速度アップは見込めますか?
見込めるならProfessionalEdition(今は違うんだっけ)に
投資しようかと思ってます。
具体的にはトリップ検索ツールを作っている。
0038デフォルトの名無しさんNGNG
Trip検索ツールなら、JohnTheRipperとか使えよ……
003937NGNG
>38
いや、あの、勉強がてら、、、
ところで最適化できるようなEditionって個人で買うにはずい
ぶん高いですね。
私の経済状態では無理そうなので37の質問は無視してくだ
さい。
0040デフォルトの名無しさんNGNG
高速化したいなら、最適化とか気にする前にcrypt.cを使わずに書き直せ。
0041デフォルトの名無しさんNGNG
iccのトライアル版でコンパイルすれば?
0042デフォルトの名無しさんNGNG
つーかvectorC使え
0043デフォルトの名無しさんNGNG
ここはVCの最適化を語るスレとして全く機能し取らんな。
質問者にも問題あるが回答者が無能すぎる。
0044デフォルトの名無しさんNGNG
VC++で、構造体の隙間を埋める(パック)したいとき、
#pragma pack
以外に方法があったら教えてください。
0045デフォルトの名無しさんNGNG
>>44
VC++のプロジェクトの設定でC/C++タブを開く。
カテゴリをコード生成にセットして、構造体メンバのアライメンとコンボボックス
で1バイトに設定する。

ちなみにVC++6.0の場合ね。
0046デフォルトの名無しさんNGNG
>> 32
VCの最適化って、環境によって異ならなかったっけ?
メモリとかの容量で。
なんか、全く同じものを別々の環境でコンパイルして、
fcとったら違う結果になった記憶が。
0047デフォルトの名無しさんNGNG
>>45
わかりました。
ありがとうございます。
0048デフォルトの名無しさんNGNG
>>46
バイナリの生成日時と製品シリアルとGUIDが埋め込まれる。
0049デフォルトの名無しさんNGNG
最適化以前に、アルゴリズムを見直しなさい。
0050デフォルトの名無しさんNGNG
>>49
最適化=アルゴリズムだと思うが。

分岐をなくす、アラインの考慮、メモリアクセスの局所性を高める、
論理演算を駆使する、
全部アルゴリズムレベルで工夫しない限りできないよ。
0051デフォルトの名無しさんNGNG
アルゴリズム=処理フローだから
小手先の最適化はアルゴリズムの最適化にはならない。
0052デフォルトの名無しさんNGNG
小手先の最適化が必要と思う段階ではすでにアルゴリズムの最適化はしつくしてるのが現実。
0053デフォルトの名無しさんNGNG
>>52
しかし、最適化ページでアセンブラ関連の記事をみた初心者は
アルゴリズムの前に小手先の最適化をしたがる。
0054デフォルトの名無しさんNGNG
>>53
なんだかんだいっても、最適化、面白いからね。
苦労して少しずつ速くなるのは、やはり気持ちが良い。

もっとも、その最適化に意味があるのかは別問題だが。
払った労力に対して、ちょっとしか速くならないことも多いからね。
005537NGNG
>40
作ってみました。
結果、、、遅すぎてシャレにならん。
UFC-cryptの10倍は遅い。
UFC-crypt.dllの偉大さを知った。
0056デフォルトの名無しさんNGNG
最近はメモリコピーの回避が一番効くなー
0057デフォルトの名無しさんNGNG
メモリコピーよりも分岐予測ミスする方が痛い
0058デフォルトの名無しさんNGNG
crypt最速選手権でもやるか。
0059デフォルトの名無しさんNGNG
UFC-cryptの4倍ちょい速いコード書いてある
0060デフォルトの名無しさんNGNG
プロファイル取ったらほとんどメモリコピーだったYO!
0061デフォルトの名無しさんNGNG
>59
あぷキボンヌ
0062デフォルトの名無しさんNGNG
>>59
UFCって何の略か知ってますか?
0063デフォルトの名無しさんNGNG
うふっC
0064デフォルトの名無しさんNGNG
保守age
■ このスレッドは過去ログ倉庫に格納されています