10/01/31 11:12:50
無いし実際同じ
951:デフォルトの名無しさん
10/01/31 11:22:21
C++/CLI はネイティブコードで書いた部分の実行速度が速いからとかじゃ?
952:デフォルトの名無しさん
10/01/31 11:38:51
ボックス化された値型とかトラッキング参照とか駆使して低レベルな最適化をやれば速くなるかもしれないけど
JITのバージョンアップであっさり逆転したりしそうだ
953:デフォルトの名無しさん
10/01/31 22:47:30
検証に使用したコードがないと話にならんだろ。
954:デフォルトの名無しさん
10/01/31 22:51:54
C#よりもC++/CLIの方ができることの制限が少ないから、速いコードを書くこと余地は大きいだろうね。
C++はUnsafeだから、こういうのを単純に比較しても意味ないと思うんだけどな。
955:デフォルトの名無しさん
10/01/31 23:03:35
一般に将来的な最適化の妨げになるしなあ
956:デフォルトの名無しさん
10/02/01 03:06:48
C++/CLIの速さはこの2つを足して2で割ったところとしているんでしょ。
マネージ部分の速さ = C#, VB.NET
ネイティブ部分の速さ = C++
957:デフォルトの名無しさん
10/02/01 09:17:41
まあアンマネージだけで書いたらC++もC++/CLIも変わらんわな
マネージだけで書いたらC++/CLIもC#も変わらんわな
測ってないけど
958:デフォルトの名無しさん
10/02/01 10:42:19
くだすれ落ちているのでここで失礼します。
unmanagedなバイト配列(unsigned char* byteArray, int len)を
managedな配列(array<Byte>)に変換したいと考えています。
とりあえずインデクサをつけて一個一個代入していったり、
Addしてみたりしたのですが、随分と処理に時間を喰ってしまいます。
そこまで速度に神経質なプログラムでも無いのですが、
もっとスマートに配列を変換する方法は無いものでしょうか。
959:デフォルトの名無しさん
10/02/01 11:29:42
Marshal.Copy(IntPtr, byte[], int, int) とか。
960:958
10/02/01 12:04:10
>>959
Marshal探せば良かったんですね。
Managedメモリを固定して確保してからmemcopyとか、明後日の方向に向かって努力していました……。
どうもありがとうございました。
961:デフォルトの名無しさん
10/02/02 03:10:27
C++/CLIは/clr /clr:pureでは常にunsafeであり、
Cタイプの配列を使った場合のパフォーマンスが良い。1~2割程度。
C++/CLIの暗黙のP/InvokeはSuppressUnmanagedCodeSecurityAttributeがデフォルトでオンなので、
C#のP/Invokeに対してパフォーマンスが良い。2~3倍程度。
C#のP/InvokeにSuppressUnmanagedCodeSecurityAttributeを追加するとその差はなくなる。
またC++/CLIのリンク時に/CLRUNMANAGEDCODECHECKを付けると、
この属性がオフになるためパフォーマンスはC#と変わらなくなる。
962:デフォルトの名無しさん
10/02/02 21:49:51
C#でも一応スタックに配列取ったりマネージ配列やアンマネージ配列にポインタでアクセスしたりできるよ
963:デフォルトの名無しさん
10/02/02 22:10:43
マネージドで書いとけばいいのにやたらアンマネージド呼び出して
結果マーシャリングコストばっかりかかってパフォーマンス悪化とか、ありそうな話