ページ 1 / 1
C#からVC++の関数をコールする場合
Posted: 2013年12月02日(月) 16:36
by eigenvector
C#のガベージ コレクション は実行速度に不安定性を齎すそうですが、
これはC# からコールされたVC++で作った関数にも実行の速度を遅くさせるのでしょうか。
そして、どんな形でC# からVC++で作った関数を利用すれば、
ガベージコレクションからの影響を少なくなるのでしょうか。
できれば、
これからも通用できるようなC# からVC++で作った関数を利用する方法(モデル)を教えていただきたいです。
どうぞ宜しくお願い致します。
Re: C#からVC++の関数をコールする場合
Posted: 2013年12月03日(火) 04:06
by YuO
普通のプログラムで,そうそうGCが気になることはないと思いますが……。
GCについて「気にしない」のがこれからも通用する,P/Invokeの使い方だと思いますよ。
# 気にするのであればC#側を相当気にかけて作る必要があるので,P/Invokeがどうこう,などという問題ではない。
Re: C#からVC++の関数をコールする場合
Posted: 2013年12月03日(火) 10:39
by eigenvector
YuO様
ご教授ありがとうございます。
あえて、もう一度質問します。
例えば、下記のような表現を良く見られます。
==============================================================================
過去に C/C++ で書かれたような資産を生かすためにも P/Invoke が利用されます。
この用途の場合、P/Invoke 以外に、C++/CLI を使うという選択肢もあります。)
==============================================================================
P/Invoke 対 C++/CLI に悩まされます。
どっちを使うほうが、C#のガーベージコレクションからの影響を最小限にする可能でしょうか。
どうぞ宜しくお願い致します。
Re: C#からVC++の関数をコールする場合
Posted: 2013年12月03日(火) 10:48
by softya(ソフト屋)
YuOさんも書いているように気にしてはイケナイのです。
気になるようなら、全部C++で書けば解決します。
GCの仕組みはOSのバージョンやメモリ実装などで動作が変わる可能性が高い部分なので、気にしていると余分なワナにハマります。
※ わざわざ、メモリ確保・解放を曖昧にしている部分を明快にしようとすること自体C#の設計思想に反することでもあります。
> どっちを使うほうが、C#のガーベージコレクションからの影響を最小限にする可能でしょうか。
たぶん、どっちも変わらないと思います。
Re: C#からVC++の関数をコールする場合
Posted: 2013年12月03日(火) 13:19
by YuO
eigenvector さんが書きました:P/Invoke 対 C++/CLI に悩まされます。
どっちを使うほうが、C#のガーベージコレクションからの影響を最小限にする可能でしょうか。
C++/CLIはCLI上で動く以上,Managed Codeに関してはC#と同等のGCの影響下にあります。
GCを理由にP/InvokeとC++/CLIの使い分けをすることは普通は行わないでしょう。
# CLIのMSによる実装がCLRであり,CLR + MS拡張のライブラリ(WinForms等)が.NET Framework。
そもそも,なぜそこまでGCを気にするのですか。
現在,確実にGCによる影響で性能劣化が起きている状況であるならば,その状況の説明をすることで情報が得られるかもしれません。
しかし,そうではない状況で,「そういう風に言われている」という懸念だけで色々書かれても,
- 気にしなければよい
- 自分で想定している状況で実験してみればよい
というような話になります。
# パフォーマンスの話で具体的な状況がないとかありえない。
ちなみに,GCの実装自体はCLIの実装にまかされていて,.NET Frameworkのように並列GC,世代別GCを行うものも,
XNA FrameworkのようにFullGCのみ(STWが発生する)も存在します。
そもそも.NET FrameworkでもWorkstation ModeとServer ModeでGCの動作が異なったりしますし。
なので,本来ならば言語について言う前に環境を定義しないといけません。
とりあえず,MSDN
ガベージ コレクションとかを読んでみてはどうでしょうか。
Re: C#からVC++の関数をコールする場合
Posted: 2013年12月03日(火) 15:50
by eigenvector
丁寧なご指導本当にありがとうございます。
背景を言わなかったんで申し訳ありませんでした。
これまでMSのVC++で書かれたシーケンス制御系のソフトをC#に書き換えようとしたいですが、
反対派の意見として、経験的にC#のGCが実行速度に不安定性を与えると言われました。
速度やリアルタイム性を最大限に確保するために、
肝心な部分をC++で書いて、その中のメモリの取得と解放は全部 codeで明確に指定して、自己完結にします。
そしてDLL化して、C#に渡します。
さて、このC++で書いたDLL中までGCのための動きをするわけはないでしょう(従って近似リアルタイム)。
という自分の見解ですけれども、誤解でしょうか。
要は、C++で書いたDLLの中でGCのための動きがなければ良いのです。
やはりだめでしょうか?
Re: C#からVC++の関数をコールする場合
Posted: 2013年12月03日(火) 17:31
by ISLe
VC++で作ったDLLのヒープがC#のガベージコレクションの対象になるかどうかということなら「なりません」という答えになりますかね。
ですが、アプリケーション全体でガベージコレクションの影響が少なくなるかどうかは分からないのではないかと。
例えばいまはJavaで作られるゲームソフトが多くありますが、ガベージコレクションを発生させないように工夫されているものは多いと思います。
そもそも制御系のソフトはもともとメモリの確保・解放を繰り返さないように作られることが多いのではないでしょうか。
むしろデバッガ等でメモリの使用状況を把握しやすくなって開発効率が上がる可能性だってあります。
「経験的に~」という意見が通用する現場ではどうしようもないかもしれませんが。
Re: C#からVC++の関数をコールする場合
Posted: 2013年12月04日(水) 15:43
by eigenvector
みなさん暖かいご指導有難うございました。
よく分かりました。
本当に勉強になりました!