C#, C♯, C#相談室 Part42
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/08/26(日) 12:42:25前スレ
C#, C♯, C#相談室 Part41
http://pc11.2ch.net/test/read.cgi/tech/1184840053/
過去スレは>>2-5あたり。
0233デフォルトの名無しさん
2007/09/03(月) 01:25:22体感できるほど遅くなるアプリなら最初からネイティブしか選択肢ないし
そんなんめったに書くことない
0234デフォルトの名無しさん
2007/09/03(月) 01:25:22早いとか、遅いとかって言ってる奴は、証拠のソースを出せよ
だってさ
PerlもPythonも、コンパイル時に正規表現のコンパイルと最適化をしている
C#やJavaは実行時
どうやってコンパイルと最適化に消費する処理時間を考慮するの?
0235デフォルトの名無しさん
2007/09/03(月) 01:27:24速いことより、遅い方がいいことってあるのかしらん?
0236デフォルトの名無しさん
2007/09/03(月) 01:27:52C#は安全性を気にして余計な処理をしてるだろ
Cとかと比べたらどうしたって遅くなる
0237デフォルトの名無しさん
2007/09/03(月) 01:28:44速度の違いが体感出来ないならC#使ってもデメリットはない
プログラミングが楽になるからC#使った方がいいというわけだな
0238デフォルトの名無しさん
2007/09/03(月) 01:29:28そりゃJITだけどCにゃ負けるようだよ
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=all
これはMonoだが、Java Server VMの性能が参考になるだろう
0239デフォルトの名無しさん
2007/09/03(月) 01:32:20大体.NETは実行スピードと生産性のバランスの中のひとつの解に過ぎないだろ
0240デフォルトの名無しさん
2007/09/03(月) 01:34:25起動がのろいのとGUIもっさりはどうしようもねぇな
0241デフォルトの名無しさん
2007/09/03(月) 01:36:40やっぱり法螺吹きか
0242デフォルトの名無しさん
2007/09/03(月) 01:37:14CLIランタイムをロードする時間に比べりゃ、正規表現のコンパイルにかかる時間など
微々たるもんだろw
0243デフォルトの名無しさん
2007/09/03(月) 01:38:130244243
2007/09/03(月) 01:38:590245デフォルトの名無しさん
2007/09/03(月) 01:41:19DDBのblitはGDI+の10倍は速いらしいな
その時点でWinFormsだめぽ
0246デフォルトの名無しさん
2007/09/03(月) 01:45:05そんなに気になるんなら自分でためせばいいのに
以前俺が実験したソースをあげるよ
ttp://www.borujoa.org/upload/source/upload14325.zip
青空文庫のテキストを適当に置換するプログラム
inputというフォルダにサンプルの入力ファイルがあるが、300K程度の
サイズだから、気になるならデカくしてみるんだね
0247デフォルトの名無しさん
2007/09/03(月) 01:53:14それはあくまで作る側の屁理屈
使う側からすれば、生産性なんてどうでもいい
あなたが、よく使うアプリケーションが次バージョンから.NETで書かれたらどう思う?
LightWaveが.NETなんかで書かれたら俺は間違いなくMAXへ移行する
0248デフォルトの名無しさん
2007/09/03(月) 01:57:26えーとね、生産性悪くなるとコストがかかるんだよ。
それは製品価格に反映されたり、次バージョンで実装される機能が少なくなったりすることになるんだよ。
0249デフォルトの名無しさん
2007/09/03(月) 02:05:21なんでアセンブラでつくらねーんだっていってみろ。
0250デフォルトの名無しさん
2007/09/03(月) 02:06:39C#がバランス上最適解かどうかだろうなw
0251デフォルトの名無しさん
2007/09/03(月) 02:06:52機能も少なくなるぞ。
品質が下がることもあるぞ。
0252デフォルトの名無しさん
2007/09/03(月) 02:07:02C#しかつかないやつはVC++で開発してる部署に行ったらほぼ終わり
0253デフォルトの名無しさん
2007/09/03(月) 02:07:34絶対にLL言語に遅れをとらない言語ってなんだよw
0254デフォルトの名無しさん
2007/09/03(月) 02:09:300255デフォルトの名無しさん
2007/09/03(月) 02:14:15・300kのIO速度の計算をスルー
・300kのSJISから内部コードの変換(UTF-16やutf8)コストもスルー
・(C#)2000行の無駄なnew StringBuilderとToString、+演算子置き換えで高速化
正規表現のベンチになってないよ
0256デフォルトの名無しさん
2007/09/03(月) 02:17:16うん、正確な正規表現のベンチのつもりで書いたのではないよ
それが求めるものなら自分でやってくれ
IO処理は「どの言語でも」やっている
ユニコードへの変換も「どの言語でも」やっている
オーバーヘッドの大きそうなフォーマット処理も、PerlやPythonでもやっている
概ね、カリカリに書かずに適当に同じレベルで「普通に」書きなぐったものだ
特に何かをひいきしたつもりは無い
そうやって書いたものが、スクリプトが案外速かった(C#より速い)ってのが
重要ね。
0257256
2007/09/03(月) 02:28:23ソースを見れば分かるが、LL言語で書くよりずっと複雑でトリッキーで
エラーを産みがちなコードになるというのに。
こんな仕事はLL言語向きだ。他の解は馬鹿げている。そう思ったよ。
そして、そういう仕事は案外多いのだと思う。
0258デフォルトの名無しさん
2007/09/03(月) 02:37:29C#、C++、Perl、Pythonではエンジンの起動時間は大きく違うし、
いくらなんでも、これで決めつけるのは早計だと思うが。
俺のPCでは、C#の方がPerlより速かったり遅かったりだった。
一瞬すぎて測れない。
Core 2 Duo E6600, 2GB, Win Vista
Super Fetchがどこまで効いているかはわからない。
明日kwsk調べようかな。
0259デフォルトの名無しさん
2007/09/03(月) 02:45:500260デフォルトの名無しさん
2007/09/03(月) 02:46:280261256
2007/09/03(月) 02:54:56入力ファイルデカくしてみそ
二回目以降はキャッシュが効くし、入力が十分デカければ起動時間は誤差の範疇に
持ち込めると思うが
ちなみに俺の環境はXP、Pentium M(1.7GHz), RAM 500Mだからずっとショボい
>>259
純粋に正規表現エンジンの性能を計りたいんなら、そうだね
俺がやったのは、正規表現を用いた典型的なPerlの使い捨てスクリプトレベルの
仕事を各種の言語で書いてみた、それだけのことで、やっている仕事自体は
どの言語でも同じだよ
0262デフォルトの名無しさん
2007/09/03(月) 03:15:340263デフォルトの名無しさん
2007/09/03(月) 05:29:410264デフォルトの名無しさん
2007/09/03(月) 09:15:08ご回答ありがとうございます。
そんなことを頻繁にするかどうかは知らんよ。
俺がちゃんとわかってる人かどうかは
あんたが決めることじゃねえよ。スキルチェックでもしてくれ。
0265デフォルトの名無しさん
2007/09/03(月) 10:34:360266デフォルトの名無しさん
2007/09/03(月) 11:35:590267デフォルトの名無しさん
2007/09/03(月) 11:39:140268デフォルトの名無しさん
2007/09/03(月) 12:30:180269デフォルトの名無しさん
2007/09/03(月) 12:58:350270デフォルトの名無しさん
2007/09/03(月) 13:29:490271デフォルトの名無しさん
2007/09/03(月) 14:01:15なんでこんな制限があるんだ?
コレクションに変更を加えるわけじゃないし問題ないと思うんだけど。
0272デフォルトの名無しさん
2007/09/03(月) 15:49:14test_i(i=1,2,3・・・)みたいな。
0273デフォルトの名無しさん
2007/09/03(月) 15:54:200274デフォルトの名無しさん
2007/09/03(月) 16:06:14たとえば
string[] strArray = new str[]{"a","b","c"]
foreach(string str in strArray)
{
s="d"
}
ってやってもstrArrayには反映されない。
foreachの列挙子はIEnumerableの実装いかんによっては、何を
参照しているのか全く保障されない。
IEnumeratorは上記の例のようにコピーを返してくるかも知れない。
あと、IEnumuratorの実装クラスは「列挙」できればよく、要素の概念
を持たないものだってあるからね。
MSDNのIEnumerableのサンプルをみてみそ。
0275デフォルトの名無しさん
2007/09/03(月) 16:30:21「変数の使いまわし」ができないようにするのが最近の流行だから。
バグが減ると信じられてる。
0276デフォルトの名無しさん
2007/09/03(月) 16:36:34while(strEnumerator.MoveNext())
{
string str = strEnumerator.Current;
...
}
こんな感じでしょ
代入しても無意味というか、元が配列だったりすると
書き換えられるという錯覚を与えかねない
というか配列のforeachは
for(int i = 0; i < strArray.Length; ++i)...
に置き換える最適化がされるらしいから
実際に書き換えられちゃうんでそうするとforeachの意味が変わっちゃう
0277271
2007/09/03(月) 16:55:47>>276
foreach変数ってIEnumeratorの実装に関わらずスタック上に置かれるものでは。
構文上もそこで宣言してるわけだし、直接書き換えられると誤解される余地もないと思うけど。
>>275
それで余分な変数を導入する方が場合によっては可読性が落ちると思うんだけどなあ。
というかforeach変数だけ禁止しても意味がないような・・・
0278デフォルトの名無しさん
2007/09/03(月) 17:01:33たしか、usingとかfixedとかで宣言した変数も使いまわしできないな。
0279デフォルトの名無しさん
2007/09/03(月) 17:55:020280デフォルトの名無しさん
2007/09/03(月) 19:45:58配置されるかのイメージがつかめてないだけの気がする。
>>275は意味不明だと思う。
繰り返し変数はもとの変数のビットイメージのコピーであってもとの変数そのものではない。
これが理解できていれば271はそもそも愚問であって、こんな疑問は抱きようがないんじゃないか?
0281デフォルトの名無しさん
2007/09/03(月) 19:55:24271はforeachでコレクションの内容を変更したいんじゃなくて、例えば
//引数に与えられた値+2を返すメソッド
int Plus2(int value){
value += 2;
return value;
}
みたいなことをforeachの繰り返し変数でもやりたいんだろ
0282デフォルトの名無しさん
2007/09/03(月) 20:13:55return value + 2;
}
でいいじゃん
0283デフォルトの名無しさん
2007/09/03(月) 20:20:090284デフォルトの名無しさん
2007/09/03(月) 20:20:500285デフォルトの名無しさん
2007/09/03(月) 20:22:57変に例える必然性なんて全然ないのにね。
0286デフォルトの名無しさん
2007/09/03(月) 20:24:320287デフォルトの名無しさん
2007/09/03(月) 20:26:090288デフォルトの名無しさん
2007/09/03(月) 20:26:40あるいは逆にコレクションに変更を加えようとしてミスるプログラマが出るのを予防するためだな。
D言語ではforeachの制御変数には明示的にrefキーワードをつけないと、代入できないようになってる。
0289デフォルトの名無しさん
2007/09/03(月) 20:30:550290デフォルトの名無しさん
2007/09/03(月) 20:33:54そんなアホグラマは正直無視でいい・・・
と思うのは俺だけ?
だってそんなこといったら仮引数だって変更不可にするべきじゃん
0291デフォルトの名無しさん
2007/09/03(月) 20:42:45int opApply(int delegate(ref T));というメンバ関数を実装する。
http://www.kmonos.net/alang/d/statement.html#ForeachStatement
>>290
Dでは仮引数にinキーワード(あるいは、finalキーワード)を追加することによって、仮引数への代入が制限されますよ。
要するに、最近は酔っ払いでも使えるような言語設計が流行っているのだ。
0292デフォルトの名無しさん
2007/09/03(月) 20:50:440293デフォルトの名無しさん
2007/09/03(月) 21:01:280294デフォルトの名無しさん
2007/09/03(月) 21:45:38foreach (Hoge h in Hoges) {
h = new Hoge(); // はダメでも
h.Member = 123; // は全然OKだから
あまりガードにはなってないよね。
0295デフォルトの名無しさん
2007/09/03(月) 21:55:270296デフォルトの名無しさん
2007/09/03(月) 22:11:00なんかって何?一言主さん
0297デフォルトの名無しさん
2007/09/03(月) 22:13:01キャッチしなきゃいけない例外も必要だろ
C#はそういうのが意図的に外されてるんだな
意味ないから
0298デフォルトの名無しさん
2007/09/03(月) 22:15:50// cl /EHsc
#include <vector>
#include <iostream>
int main() {
std::vector<int> v;
v.push_back(1); v.push_back(3); v.push_back(5);
for each(int r in v) {
r++; // OK
std::cout << r << std::endl;
}
for each(const int r in v) {
r++; // Error
std::cout << r << std::endl;
}
}
0299デフォルトの名無しさん
2007/09/03(月) 22:18:01いや、チェック済み例外は明らかに設計ミス。
0300デフォルトの名無しさん
2007/09/03(月) 22:21:40絶対に間違いが起きる可能性がある処理はあるわけじゃない
そういうのをどうやって実装すればいいの
0301デフォルトの名無しさん
2007/09/03(月) 22:27:25済むことじゃないの?
まあ、それ以前にドキュメントをちゃんとして欲しいよねw
0302デフォルトの名無しさん
2007/09/03(月) 23:09:05見せる)シグニチャである点。
0303デフォルトの名無しさん
2007/09/03(月) 23:15:15あんた、単なる素朴な疑問かと思ってたけど
真正のあほだな
0304デフォルトの名無しさん
2007/09/03(月) 23:16:10オフラインでMSDN見ることってできないんですか?
0305デフォルトの名無しさん
2007/09/03(月) 23:21:540306デフォルトの名無しさん
2007/09/03(月) 23:31:16意味がよくわからないから詳しく説明してくれ
0307デフォルトの名無しさん
2007/09/04(火) 01:41:01constだので縛ってもバグは斜め上からやってくるね。
sealedつけてたのにsealed外されるとか。
foreachといえば、配列に関してはfor文と同等の速度が出ますが、こういう情報はどこにあるのでしょうか?
パフォーマンスガイドラインに重いループではforeachよりforって書いてあったので
わざわざ変えたのに・・悲しい。
0308デフォルトの名無しさん
2007/09/04(火) 02:21:04http://msdn2.microsoft.com/en-us/library/ms998547.aspx
1.1に基づいてるからまだforが速いって書かれてはいるが・・・
http://msdn2.microsoft.com/en-us/library/aa137140.aspx
ここにもパフォーマンスの記事が結構たくさんあるね
特にKnow What Things Costは命令ごとのコスト表が載ってて面白いかも
0309デフォルトの名無しさん
2007/09/04(火) 02:52:522.0だとforeachのほうが若干早くなってますね。
foreach (int v in ar) csum += v;
for (int i=0; i < 10000; i++) csum += ar[i];
これを下のように書くとforeachと同じスピードになるからそういう最適化をしてるのでしょう。
fixed (int *sp = &ar[0]) {
int *ep = sp + 10000;
for (int *p = sp; p < ep; p++) csum += *p + j;
}
ただ、foreachの制御変数が読み取り専用なのは、フェイルセーフのためなのか、
最適化のためなのかは判断がつきません。
0310デフォルトの名無しさん
2007/09/04(火) 07:54:38なるほど、「処理を直接記述されると最適化できないが
抽象度を高くすると最適化しやすい」というやつか
forよりforeachの方が早い
LINQも早くなるという
しかしループ変数への代入を許すとこの最適化が出来なくなるわけか
0311デフォルトの名無しさん
2007/09/04(火) 09:28:17EventWaitHandle.Handle プロパティで
ネイティブのハンドルを取得しようと思ったのですが、
「古い形式です」と起こられてしまいます(警告)。
新しい形式ではどのように書くのでしょうか?
0312デフォルトの名無しさん
2007/09/04(火) 09:37:04MSDNにずばり書いてあるから、まず自分で調べるくせをつけろ。
0313デフォルトの名無しさん
2007/09/04(火) 09:37:06EventWaitHandle.SafeWaitHandle.DangerousGetHandle()
でいいみたい。
Safeなんだか、Dangerousなんだか。
0314デフォルトの名無しさん
2007/09/04(火) 10:15:09DangerousGetHandle()は必要?
MSDNでは、
>このクラスを使用すると、派生クラスのインスタンスでラップされたアンマネージ リソースを
>識別するハンドル (オペレーティング システム ハンドルなど) をアンマネージ コードに
>渡すことができます。
となってるし、使用例にあるWindowsAPIの呼び出しサンプル見ても、IntPtrの代わりに使ってる。
というか従来のIntPtrの代わりに使うべきもののように見える。
DangerousGetHandle()はデバッグのためにハンドル値を16進でダンプしたいとかの特殊用途のために
残してあるんじゃないか。
0315デフォルトの名無しさん
2007/09/04(火) 11:08:29なるほど。ほんとだ。
ハンドルは、PVOIDだろ、と、
[DllImport("native.dll")]
public static extern void NativeFunc(System.IntPtr hHandle);
して、Handleプロパティから渡していたので、、
替わりにSafeWaitHandle使えと言われても、型が違ってこまってました。
[DllImport("native.dll")]
public static extern void NativeFunc(SafeWaitHandle hHandle);
こうすればいいんですね。
0316デフォルトの名無しさん
2007/09/04(火) 12:42:530317デフォルトの名無しさん
2007/09/04(火) 13:35:000318デフォルトの名無しさん
2007/09/04(火) 18:41:40正直、「ボキュはキモヲタだお」って言ってるようにしか聞こえない。
そういうの気色悪いと思わない自分を気色わるいと感じるべきだ。
0319デフォルトの名無しさん
2007/09/04(火) 18:48:43Label1.Text = Replace(Session("body"), vbCrLf, "<br />")
-----------------------------------------------
VBの本の中にソースが載っていたのですが、
この1文が、どうにもわかりません。
そのコード意味は、どうやらセッションというデーター内の改行を
HTMLの改行に変換するっぽいのですが・・・。(推測)
ちなみに、他の行は自力で調べましたが肝心のこのコードが分りませんし、
C#でどう書けば良いのか分りません。
賢者の方々、どうか愚者の私にご指導をお願い申し上げます
0320デフォルトの名無しさん
2007/09/04(火) 18:54:20少しはググるとか努力しろよ
VB.NET固有の関数をC#で使用するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/254vbfunc/vbfunc.html
でも、それただの部分文字列の置換でしょ?
String.Replaceか正規表現で代用できるでしょ。
0321デフォルトの名無しさん
2007/09/04(火) 18:54:33http://zoosir.hp.infoseek.co.jp/tips/string/string03.htm
C#だと省略可能引数(Optional)が無いから、全部書く必要があるらしい。
0322デフォルトの名無しさん
2007/09/04(火) 21:35:51MSDNも普通にフリーとして公開されてなかったか?
0323デフォルトの名無しさん
2007/09/04(火) 21:54:39C:\windows\Microsoft.NET\framework\以下にあるのでそんな気がしますが。
0324デフォルトの名無しさん
2007/09/04(火) 21:57:130325デフォルトの名無しさん
2007/09/04(火) 22:03:35おお、そうだったんですか。
これで安心してCodeDomが使えます。
0326デフォルトの名無しさん
2007/09/04(火) 22:17:14標準なのにドマイナーなのがひとつ
0327デフォルトの名無しさん
2007/09/05(水) 00:09:57ループの中から呼んだりして大丈夫なんだろうか。
何千何万って呼んだらなんか嫌なことになりそうな気がする。
0328デフォルトの名無しさん
2007/09/05(水) 00:15:47説明調の、他人に意味がちゃんと通じる文章書けよ
0329デフォルトの名無しさん
2007/09/05(水) 00:23:22それは説明するまでもないと思ったけど。
何が通じてないのかわからん。
Invoke系のメソッドってのはInvoke、BeginInvokeのことだよ
それらを呼んだら内部的に生成されるオブジェクトでファイナライザが呼ばれるっぽいんで嫌だなって話。
0330デフォルトの名無しさん
2007/09/05(水) 00:37:100331デフォルトの名無しさん
2007/09/05(水) 00:38:28読む側の立場に立って自分の文章推敲できない人間はたいていそうだ。
ついでに、ファイナライザのコスト?
意味がわからない。
デリゲートを処分するコストがそんなかかるのかね?
仮にかかるとして、コストとは「時間当たりのCPUの使用量」のことだと思うが、
どのみちmsのオーダーでInvokeとか不可能だから意味がないだろう。
0332デフォルトの名無しさん
2007/09/05(水) 00:39:31いったいどんな頻度でControl.Invokeなんかを実行する気だ?
■ このスレッドは過去ログ倉庫に格納されています