C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[12]: :


(過去ログ 132 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■78124 / inTopicNo.1)  VisualC#にC++の処理した値を渡せるのでしょうか?
  
□投稿者/ エルミン (2回)-(2015/12/16(Wed) 16:28:04)

分類:[.NET 全般] 

C++はどうもVisualを推奨していないようなので
デスクトップに表示されるフォームはC#で作成して
とても重い処理はC++でやってC#に値を渡して
結果をC#のフォームに表示させる事は可能なのでしょうか?
もしよろしければ、やり方か参考文献を教えていただけましたら嬉しいです。

それか、こういう場合はもっと別のいい方法があるよというのであればそちらのご指摘も嬉しいです。
よろしくお願い申し上げます。
引用返信 編集キー/
■78131 / inTopicNo.2)  Re[1]: VisualC#にC++の処理した値を渡せるのでしょうか?
□投稿者/ とっちゃん (317回)-(2015/12/16(Wed) 18:42:10)
No78124 (エルミン さん) に返信
> C++はどうもVisualを推奨していないようなので
> デスクトップに表示されるフォームはC#で作成して
> とても重い処理はC++でやってC#に値を渡して
> 結果をC#のフォームに表示させる事は可能なのでしょうか?
> もしよろしければ、やり方か参考文献を教えていただけましたら嬉しいです。
>
C#のフォームからC++のコードを呼び出す、あるいはその逆は、もちろんできますし
多くのプログラムでそういうことを行っています。
もちろん、そこで何らかのデータをやり取りすることも可能です。

重い処理が何かわからないので細かいところは言及しませんが。。。
(ほとんどの重い処理は、C++に書き直しただけでは改善しません)

C++のコードを呼び出す方法としては、

DllImportを使う(Platform Inovke:プラットフォーム呼び出し)方法
C++/CLI を使って、Managed/Unmanaged の橋渡しをする(データ変換する)方法
COMで実装して呼び出すなどなど。
手法は様々です。


> それか、こういう場合はもっと別のいい方法があるよというのであればそちらのご指摘も嬉しいです。
> よろしくお願い申し上げます。

どういう場合かわからないので別の方法があるかどうかは何とも言えません。

引用返信 編集キー/
■78135 / inTopicNo.3)  Re[1]: VisualC#にC++の処理した値を渡せるのでしょうか?
□投稿者/ Azulean (559回)-(2015/12/16(Wed) 22:18:57)
No78124 (エルミン さん) に返信
> デスクトップに表示されるフォームはC#で作成して
> とても重い処理はC++でやってC#に値を渡して
> 結果をC#のフォームに表示させる事は可能なのでしょうか?

できますが、はじめから C++ ありきで考えるのではなく、C# で実験的にも作ってみて、速度評価してから考えた方が良いかと。
C++ の実装も、C++ と連携する部分も C# 単独に比べると遙かに難しい領域であるため、何も考えずに「前提」としてしまう方が苦しむことになります。
(そして、C++ で変な実装を書くと、C# のシンプルな実装よりも遅いという悲しい結果もあり得ます)
引用返信 編集キー/
■78138 / inTopicNo.4)  Re[2]: VisualC#にC++の処理した値を渡せるのでしょうか?
□投稿者/ ぶなっぷ (64回)-(2015/12/17(Thu) 10:47:51)
あくまで私的感想ですが、速度が問題になるとき考えるべき順序は以下の通り。
 1) 選択したアルゴリズムの見直し
 2) 冗長な処理の見直し
 3) 無駄なオブジェクトコピーの見直し
 4) 使い回しのできるオブジェクトの使い捨てをしない
 5) 使用言語やコンパイルオプション等の環境の見直し

1)はそれが問題になるときは甚大な影響を及ぼします。
よくある例として、コレクションからのデータの検索処理を考えます。
検索条件が毎回決まっているなら、検索条件自体をキーとしたDictionaryを作
成します。
Dictionaryによるハッシュ検索とListの全件回し検索ではループ回数が増える
と恐ろしい速度差になります。
(うさぎとかめどころでは無く、飛行機とミジンコ、いやそれ以上かも)

2)はいろんなパターンがありますが、
1つの例として、ループの外でできる処理をループ中で行っていたりするのを
挙げます。
  foreach(var Item in ItemList)
  {
     string Path = Folder + FileName + "." + Extension;
     [Path文字列を使ってなんか処理]
  }
この例において、パス文字列(Path)はループ中で変わらないものとします。
文字列の+演算は結構重い処理です。ループ回数が増えてくると無視できない
ほど重くなってきます。
  string Path = Folder + FileName + "." + Extension;
  foreach(var Item in ItemList)
  {
     [Path文字列を使ってなんか処理]
  }
としてループの外出しにするだけで軽くなります。
この例は、また、3)の例でもあります。文字列の+演算はオブジェクトのコピ
ーを伴いますので、外出しにするだけでオブジェクトのコピーが減ります。

4)については、オブジェクトをnewして、それがガベージコレクタに回収され
て削除されるまでの一連の処理は結構重い処理です。
ループ中でnewしまくって、次のループで、それらは不要になるような場合、
ループの外でnewして、ループ中ではそのオブジェクトを使い回すだけで済ま
ないかを考えます。

そして、C++とC#の速度差を考えるのは、その次、5)番目くらいだと私は考え
ます。
実装よりも遅いという悲しい結果もあり得ます)

引用返信 編集キー/
■78141 / inTopicNo.5)  Re[3]: VisualC#にC++の処理した値を渡せるのでしょうか?
□投稿者/ 774RR (354回)-(2015/12/17(Thu) 11:26:32)
オイラの実例なんかも挙げてみるテスト

C++ のほうが速かった例
LZSS 圧縮ルーチンを brute force に実装したところ C++ で10秒かかる処理が C# で40秒かかった。

大差なくなった例
同 LZSS 圧縮ルーチンを hash 辞書で実装したところ C++ は4秒 C# で8秒になった

manage/unmanage の境界を marshal する手間とか
native DLL を 32/64bit で使い分ける手間とか
native DLL をインストーラで配布する手間とか
を考えると、後者の状況なら C# only で実装したほうがいいぢゃん・・・という結論になった。

C++ のほうが速いことは多いんだけど、いろんな手間を掛けるほどの差が出る例は稀だと思う。

引用返信 編集キー/
■78146 / inTopicNo.6)  Re[4]: VisualC#にC++の処理した値を渡せるのでしょうか?
□投稿者/ furu (43回)-(2015/12/17(Thu) 13:12:20)
No78141 (774RR さん) に返信
> 大差なくなった例
> 同 LZSS 圧縮ルーチンを hash 辞書で実装したところ C++ は4秒 C# で8秒になった

すみません。横やりです。

C++の方が倍早い、1年かかる処理が半年でできるってことですよね。
差は4倍から2倍になったけれど、「大差」はありますよね。

質問者のプログラムの使う頻度やどれくらいの重い処理かわかりませんが
倍早いなら、手間をかけるほどのプログラムって結構あると思います。
引用返信 編集キー/
■78149 / inTopicNo.7)  Re[5]: VisualC#にC++の処理した値を渡せるのでしょうか?
□投稿者/ 774RR (355回)-(2015/12/17(Thu) 13:35:28)
うむ。
なんだけどそこまで速度が要求されるのなら p/invoke の時間ももったいないので、
最初っから全部 C++ で書いちゃえの世界だと思う。

で、今回元発言者氏は C++ に関しては入門状況らしいので
下手な C++ コードと
上手な C# コードとでは
どっちが速いかわからん。ってのと、

そもそも p/invoke しやすいコードが (C++ 側も C# 側も) 書けるかどうかもわからないので
それなら「今この時点で」高望みせず、全部の処理を C# で実装してみたらどうかな?
ってあたりが現実的な解なんだと思う。

んで熟達してきたら手間を掛けてみるのもまた良しってことで。
引用返信 編集キー/
■78152 / inTopicNo.8)  Re[6]: VisualC#にC++の処理した値を渡せるのでしょうか?
□投稿者/ エルミン (6回)-(2015/12/17(Thu) 20:54:40)
みなさんたくさんのご回答ありがとうございます。
やはりC++はとても有用な感触を受けました。
まだ、私はC++はまだまだわかっていない事ばかりですが
わかるために勉強しようと思っていますので
あまり、今の私の能力を考慮に入れないご感想を頂けましたら幸いです。
引用返信 編集キー/
■78154 / inTopicNo.9)  Re[7]:
□投稿者/ Azulean (560回)-(2015/12/17(Thu) 22:03:04)
2015/12/17(Thu) 22:19:40 編集(投稿者)

No78152 (エルミン さん) に返信
> あまり、今の私の能力を考慮に入れないご感想を頂けましたら幸いです。

私の意見はあまり変わらないです。

C++ にこだわる必要がある場面は少なくなってきています。
生産性の高い C# の方が少ない時間で作れることが多いですので、C++ ではないとできないとか、C# で検証コードを書いて明確に遅いとかなければ、C# でいきますね。

このスレッドの例にあった、2 倍の差も、その処理をする頻度や分量が少ないのであれば C# でいく感じです。
そこへこだわるためにかかる手間(工数・費用)に対して、得られる効果が少ないという判断からです。
(C++ はレビューも難しく、不具合が埋め込まれるリスクも高く、検証過程も加味すると、得しない場面の方が多い印象。実際、業務においても C++ で新規コードを書くことは許可制として原則 C# としているぐらい。)
引用返信 編集キー/
■78156 / inTopicNo.10)  Re[8]: :
□投稿者/ furu (45回)-(2015/12/17(Thu) 23:06:51)
c#で画面作って、C++,C,アセンブリ言語などで
どうしても速度をあげなきゃならないなら
別のプログラム(exe)とし、パラメータや結果データは
ファイル渡しで行いますかね。

引用返信 編集キー/
■78159 / inTopicNo.11)  Re[9]: :
□投稿者/ PANG2 (97回)-(2015/12/18(Fri) 10:27:17)
C# unsafeコード
http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_021/csharp_abc01.html

でパフォーマンス向上する場面があるのでは?

# 経験談聞きたい

引用返信 編集キー/
■78161 / inTopicNo.12)  Re[10]: :
□投稿者/ とっちゃん (319回)-(2015/12/18(Fri) 11:41:51)
No78159 (PANG2 さん) に返信
> C# unsafeコード
> http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_021/csharp_abc01.html
>
> でパフォーマンス向上する場面があるのでは?
>
> # 経験談聞きたい
>
経験談じゃないですけど、実例ということでw

昨日C#のソース(かれこれ1年以上前にDLした奴)のbase64の実装で使われてるのを見ました。
身内で、C++でbase64の実装ない?と聞かれたときに。

実装見た瞬間、.NET Framework(ライブラリ)はそこまでやってるのね!と思いました。
これ、該当箇所だけ張り付けて、言語をあててください!って言ったら何割かの人はC++/CLIと間違えそうなくらいには
がっつりとポインタでメモリ操作してました。

引用返信 編集キー/
■78163 / inTopicNo.13)  Re[10]: :
□投稿者/ みい (37回)-(2015/12/18(Fri) 12:59:04)
No78159 (PANG2 さん) に返信
> C# unsafeコード
> http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_021/csharp_abc01.html
>
> でパフォーマンス向上する場面があるのでは?
>
> # 経験談聞きたい
>
パフォーマンス云々無視でちょこっとだけポインタ使いたい時使ってます。
がっつり使いたい時やmemcmpとか使ってがんがん処理書きたい時はCLI。
2005環境あるのでForm作れますし(ふとした拍子にデザイナ表示できなくなりますけど)。
引用返信 編集キー/
■78164 / inTopicNo.14)  Re[11]: :
□投稿者/ 774RR (357回)-(2015/12/18(Fri) 13:15:08)
この辺っすね
http://referencesource.microsoft.com/#System.Runtime.Serialization/System/Text/Base64Encoding.cs,7793735e9a6ed4ca

オイラの LZSS 圧縮ルーチンが遅いのは配列の indexer がいちいち範囲チェックするせいなので
unsafe にしたら高速化するような気もします。

C# しか使ったことないプログラマに unsafe を使わせるのはオイラ的には却下。
既に C/C++ に熟達していてポインタ演算をヘマしないプログラマなら unsafe はアリ。
かな・・・
引用返信 編集キー/
■78165 / inTopicNo.15)  Re[11]: :
□投稿者/ WebSurfer (743回)-(2015/12/18(Fri) 13:29:42)
質問者さんの場合は、仕事ではなく学習とか趣味の問題のようなので、それなら
C++ でも unsafe でもアセンブラでも機械語でも何でもアリと思います。
引用返信 編集キー/
■78204 / inTopicNo.16)  Re[12]: :
□投稿者/ エルミン (8回)-(2015/12/21(Mon) 22:50:40)
みなさんたくさんのご回答ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -