【.NET】 C++/CLI について語ろうぜ 【最適】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/09/11(日) 23:54:01であろうC++/CLIについて語ろうぜ!
0322デフォルトの名無しさん
2005/12/09(金) 22:55:340324デフォルトの名無しさん
2005/12/09(金) 23:06:31> つーことはやはり呼び出し負荷でしょう。
それ言うなら、
> もちろんループ回数も同じで測定している。
回数変えてファクターが何か調べないと。面白い奴だな(w
0325310
2005/12/09(金) 23:10:53回数変えたら実行秒数が比例するけど。
my_stricmpにしてネイティブと差が無いわけだから、違いは
標準ライブラリの呼び出し以外に何か考えられる?
0326デフォルトの名無しさん
2005/12/09(金) 23:20:290327310
2005/12/09(金) 23:27:29何を言ってるのか分かりませんが、
具体的に他にファクターがあるならあげてみて欲しい。
こちらの比べ方に抜けがあるならそこを指摘してくれまいか。
0328デフォルトの名無しさん
2005/12/09(金) 23:31:27まぁ、とりあえず、時間の出たマシンのスペックを教えてちょ
問題になっているのは、msvcm80.dll 辺りかな
0329デフォルトの名無しさん
2005/12/09(金) 23:54:07325に比例するとは書いてあるけど、比例にもいろいろあるだろうに。
0330デフォルトの名無しさん
2005/12/10(土) 00:00:17比較のサンプルソースを出すね
C++/CLI
int main(array<System::String ^> ^args)
{
const char *buff = "buffer";
const char *check = "Test";
DateTime dt = DateTime::Now;
for ( int i=0; i<2000000; i++ )
{
//strcmp(buff,check);
mycomp(buff, check);
}
DateTime endTm = DateTime::Now;
Console::WriteLine("Time : {0}", endTm - dt);
return 0;
}
int mycomp(const char* before, const char* after)
{
while(*before++==*after++) if(before[0] == 0) return 0;
return -1;
}
これで、strcmp とmycompを切り替えるだけで、全然速度が違う。なじぇ?
0331デフォルトの名無しさん
2005/12/10(土) 00:19:190332デフォルトの名無しさん
2005/12/10(土) 00:28:24int mycomp(,,,) の前に #pragma unmanaged を置いてみるとどうなりますかね?
0333330
2005/12/10(土) 00:53:42before をちゃんとチェックすると、だいたい16秒でstrcmpと変わらない
むしろ、ネイティブだと一瞬なんで、処理に時間がかかる理由が気になる
0334330
2005/12/10(土) 01:08:50mycompにすると一瞬で終わるね。もうちょっと、関数の実装をちゃんとするべきなんだろうけど
ネイティブに記述された関数はネイティブで処理されてる。となると、C標準関数が問題
なのか・・・
0335310
2005/12/10(土) 08:50:45>回数を2倍にしても実行時間が2倍になるとは限らない。
それは比例じゃないと思うけど。
言葉どおり比例と受け取って欲しい。
だからループ外のファクターでは無いと思う。
>>334
マシンの速度が分からないけど、200万回のループで16秒もかかる?
あと、strcmpだとこちらではCLIでもネイティブと同じだった。
stricmp,lstrcmpで、ネイティブとの差が2億回のループで10秒。
差が同じなので、処理内容の問題でも無いと思う。
こちらのマシン速度は>>313です。
0336310
2005/12/10(土) 10:00:02言葉が足んなかった、すまん。ax+bのbの部分はごく小さいと思って欲しい。
>>332
試してみた。
CLIでmy_stricmpをunmanagedプラグマで囲ったら、少しだけ遅くなった(3秒くらい)。
囲わなかった場合、今朝計り直してみたら1秒未満。
0337デフォルトの名無しさん
2005/12/10(土) 10:26:32i<500000、i<1000000、i<2500000も取ってグラフをプロットするわけ。
あと、*cmp("abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz")と、
*cmp("buffer", "Test")で比較するとかさ。
関数呼び出しのオーバーヘッドをみたいなら、
関数内の処理を軽くしたり重くしたりして違いを見るのが定席だろ?
strcmpとmycompじゃ実装が全然違うわけだから、そのくらいはしないと、
呼び出しがオーバーヘッドになっているかどうか分からない。
一文字目の比較で関数が返るから、関数呼び出しの差を見えると思ったかもしれないが、
ソースのない方はもしかしたらNULLチェックしているかもしれないし、
タコなコーディングかもしれない。
分からないはずなのに安易に結論づけているから、スルーされてる。
表計算ソフト、数式処理ソフト、グラフプロットツールあれば簡単にグラフ化できるよね。
0338デフォルトの名無しさん
2005/12/10(土) 10:37:480339310
2005/12/10(土) 10:56:43単純化しただけであって、回数そのものは突飛でもない。
俺が問題にしてるのはCLIで標準関数呼び出しが遅い
ということ。>>337のいうようにちゃんとやることも出来るが、
そこまでやら無くても「CLIで標準関数呼び出しが遅い」のは
今までの例で明白じゃない?
0340デフォルトの名無しさん
2005/12/10(土) 11:15:41自分で言ってるけど、strcmp でネイティブと違いがないなら「CLIで標準関数呼び出しが遅い」
とは言えないんじゃない?
0341デフォルトの名無しさん
2005/12/10(土) 11:28:40明白かどうかわかんないから粘着してんじゃないの?
他のファクターを探す手助けにもなるんだから手抜かずにやれば?
0342デフォルトの名無しさん
2005/12/10(土) 11:32:24漏れ、turion M37 2000 相当で以下のソースで1億回廻したけど、8秒ほどかかった
メモリも800MBほど食べた
int _tmain(int argc, _TCHAR* argv[])
{
const char *a = "sample text a";
const char *b = "sample text b";
std::vector<int> results;
time_t stm = 0;
time(&stm);
for ( unsigned long int i=0; i<100000000; i++ )
{
results.push_back(strcmp(a, b));
}
time_t etm = 0;
time(&etm);
std::cout << "Result : " << etm - stm << " Size : " << results.size() << std::endl;
return 0;
}
0343342
2005/12/10(土) 11:37:56ちなみに、/clr では同等のソースで11秒だった
0344310
2005/12/10(土) 11:38:06遅まきながらステップしてみた。
strcmpはCLIでもインライン展開されていた。
stricmpはcallされていて、スタックトレースウインドウに
マネージからネイティブへ以降、と表示される。
0345342
2005/12/10(土) 11:48:28CLR native
strcmp 11s 8s
stricmp 16s 13s
lstrcmp 20s 17s
なんか、綺麗な結果になった。CLR の起動コストとかで +3s ぐらい
0348デフォルトの名無しさん
2005/12/10(土) 12:39:12それはなかった。何らかのコストがかかっているのは確かみたい
CLR 側のやつはDateTime とか Console::WriteLine を使っていたので、ソースを完全に
同一にすると、
lstrcmp 19s 17s
になった。1億回のループでこれだから、あとはパフォーマンス・カウンタでも使わないと
細かくはわからない領域だと思う
ちなみにいろいろと切って静かに取ってみたら
CLR Native CLRx64 Nativex64
lstrcmp 16s 14s 15s 12s
なんて結果になった
0349310
2005/12/10(土) 12:52:57342のソースはSTLの負荷が大きいのと、strcmpはインライン化されて
マネージ、ネイティブの切り替えは見えにくくなってると思う。
だから純粋にネイティブとCLIの差じゃなかろうか。
STLとっぱらってstricmpとかだけにしたらこちらの結果と
相似に近いのが出るんじゃないかな。
STLはマネージ側で実行されるんでしょ? だからネイティブとの
大きな差にはならないんじゃないのかと。←こっちより差が小さいから
0350デフォルトの名無しさん
2005/12/10(土) 12:59:11んにゃ。STLはネイティブだよ。ループで代入しているのは、最適化でループ自体が外される
のを防ぐため
しかし、CLRx64 にはもうちょっとがんがってほすぃ
0352デフォルトの名無しさん
2005/12/10(土) 13:05:46それはジェネリクスを利用した STL.NET と混同してるんじゃないかな
しかし、+2秒はいったい何をしているのだろう
0353デフォルトの名無しさん
2005/12/10(土) 13:18:58List<int>^ results = gcnew List<int>;
time_t stm = 0;
time(&stm);
for ( unsigned long int i=0; i<100000000; i++ )
{
results->Add(lstrcmp(a, b));
}
time_t etm = 0;
time(&etm);
std::cout << "Result : " << etm - stm << " Size : " << results->Count << std::endl;
CLR Native CLRx64 Nativex64
lstrcmp 13s 11s 12s 9s
なかなか、よい結果です
0354デフォルトの名無しさん
2005/12/10(土) 22:23:25数学苦手だった人?
0355デフォルトの名無しさん
2005/12/10(土) 22:28:520356デフォルトの名無しさん
2005/12/11(日) 00:48:46スゲーな
0357デフォルトの名無しさん
2005/12/11(日) 03:32:29managedC++は?
0358デフォルトの名無しさん
2005/12/11(日) 04:57:420359デフォルトの名無しさん
2005/12/11(日) 05:03:060360デフォルトの名無しさん
2005/12/11(日) 07:55:17C#やVB.NETでも使えるP/Invokeに比べて、
importlibで呼び出す場合はかなりパフォーマンスがよかった。
単純なNativeコードのDLLを作り繰り返し交互に呼び出すテストで、
かかった時間はP/Invoke 24, importlib 3
nativeコードからimportlibを使っての呼び出し 1.5 の比率。
DLLを作らずobjのリンクの場合、native-nativeで1、managed-nativeで2.5。
というわけでC++/CLIの存在意義はmix modeにあると思っている。
0361デフォルトの名無しさん
2005/12/11(日) 07:58:58cl /clr
cl /clr:oldSyntax
ってやってみな
0362デフォルトの名無しさん
2005/12/11(日) 08:05:27つか、今時Win32 APIをコールする必要があるか???
0363デフォルトの名無しさん
2005/12/11(日) 08:56:210364デフォルトの名無しさん
2005/12/11(日) 10:14:33まだ大いにあるよ。
0365デフォルトの名無しさん
2005/12/11(日) 10:49:56君にはない。
0366デフォルトの名無しさん
2005/12/11(日) 11:11:19今時っていうか、今程度の.netじゃ、
まともなWindowsプログラミングやるならWinAPI叩かざるを得ない。
0367デフォルトの名無しさん
2005/12/11(日) 12:15:190368デフォルトの名無しさん
2005/12/11(日) 19:40:02そうか〜?
.NET Frameworkのクラスライブラリだけですべて作れますけど・・・
0369デフォルトの名無しさん
2005/12/11(日) 20:06:45・IME
・Caret
・ScrollWindowEx
0370デフォルトの名無しさん
2005/12/11(日) 20:08:00初心者スレ行けばw
0371デフォルトの名無しさん
2005/12/11(日) 20:15:13あほか。流れ嫁。API呼ばなきゃいけない問題だ。かす。
0372デフォルトの名無しさん
2005/12/11(日) 20:22:17初心者スレ行けばw
0373デフォルトの名無しさん
2005/12/11(日) 20:29:00SHFileOperation
VBのMyを使えとか言ったら刺す。
0375デフォルトの名無しさん
2005/12/11(日) 22:21:02FileDialogのカスタマイズ
0376デフォルトの名無しさん
2005/12/12(月) 00:10:36初心者スレ行けばw
0377デフォルトの名無しさん
2005/12/12(月) 01:51:23MSはどうするつもりなんだろう
0378デフォルトの名無しさん
2005/12/12(月) 09:21:360379デフォルトの名無しさん
2005/12/12(月) 23:05:18ありふれた業務アプリ程度ならそれほど困ることもないけど、
ちょっとばかしシステムに寄った途端にできないことが増える。
原因が(専ら機能面とは何の関係もない)くだらない要求だったりして
余計に萎えるというおまけが付くこともよくある。
>>377
とりあえず使い物になるVer.3を出せと言いたい。
0380デフォルトの名無しさん
2005/12/13(火) 09:00:43>余計に萎えるというおまけが付くこともよくある。
あるあるww
0381デフォルトの名無しさん
2005/12/13(火) 15:22:20正直賛同できません。
0382デフォルトの名無しさん
2005/12/13(火) 17:15:190383デフォルトの名無しさん
2005/12/13(火) 20:46:500384デフォルトの名無しさん
2005/12/13(火) 21:47:520385デフォルトの名無しさん
2005/12/14(水) 17:36:34あれは言語一緒だしね…
0386デフォルトの名無しさん
2005/12/15(木) 05:37:15作らないといけないことだけが先行してるのが萎える。市場に対して
新規性を謳うことだけが最重要課題なんだよな。
0387デフォルトの名無しさん
2005/12/15(木) 20:41:33http://www.ecma-international.org/publications/standards/Ecma-372.htm
0388デフォルトの名無しさん
2005/12/16(金) 00:54:500389デフォルトの名無しさん
2005/12/16(金) 00:59:57C++/CLIだってきっと
0390デフォルトの名無しさん
2005/12/16(金) 08:57:140391デフォルトの名無しさん
2005/12/16(金) 10:32:21ISO/IEC 23271:2003
0392デフォルトの名無しさん
2005/12/16(金) 10:56:26http://www.plumhall.com/ecma/
http://msdn.microsoft.com/visualc/homepageheadlines/ecma/default.aspx
0393デフォルトの名無しさん
2005/12/19(月) 23:38:22に「VC++ExpressEditionは標準C++を学習するための優れた教材である 」
てあるけど、そうなの?
.NETのWindowsアプリ作るものかとおもってたよ。
0394デフォルトの名無しさん
2005/12/20(火) 00:04:060395デフォルトの名無しさん
2005/12/20(火) 02:58:190396デフォルトの名無しさん
2005/12/20(火) 09:38:58それからC++でドトネトすると飛んでも文法だし、
大体MFCはキショイというのが定説。
0397デフォルトの名無しさん
2005/12/20(火) 13:40:38VC++(というIDE)を使ってなかった人も使い出したりするんだろか?
0398デフォルトの名無しさん
2005/12/20(火) 20:36:350399デフォルトの名無しさん
2005/12/20(火) 22:31:590400デフォルトの名無しさん
2005/12/20(火) 23:47:53押し付けられたとか思い込まないように
0401デフォルトの名無しさん
2005/12/21(水) 14:50:12C++復権すると思う?
0402デフォルトの名無しさん
2005/12/21(水) 15:45:19>代替プログラム言語になり得る第1候補はVisual Basicです。
0403デフォルトの名無しさん
2005/12/21(水) 20:16:06復権もなにも
C++で記述できないプログラムはないんだから・・・
0404デフォルトの名無しさん
2005/12/21(水) 20:22:13それは今のCPUがC言語を動かすことを前提としてる面も大きいと思う
0405デフォルトの名無しさん
2005/12/21(水) 20:28:41意味不明
0406デフォルトの名無しさん
2005/12/21(水) 20:32:45他にC言語で簡単に扱えないメモリレイアウトを要求しないとかさ。
0407デフォルトの名無しさん
2005/12/21(水) 21:27:10> 0番付近がNULL対策に実メモリを割り当てないようになってたりするじゃん
これはOSの問題という側面のほうが大きいと思う。
別にC/C++ではヌルポインタのビットパターンは0でなくとも良いとなっている。
> 他にC言語で簡単に扱えないメモリレイアウトを要求しないとかさ。
そんなもん誰も要求していない。
0408デフォルトの名無しさん
2005/12/22(木) 07:22:14x86のI/Oポートは「C言語」では叩けないよ。
喪前様が言ってるのは、例えるなら、見かけの現象だけで
「太陽は地球を回っている」と言ってるのと同じこと。
言語側から見るだけじゃ、本当の意味では計算機は理解できない。
計算機の基礎から勉強したほうがいい。
0409デフォルトの名無しさん
2005/12/22(木) 08:14:090410デフォルトの名無しさん
2005/12/22(木) 10:44:15「brainfuck復権すると思う?」
「復権も何も、brainfuckで記述できないプログラムはないんだから……」
0411デフォルトの名無しさん
2005/12/22(木) 10:48:17いまだにつかっていますが、なにか?
0412デフォルトの名無しさん
2005/12/23(金) 07:42:22brainf*ck.NET
0413デフォルトの名無しさん
2005/12/27(火) 11:36:51ソースコードキボン
0414デフォルトの名無しさん
2005/12/27(火) 21:13:530415デフォルトの名無しさん
2005/12/28(水) 10:29:47C++/CLI で boost.spirit 使って手軽に構文解析モジュール作成して、
VB.NET から参照設定で呼び出す
ってことが簡単に出来るならすばらしいことだと思うよ。
0416デフォルトの名無しさん
2005/12/28(水) 10:32:23現実はJ#は開封もされない事実。
ブビ厨はC貧を嫌い、C貧はブビ厨を嫌う。
M$の理想は宣伝専用。
0417デフォルトの名無しさん
2005/12/29(木) 00:42:11普通にできるけど?
0418デフォルトの名無しさん
2005/12/29(木) 05:23:34using (FileStream fs = new FileStream("test.txt", FileMode.Read)) {
}
C++/CLIでうまくかけるんですか?
FileStreamをスタックみたいにして作れると思ったんですが、できないのでしょうか?
0419418
2005/12/29(木) 05:25:150420デフォルトの名無しさん
2005/12/29(木) 17:16:57入門するようなもんじゃねぇだろ?
C# を先に勉強した方がいいぞ
0421デフォルトの名無しさん
2005/12/29(木) 20:22:02■ このスレッドは過去ログ倉庫に格納されています