下記の数千行にもわたる構造体の初期化ですが、リリースバージョンのビルドにおいて、「コード生成しています。」という出力メッセージから30秒くらいかかり、プログラムが作成されるのに時間がかかってしまいます。(デバッグ時は数秒もかからないですが、リリース時に時間がかかります)
膨大なデータを持つプログラムの書き方としては適さないのでしょうが、構造体の初期化の記述をなるべく崩さず、代替となる方法などがあればご教授いただきたいです。
宜しくお願いします。
開発環境はvisual studio 2005、MFCのダイアログベースのアプリケーションです。_T("****")の内容は少ない時で半角20文字程度、多い時で半角100文字以内になります。
補足1:CStringをchar [256]にすると、5秒でビルドは完了しました(ほぼ普通のビルドです)。CStringが以上に初期化を行っているからかもしれませんが、デバッグとビルドでこんなに時間の差がつくのが理解できません。
補足2:CStringとしたまま、リリースの構成プロパティ>C/C++>最適化の欄で、デバッグと同じく最適化、プログラム全体の最適化ともに無効にすると、数秒でビルドは完了するのですが、下記のエラーを吐き出しました。
LINK : /LTCG が指定されましたが、コードの生成は必要ありません。リンク コマンド ラインから /LTCG を削除し、リンカの性能を改善してください。
また、最適化のみ無効にすると、エラーはないですが10秒はかかります(約20秒短縮)、プログラム全体の最適化のみ無効(いいえ)にすると、変化はありませんでした。
static TEST_BUFFER TESTNAME [] = { { _T("****"), _T("****"), _T("****"), _T("****") }, ~(以下数千行続く) }; typedef struct _TEST_BUFFER{ CString buffer1; CString buffer2; CString buffer3; CString buffer4; } TEST_BUFFER;
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
2017/07/07 08:27
2017/07/07 08:36
2017/07/07 08:37
2017/07/07 08:47
2017/07/07 08:49
2017/07/07 08:50
回答6件
3
こんにちは。
msvc2015とMinGW(gcc) 5.4.0でやってみましたが、1秒かかりません。
TEST_BUFFERの中身はint型4つとfloat型4つです。
8000行以上定義してます。
TEST_BUFFERはどんな定義なのでしょうか?
constexprコンストラクタで非常に重たい処理をしているということはないでしょうか?
投稿2017/07/07 08:34
総合スコア23259
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
1
(コード内容も本当は気になりますが…)
デバッグビルドの設定と、リリースビルドの設定は、初期値のままですか?
構成が変わっていると、思わぬところで時間がかかることがあります。プリコンパイル済みヘッダとかプリコンパイル済みヘッダとかプリコンパイル済みヘッダとか。(以前泣かされた)
よろしければ、設定内容を見せてもらえませんか?
参考文献:
http://d.hatena.ne.jp/unarist/touch/20110322/1300748204
投稿2017/07/07 09:16
総合スコア1718
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
1
恐らくですが、include パスが多すぎる、もしくは include パスの中に含まれるファイルが多すぎるのだと思います。
include パスの順を見直すか、必要ない物を削ってみてはどうでしょうか?
※あとあるとしたらインクリメンタルリンクくらい?
投稿2017/07/07 09:10
総合スコア5030
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
1
開発環境はvisual studio 2005なので、以下の回答は今回のケースには当てはまりません。
ビルドが止まってしまう
にて「コード生成しています。」から時間がかかるという同様の質問があがっています。
上記ではSDLチェック
に時間がかかっていたとの結論に至っています。
/sdl (追加のセキュリティ チェックの有効化) によると
/sdl を有効にすると、実行時に次のチェックを実行するコードがコンパイラによって生成されます。
クラス メンバーの初期化を実行します。 すべてのクラス メンバーをオブジェクトのインスタンス化時にゼロに自動的に初期化します (コンストラクターの実行前)。 これは、コンストラクターが明示的に初期化しないクラス メンバーに関連付けられた、初期化されていないデータの使用を防止するために役立ちます。
とのことなので、これに時間がかかっているのかもしれません。
ただ、OFFにするとビルド速度はあがる可能性ありますが、30秒程度ですし、コードの安全性を損なうのでONのままのほうがよいと思います。
参考:Security Development Lifecycleチェックボックスとは何か?
なお、SDLがOFFまたは、お使いのVSが2010以前であればSDLチェックがないので、原因は別にあります。
投稿2017/07/07 08:39
編集2017/07/07 08:48総合スコア37453
0
自己解決
とりあえず自分の中でいくつか解決方法が浮かんだので解決済とします。至らぬ点が多々ありましたが、皆さんありがとうございました。また、他に有効な方法があれば引き続き受け付けております。
現時点での解決方法(まだほかにもあるかもしれません)
1.CStringではなくcharの配列にする。(これからの課題)
2.頻繁にビルドを掛ける際は、できるだけデバッグ環境で動かし、最終段階としてリリースバージョンをビルドする(暫定的な回避方法)
3.問題となっている箇所をDLL化し、問題の配列の実体を持っているプログラムを最小限に切り取り隔離する。(他の変更を加えたときのビルド時間の節減。プログラムが分断するデメリットもあり)
投稿2017/07/07 11:17
編集2017/07/07 11:19総合スコア31
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
0
ビルド後のbinaryを覗いてみたい気持ちがありますが、原因は明らかにCStringのコンストラクタの最適化でしょう。おそらくCStringコンストラクタ処理後の状態をそのままbinaryに埋め込むとかそういうことをやっているのではないでしょうか。
とりあえずそのstatic変数があるファイルを分けて再コンパイルをあまりしなくていいようにしてみるとかでしょうか。
Chironianさん提案の構造体をいじることや、配列として文字列をもたせるのは、実行時にCStringコンストラクタコストを削れないことになると思うので(こんなの最適化できるんですね)コンパイル時間は犠牲に捧げるべきかと思います。
投稿2017/07/07 09:51
総合スコア5850
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Q&A
受付中
各位の和を求めるプログラムを書きたい(文字列として扱ってはいけない)
回答2
クリップ0
更新
2023/06/07
Q&A
解決済
NotionAPIでページコンテンツを取得したい
回答1
クリップ1
更新
2023/05/31
Q&A
解決済
複数条件で絞り込む検索ボタンを作成したい
回答2
クリップ0
更新
2023/06/06
Q&A
解決済
ハンバーガーメニューの挙動について(transitionが、もとに戻る時には適応されない)
回答2
クリップ0
更新
2023/06/02
Q&A
受付中
[GAS] 日本語・全角・特定の記号のみを許容するスクリプトを作成したい
回答1
クリップ1
更新
2023/06/06
Q&A
解決済
Java キーボードから入力を受け付ける命令
回答3
クリップ0
更新
2023/06/07
意見交換
受付中
いくつかのメソッドの大項目としてのコメントアウトをどう書くか
回答4
クリップ1
更新
2023/06/04
Q&A
解決済
javaのResultSet.get~が端数処理する
回答1
クリップ0
更新
2023/06/06
同じタグがついた質問を見る
MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。
Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。
コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます
C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。