!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part154
https://mevius.5ch.net/test/read.cgi/tech/1644416019/
■関連スレ
C#, C♯, C#相談室 Part96
https://mevius.5ch.net/test/read.cgi/tech/1639965805/
■コードを貼る場合は↓を使いましょう。
https://ideone.com/
https://dotnetfiddle.net/
■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries/
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries/
https://referencesource.microsoft.com/
https://source.dot.net/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
ふらっと C#,C♯,C#(初心者用) Part155
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ cfbb-bGSb)
2022/06/17(金) 08:42:12.88ID:CPX9Pfyj02デフォルトの名無しさん (ブーイモ MM7f-bhaQ)
2022/06/17(金) 09:44:05.95ID:6P0695t/M 前スレに引続き、VBに関して雑談しましょう
3デフォルトの名無しさん (スッププ Sd1f-TUn1)
2022/06/17(金) 10:01:22.33ID:Ech7goP3d4デフォルトの名無しさん (ワッチョイ 0fde-Gp1N)
2022/06/17(金) 10:05:30.78ID:0flDhQ0N0 VBはもうええは
5デフォルトの名無しさん (ワッチョイ cfbb-NoiI)
2022/06/17(金) 12:49:36.63ID:SEHo94h90 質問です。
VBとC#は同じって本当ですか?
VBとC#は同じって本当ですか?
6デフォルトの名無しさん (ブーイモ MM7f-LqX/)
2022/06/17(金) 13:28:19.51ID:A6HKqZSjM7デフォルトの名無しさん (アウアウウー Sa67-iSSN)
2022/06/17(金) 16:21:06.76ID:G79h5Zera ここまでCLRなし
8デフォルトの名無しさん (ワッチョイ 236e-fUg7)
2022/06/18(土) 17:42:22.61ID:5N4YYnEs0 立て乙
非同期なのにawait/asyncどころかtaskやaction/funcも全く使っていないC#2.0時代みたいな書き方してる今の現場から逃げたい……
非同期なのにawait/asyncどころかtaskやaction/funcも全く使っていないC#2.0時代みたいな書き方してる今の現場から逃げたい……
9デフォルトの名無しさん (ワッチョイ cebb-KZIJ)
2022/06/18(土) 18:06:31.65ID:FHXg/LAj0 お前が現場を変えんだよ
10デフォルトの名無しさん (ワッチョイ 5b79-LlJt)
2022/06/18(土) 19:19:21.37ID:uW38nGwr0 時間管理のできてない安易な非同期はほぼ100%バグってるのでやらなくていい
11デフォルトの名無しさん (オイコラミネオ MM63-2kmA)
2022/06/18(土) 21:39:25.08ID:DZ8znIamM レガシーな非同期はラップしてTaskかObservableにすると気分が晴れやかになる
12デフォルトの名無しさん (ワッチョイ dbe3-VVUE)
2022/06/18(土) 22:03:02.01ID:V1FXcKIO0 Taskは遅いとかいう記事のせいで未だにCallbackが主流の俺社の悪口はやめて
13デフォルトの名無しさん (ワッチョイ 236e-fUg7)
2022/06/18(土) 22:21:46.90ID:5N4YYnEs0 それそれ
そもそもcallbackの書き方なんて最近の本に全く載ってないから今の現場に入ってIAsyncResult?なんじゃそりゃってなった
10年は前に作られただろうサイトを読んで長い時間かけてようやく何やってるか理解したみたいな
そもそもcallbackの書き方なんて最近の本に全く載ってないから今の現場に入ってIAsyncResult?なんじゃそりゃってなった
10年は前に作られただろうサイトを読んで長い時間かけてようやく何やってるか理解したみたいな
14デフォルトの名無しさん (ワッチョイ 1aad-Zgr3)
2022/06/19(日) 18:15:11.59ID:JN11Elx30 >>8
書き換えればええやん
書き換えればええやん
15デフォルトの名無しさん (テテンテンテン MMb6-7TEv)
2022/06/21(火) 10:13:10.23ID:Anf2PF0ZM 予算は?
16デフォルトの名無しさん (ワッチョイ db63-PIvG)
2022/06/21(火) 11:32:11.12ID:xt+HQD+A0 いま少し時間と予算をいただければ…
17デフォルトの名無しさん (ワッチョイ 1aad-Zgr3)
2022/06/22(水) 06:57:18.35ID:10PSZ3s70 >>15
稟議通せば?
稟議通せば?
18デフォルトの名無しさん (ワッチョイ 0e33-bS77)
2022/06/22(水) 07:24:29.42ID:aadzgmkj0 この表の部分Excelと同じ操作にしてくれる?
19デフォルトの名無しさん (ワッチョイ 0eda-G5eL)
2022/06/22(水) 08:29:37.02ID:ITHh+IXJ0 ピコーン OLE2で埋め込めば良いじゃん
20デフォルトの名無しさん (ワッチョイ 7610-Icr6)
2022/06/22(水) 09:11:42.38ID:pCRUTkSs0 ArrayListを使ってる.NET1.0時代な職場よりマシなのでは
21デフォルトの名無しさん (ササクッテロラ Sp3b-RW72)
2022/06/22(水) 10:02:21.11ID:KXMvDxejp ようやく文法の教科書終わったくらいの素人なんですがinterfaceの具体的な使い方はどうやって覚えたらいいですかね
interfaceを使った疎結合というのがいまいちイメージできなくて取っ掛かりが分からん
interfaceを使った疎結合というのがいまいちイメージできなくて取っ掛かりが分からん
22デフォルトの名無しさん (ワッチョイ 0b01-gg/4)
2022/06/22(水) 10:24:15.19ID:4lQZ5KlU0 DIコンテナで実装クラスの差し替えでもしてみたらどうでしょうか
ttps://qiita.com/okazuki/items/a0f2fb0a63ca88340ff6
ttps://qiita.com/okazuki/items/a0f2fb0a63ca88340ff6
23デフォルトの名無しさん (オッペケ Sr3b-MKW/)
2022/06/22(水) 10:30:38.32ID:PAt9l0gwr 例えば動物クラスで、哺乳類とか鳥類とかに派生していくけど、
飛ぶ能力は鳥類だけの特徴ではないから interface で実装するとか。
飛ぶ能力は鳥類だけの特徴ではないから interface で実装するとか。
24デフォルトの名無しさん (ワッチョイ 5fda-fNRM)
2022/06/22(水) 10:42:48.00ID:IP7+Sy+B0 どんなclassのオブジェクトでも引数で受け取れるメソッド作ってみろよ
但し受け取るオブジェクト内でHage()メソッドの実装は必須な
但し受け取るオブジェクト内でHage()メソッドの実装は必須な
25デフォルトの名無しさん (ワッチョイ b72f-WaTF)
2022/06/22(水) 11:22:39.46ID:A/muOnk30 文法だけみても、実際に使い方みないと必要性とか実感なんてわかないだろ
まあ用途なんていろんなライブラリ使ってみればそのうちわかるさ
まあ用途なんていろんなライブラリ使ってみればそのうちわかるさ
26デフォルトの名無しさん (ササクッテロラ Sp3b-RW72)
2022/06/22(水) 11:32:21.14ID:cmFMiTtgp >>24
すごい。設問で理解できた気がする。
つまり現存するのが少数の自前クラスだけならまだ全てのクラスを引数にするメソッドを作成できるが、将来に渡って作られるであろうあらゆるクラスを引数にした関数は普通は作れない
そこでinterfaceを使って引数を抽象化する事で、あらゆるクラスを引数に取る事を可能にする。しかもHoge()は確定実装なので相手が何であれHoge()を叩けるのは保証される。よって相手を限定しない疎結合になる。
ってことか?この認識であってます?
すごい。設問で理解できた気がする。
つまり現存するのが少数の自前クラスだけならまだ全てのクラスを引数にするメソッドを作成できるが、将来に渡って作られるであろうあらゆるクラスを引数にした関数は普通は作れない
そこでinterfaceを使って引数を抽象化する事で、あらゆるクラスを引数に取る事を可能にする。しかもHoge()は確定実装なので相手が何であれHoge()を叩けるのは保証される。よって相手を限定しない疎結合になる。
ってことか?この認識であってます?
27デフォルトの名無しさん (ワッチョイ a75f-cRYK)
2022/06/22(水) 11:37:00.61ID:SASaungr0 抽象化レイヤーの有用性を理解するにはテストコードを書くのが一番
まずはDIやるほどでもない小規模なプログラムで、HTTP通信とかファイルアクセスとかDBアクセスとかやってるところにinterface挟んで、
ユニットテストでは実際のアクセスを発生させずにテストできるようにしてみるといい
https://docs.microsoft.com/ja-jp/visualstudio/test/unit-test-basics?view=vs-2022
まずはDIやるほどでもない小規模なプログラムで、HTTP通信とかファイルアクセスとかDBアクセスとかやってるところにinterface挟んで、
ユニットテストでは実際のアクセスを発生させずにテストできるようにしてみるといい
https://docs.microsoft.com/ja-jp/visualstudio/test/unit-test-basics?view=vs-2022
28デフォルトの名無しさん (ササクッテロラ Sp3b-RW72)
2022/06/22(水) 11:46:24.28ID:cmFMiTtgp29デフォルトの名無しさん (ワッチョイ 3ea7-9kHe)
2022/06/22(水) 11:56:22.30ID:/fjoIry/0 >>26
外野だけど大体そんな感じ
ただ、「そのインターフェースを実装しているクラスに限る」けどね
だからといって闇雲に継承したりインターフェースを実装したりするのではなく、is-aの関係であるべき
「車」や「飛行機」は抽象化すると「乗り物
」となるけど、「家」は抽象化しても「乗り物」とはならないね(抽象化すると「建物」とかになるはず)
車、飛行機、家はそれぞれ通常クラスとして、
乗り物、建物はインターフェースとして定義する
そうすればどの乗り物だろうと同じ「前進」とかで動かせる
この抽象化して、どれでインスタンス化したか関係なく動かすためにinterfaceがある
外野だけど大体そんな感じ
ただ、「そのインターフェースを実装しているクラスに限る」けどね
だからといって闇雲に継承したりインターフェースを実装したりするのではなく、is-aの関係であるべき
「車」や「飛行機」は抽象化すると「乗り物
」となるけど、「家」は抽象化しても「乗り物」とはならないね(抽象化すると「建物」とかになるはず)
車、飛行機、家はそれぞれ通常クラスとして、
乗り物、建物はインターフェースとして定義する
そうすればどの乗り物だろうと同じ「前進」とかで動かせる
この抽象化して、どれでインスタンス化したか関係なく動かすためにinterfaceがある
30デフォルトの名無しさん (ワッチョイ cebb-h11B)
2022/06/22(水) 12:05:02.40ID:PETcyPz40 インターフェイスは、デザインパターンやユニットテストを多少でも知っていないと意味不明だろう
31デフォルトの名無しさん (オッペケ Sr3b-tycP)
2022/06/22(水) 12:38:55.59ID:+v1vNSu7r まあ書いてみたときに便利さを実感するわな
32デフォルトの名無しさん (ワッチョイ cebb-h11B)
2022/06/22(水) 12:56:59.75ID:PETcyPz40 どうだろね
数時間で完成する規模のものしか書かないのであれば、記述が増えて不便になったと思うかもしれないし・・・・
数時間で完成する規模のものしか書かないのであれば、記述が増えて不便になったと思うかもしれないし・・・・
33デフォルトの名無しさん (スッププ Sdba-oPsP)
2022/06/22(水) 13:00:52.20ID:1cdxoy9qd34デフォルトの名無しさん (アウアウウー Sa47-vQ73)
2022/06/22(水) 13:58:54.21ID:bIOoQPo7a JavaとJavaBeansのことか
35デフォルトの名無しさん (ワッチョイ 5fda-fNRM)
2022/06/22(水) 15:18:26.16ID:IP7+Sy+B036デフォルトの名無しさん (ワッチョイ 7610-Icr6)
2022/06/22(水) 15:19:46.32ID:pCRUTkSs0 普段意識しないだけで、インターフェースはいたるところにある
判りやすい例がforeachステートメント
あれはListではなくIEnumerableに対してループしている
判りやすい例がforeachステートメント
あれはListではなくIEnumerableに対してループしている
37デフォルトの名無しさん (スッププ Sdba-sDv4)
2022/06/22(水) 15:42:58.01ID:81K3MuoLd 車が家の場合は?
38デフォルトの名無しさん (ワッチョイ b72f-WaTF)
2022/06/22(水) 17:28:55.97ID:A/muOnk3039デフォルトの名無しさん (アウアウウー Sa47-bX4F)
2022/06/22(水) 17:54:44.92ID:FYBnfkKla >>20
石器時代の産物だなw
石器時代の産物だなw
40デフォルトの名無しさん (ワッチョイ 3b5f-sER5)
2022/06/22(水) 18:10:20.15ID:5Bb+Exnq0 初心者向けなら最初はテストのためって言ってしまっても問題ないと思う
初心者のときに俺が一番ピンときたのは、
ファイル作成や書き込みをテストしたくなったときに使った System.IO.Abstractions だな
ファイルシステム自体を抽象化(IFileSystem)することで
テストの度に実際のファイルをセットアップしなくてもいいことが分かった時は結構感動した
初心者のときに俺が一番ピンときたのは、
ファイル作成や書き込みをテストしたくなったときに使った System.IO.Abstractions だな
ファイルシステム自体を抽象化(IFileSystem)することで
テストの度に実際のファイルをセットアップしなくてもいいことが分かった時は結構感動した
41デフォルトの名無しさん (ワッチョイ 0b01-bS77)
2022/06/22(水) 19:03:12.67ID:+B9FnbDA0 private Random _random = new Random();
void MethodA(){
var val = _random.Next(1, 100);
}
void MethodB(){
var random = new Random();
var val = random.Next(1, 100);
}
MethodAとMethodBをそれぞれループで何度も実行したとき、Bの方が圧倒的に速いのはなぜですか?
Randomオブジェクトを都度生成しているので遅そうに思えるのですが。
void MethodA(){
var val = _random.Next(1, 100);
}
void MethodB(){
var random = new Random();
var val = random.Next(1, 100);
}
MethodAとMethodBをそれぞれループで何度も実行したとき、Bの方が圧倒的に速いのはなぜですか?
Randomオブジェクトを都度生成しているので遅そうに思えるのですが。
42デフォルトの名無しさん (ブーイモ MM67-oPsP)
2022/06/22(水) 19:22:48.61ID:EFlIvheoM >>41
計測に使ったコード見せて
計測に使ったコード見せて
43デフォルトの名無しさん (ワッチョイ 7610-Icr6)
2022/06/22(水) 19:58:57.85ID:pCRUTkSs0 RandomNumberGenerator.GetInt32の方がおすすめよ
ゲームみたいにシード値を固定にしたい場合はその限りではないけど
速度が欲しい場合はXorshiftもあるんでついでに比較するといい
ゲームみたいにシード値を固定にしたい場合はその限りではないけど
速度が欲しい場合はXorshiftもあるんでついでに比較するといい
44デフォルトの名無しさん (ワッチョイ a702-KtZt)
2022/06/22(水) 20:07:52.96ID:6/q1nl240 C++だと、メンバ変数をループでアクセスしたりすると遅くなるよ
C#も多分変わらんのでは
C#も多分変わらんのでは
45デフォルトの名無しさん (スッププ Sdba-oPsP)
2022/06/22(水) 20:16:40.07ID:1cdxoy9qd46デフォルトの名無しさん (ワッチョイ 0eda-G5eL)
2022/06/22(水) 20:19:45.04ID:ITHh+IXJ0 Rレジスタを読むだけじゃないのか
47デフォルトの名無しさん (ワッチョイ 2324-zXsU)
2022/06/22(水) 21:10:25.85ID:MLZMXa4p0 ローカル変数に保持するとかなりの確率でレジスタに入るがstaticフィールドに紐づいてるインスタンスだと逆に絶対にその都度メモリにアクセスすることになる
それもその都度多重ポインタを辿っていく事になるので何度もreadする変数は出来ればローカル変数に一度入れた方が良い
レジスタ利用されずともヒープへのアクセスとスタックへのアクセスじゃ局所性の問題からスタックの方が早いし手間以外にはメリットしかない
それもその都度多重ポインタを辿っていく事になるので何度もreadする変数は出来ればローカル変数に一度入れた方が良い
レジスタ利用されずともヒープへのアクセスとスタックへのアクセスじゃ局所性の問題からスタックの方が早いし手間以外にはメリットしかない
48デフォルトの名無しさん (ワッチョイ 5a01-UZ+b)
2022/06/22(水) 21:42:35.06ID:XpS14TAH0 >>41
計測してみたけどBのほうが圧倒的に遅かった
計測してみたけどBのほうが圧倒的に遅かった
49デフォルトの名無しさん (ワッチョイ 5a01-UZ+b)
2022/06/22(水) 21:49:22.91ID:XpS14TAH050デフォルトの名無しさん (ワッチョイ 8379-c+ns)
2022/06/22(水) 22:27:47.54ID:OsaOMnRZ0 出した乱数を未使用で後者はローカルで完結してるから最適化でコードが全省略されたってオチだろう
5141 (ワッチョイ 8341-643o)
2022/06/22(水) 22:57:40.86ID:LVeGoA3E0 みなさんありがとうございます。書いたコードはこんな感じです。
.NET Framework4.8 の Form アプリで、画面にlabelを1つ置いています。
私の環境だとDebug, Releaseビルドに関わらず100倍くらいBが早いです。
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private Random _random = new Random();
private void Test(Func<int> func) {
var sw = Stopwatch.StartNew();
var count = 10000;
for (var i = 0; i < count ; i++) {
label1.Text = func().ToString();
Application.DoEvents();
}
sw.Stop();
Console.WriteLine($"{sw.ElapsedMilliseconds} msec");
}
private int MethodA() {
return _random.Next(1, 100);
}
private int MethodB() {
var random = new Random();
return random.Next(1, 100);
}
private void button1_Click(object sender, EventArgs e) {
Test(MethodA);
Test(MethodB);
}
}
.NET Framework4.8 の Form アプリで、画面にlabelを1つ置いています。
私の環境だとDebug, Releaseビルドに関わらず100倍くらいBが早いです。
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private Random _random = new Random();
private void Test(Func<int> func) {
var sw = Stopwatch.StartNew();
var count = 10000;
for (var i = 0; i < count ; i++) {
label1.Text = func().ToString();
Application.DoEvents();
}
sw.Stop();
Console.WriteLine($"{sw.ElapsedMilliseconds} msec");
}
private int MethodA() {
return _random.Next(1, 100);
}
private int MethodB() {
var random = new Random();
return random.Next(1, 100);
}
private void button1_Click(object sender, EventArgs e) {
Test(MethodA);
Test(MethodB);
}
}
52デフォルトの名無しさん (ワッチョイ 57e6-Xzo3)
2022/06/22(水) 23:12:43.31ID:BDP06NEh0 AとBの実行順は変えてみた?
53デフォルトの名無しさん (ワッチョイ 2324-zXsU)
2022/06/22(水) 23:17:07.34ID:MLZMXa4p0 >>51
Test(MethodB);
Test(MethodA);
こうやって逆にして見ると今度はAの方が100倍速くなるかもね
Stopwatchクラスはこんな風に糸も簡単に結果が変わるからパフォーマンス測定にはあんまり向かない
あとRandomと比べてlabe1.Text = がかなりのボトルネックになってる可能性あるから、そうだとしたらRandomのパフォーマンス差なんて誤差の範囲内ってことになってしまう
よって強いてTest()でやるとしたら自分ならこうやって最後だけアウトプットするようにする
int num = 0;
for (int i = 0; i < 10000; i++) num += func();
label1.Text = num.ToString();
Test(MethodB);
Test(MethodA);
こうやって逆にして見ると今度はAの方が100倍速くなるかもね
Stopwatchクラスはこんな風に糸も簡単に結果が変わるからパフォーマンス測定にはあんまり向かない
あとRandomと比べてlabe1.Text = がかなりのボトルネックになってる可能性あるから、そうだとしたらRandomのパフォーマンス差なんて誤差の範囲内ってことになってしまう
よって強いてTest()でやるとしたら自分ならこうやって最後だけアウトプットするようにする
int num = 0;
for (int i = 0; i < 10000; i++) num += func();
label1.Text = num.ToString();
54デフォルトの名無しさん (ワッチョイ 2324-zXsU)
2022/06/22(水) 23:19:35.02ID:MLZMXa4p0 てかループ枚にToString()を挟んでる時点で後発の方が100倍早くなるのはヒープアロケーション関係だろうね
とりあえずそのコードじゃRandom自体のパフォーマンス差なんてほぼ計れてないと思うよ
とりあえずそのコードじゃRandom自体のパフォーマンス差なんてほぼ計れてないと思うよ
55デフォルトの名無しさん (ワッチョイ 5a01-UZ+b)
2022/06/22(水) 23:50:09.49ID:XpS14TAH0 >>51
Application.DoEvents()はずしても100倍の差が出る結果は同じなの?
Application.DoEvents()はずしても100倍の差が出る結果は同じなの?
5641 (ワッチョイ 8341-643o)
2022/06/23(木) 00:05:42.18ID:L4XgT5Hv0 >>52-55
A,Bの順序を入れ替えても同じ結果でした。(A:6000msec, B:60msec)
Application.DoEvents()を外すと、差が小さくなりますがそれでもBが40倍くらい速いです。(A:2000msec, B:50msec)
Randomの使い方が正しくないとかは、いったん置いておいて、
なぜこれほど差が出るのかが知りたいです。
気づかずに遅い実装をしない為には、何に気を付ければ良いのかが知りたいです。
A,Bの順序を入れ替えても同じ結果でした。(A:6000msec, B:60msec)
Application.DoEvents()を外すと、差が小さくなりますがそれでもBが40倍くらい速いです。(A:2000msec, B:50msec)
Randomの使い方が正しくないとかは、いったん置いておいて、
なぜこれほど差が出るのかが知りたいです。
気づかずに遅い実装をしない為には、何に気を付ければ良いのかが知りたいです。
57デフォルトの名無しさん (スッププ Sdba-oPsP)
2022/06/23(木) 00:40:24.63ID:VlRKcYRwd58デフォルトの名無しさん (スッププ Sdba-oPsP)
2022/06/23(木) 00:47:12.21ID:VlRKcYRwd あと、Bの方は頻繁に同じ値が返ってないか?
Randomの引数なしコンストラクタは現在のミリ秒単位の時刻をシードに設定するから、1ms以内に生成されたRandomオブジェクトは全て同じ結果を返すはず
前述の通りTextプロパティの変更は非常に重いので、値が変わらない場合は実際の変更を省略する実装になっている可能性がある
Randomの引数なしコンストラクタは現在のミリ秒単位の時刻をシードに設定するから、1ms以内に生成されたRandomオブジェクトは全て同じ結果を返すはず
前述の通りTextプロパティの変更は非常に重いので、値が変わらない場合は実際の変更を省略する実装になっている可能性がある
59デフォルトの名無しさん (ワッチョイ b3d2-cyzR)
2022/06/23(木) 00:50:17.77ID:wY0+W7Gq0 GUIへのsetterもそうだが、何かを計測したいなら不確定要素になりうるものはできるだけ排除しなよ
sw.Start()からsw.Stop()までの間はFunc呼び出しのループだけにしたい
あとループと関数呼び出しのオーバーヘッド分の計測も必要
空の関数 int Empty(){return 0;} も用意すること
sw.Start()からsw.Stop()までの間はFunc呼び出しのループだけにしたい
あとループと関数呼び出しのオーバーヘッド分の計測も必要
空の関数 int Empty(){return 0;} も用意すること
60デフォルトの名無しさん (ワッチョイ 5a01-UZ+b)
2022/06/23(木) 02:12:34.18ID:3EmxumxM0 >>56
かかってる時間を見るとBが最適化されて速いというわけじゃなくAが異常に遅いんだね
コードからはなんでそんな遅くなるのか全然わからないから絞り込んでいって切り分けるかプロファイリングするかかな
それ以外で簡単にできるものだと
A、B、A、B、A、Bと3回ずつ回して差をみる
FormじゃなくCLIでやってみる
BenchmarkDotNetで計測してみる
とか
かかってる時間を見るとBが最適化されて速いというわけじゃなくAが異常に遅いんだね
コードからはなんでそんな遅くなるのか全然わからないから絞り込んでいって切り分けるかプロファイリングするかかな
それ以外で簡単にできるものだと
A、B、A、B、A、Bと3回ずつ回して差をみる
FormじゃなくCLIでやってみる
BenchmarkDotNetで計測してみる
とか
61デフォルトの名無しさん (テテンテンテン MMb6-Q5TH)
2022/06/23(木) 09:47:54.73ID:d0910tAHM Randomより遅い処理色々混ざってるから計測になってない
計測したい処理を完全に独立したメソッドにしてBenchmarkDotNetで測れ
計測したい処理を完全に独立したメソッドにしてBenchmarkDotNetで測れ
62デフォルトの名無しさん (スッププ Sdba-oPsP)
2022/06/23(木) 10:02:19.23ID:VlRKcYRwd63デフォルトの名無しさん (ワッチョイ 5f49-tycP)
2022/06/23(木) 10:04:16.16ID:uYSGjbtO0 公の場?
64デフォルトの名無しさん (ワッチョイ 5f49-sER5)
2022/06/23(木) 10:59:37.96ID:uYSGjbtO0 いわゆる.NETだと(だっけ)プロパティへのアクセスが遅くなるっていうハナシじゃないん?
どうしてもならリフレクションとかでどうにかこうにかするとか、そういう話だった気はする
どうしてもならリフレクションとかでどうにかこうにかするとか、そういう話だった気はする
65デフォルトの名無しさん (ラクッペペ MMb6-Xzo3)
2022/06/23(木) 11:05:10.95ID:szzSpCywM いわゆらない.NETの話はこのスレで出てくるのか?
66デフォルトの名無しさん (ドコグロ MM92-cRYK)
2022/06/23(木) 11:22:03.54ID:/qnvtXmgM >>58
これだろうな
これだろうな
67デフォルトの名無しさん (ブーイモ MMb6-oPsP)
2022/06/23(木) 11:43:08.08ID:6zHFEOYgM >>64
そういうレベルの話じゃなくて、Control.Textは内部でWinAPIを呼んでいてビチグソ遅い
そういうレベルの話じゃなくて、Control.Textは内部でWinAPIを呼んでいてビチグソ遅い
68デフォルトの名無しさん (ワッチョイ 5a01-UZ+b)
2022/06/23(木) 12:07:07.81ID:3EmxumxM06964 (ワッチョイ 5f49-sER5)
2022/06/23(木) 12:13:05.94ID:uYSGjbtO0 コンソールアプリでも似たような結果になったんだが気のせいかな?(4.8)
ちなみにrandom使わずにやってみても同じ(intの和)
プロパティへのアクセスだなあとワイは思うけどどやろね
ちなみにrandom使わずにやってみても同じ(intの和)
プロパティへのアクセスだなあとワイは思うけどどやろね
70デフォルトの名無しさん (テテンテンテン MMb6-Q5TH)
2022/06/23(木) 12:14:45.20ID:/osWwN6CM71デフォルトの名無しさん (ワッチョイ 2324-zXsU)
2022/06/23(木) 12:17:22.87ID:jvSS+4eW07264 (ワッチョイ 5f49-sER5)
2022/06/23(木) 14:13:54.26ID:uYSGjbtO0 コンソールアプリ、BenchmarkDotNetでやってみたら大して変わらんかったわ
Randomじゃなくてintの和でも同じ傾向
速度の違いはデバッグ時の状況の影響かもね
ちなControl.Textがうんたらの人たちは、ただの改善おじさんやな
比較の話で共通部分のコード直せって意味わからんわな
Randomじゃなくてintの和でも同じ傾向
速度の違いはデバッグ時の状況の影響かもね
ちなControl.Textがうんたらの人たちは、ただの改善おじさんやな
比較の話で共通部分のコード直せって意味わからんわな
7364 (ワッチョイ 5f49-sER5)
2022/06/23(木) 14:15:31.83ID:uYSGjbtO0 ちなコードの一部
private void Test(Func<int> func)
{
for (var i = 0; i < 10000; i++)
{
Console.CursorLeft = 0;
Console.Write($"{i}{func()} random");
}
}
//private int MethodA()
//{
// v = 5 + 5;
// return v;
//}
//private int MethodB()
//{
// int v = 5 + 5;
// return v;
//}
private int MethodA() => _random.Next(1, 100);
private int MethodB() => (new Random()).Next(1, 100);
[Benchmark]
public void executeA() => Test(MethodA);
[Benchmark]
public void executeB() => Test(MethodB);
private void Test(Func<int> func)
{
for (var i = 0; i < 10000; i++)
{
Console.CursorLeft = 0;
Console.Write($"{i}{func()} random");
}
}
//private int MethodA()
//{
// v = 5 + 5;
// return v;
//}
//private int MethodB()
//{
// int v = 5 + 5;
// return v;
//}
private int MethodA() => _random.Next(1, 100);
private int MethodB() => (new Random()).Next(1, 100);
[Benchmark]
public void executeA() => Test(MethodA);
[Benchmark]
public void executeB() => Test(MethodB);
74デフォルトの名無しさん (ワッチョイ ca2d-MKW/)
2022/06/23(木) 14:44:45.09ID:pqpGOzkV075デフォルトの名無しさん (ワッチョイ 5f49-sER5)
2022/06/23(木) 14:53:28.22ID:uYSGjbtO0 >>74
ワイの勘違いだったわ
ワイの勘違いだったわ
76デフォルトの名無しさん (ブーイモ MM67-oPsP)
2022/06/23(木) 15:31:00.54ID:te570uEsM7776 (ブーイモ MM67-oPsP)
2022/06/23(木) 15:31:31.06ID:te570uEsM 訂正
return 10;
return 10;
7864 (ワッチョイ 5f49-sER5)
2022/06/23(木) 15:56:54.89ID:uYSGjbtO0 >>76
ちなみにintのほう、5+i にしてても"ほぼ"一緒やったよ。差異も似たようなもん
言いたいのは、>>51(=41)が言う「AとBにこんなに差が出るがなぜか」について、
4.8のコンソールアプリでは51が言うほどの有意な差は出なかったということ。
ちなみにワイの環境でMeanの差異は50ms程度でBが早いってなったけど、
まあこれは51が言ってるほどじゃないけど環境依存もあるからなんとも
(Randomのほうもコメントで切替えつつ検証した、差異も同じ)
原因についてのワイの推測は間違ってたってことはこれで自分で明らかにしちゃったけど、
Randomの1ms~も多分違うんじゃないかなとはこれで思う
ちなみにintのほう、5+i にしてても"ほぼ"一緒やったよ。差異も似たようなもん
言いたいのは、>>51(=41)が言う「AとBにこんなに差が出るがなぜか」について、
4.8のコンソールアプリでは51が言うほどの有意な差は出なかったということ。
ちなみにワイの環境でMeanの差異は50ms程度でBが早いってなったけど、
まあこれは51が言ってるほどじゃないけど環境依存もあるからなんとも
(Randomのほうもコメントで切替えつつ検証した、差異も同じ)
原因についてのワイの推測は間違ってたってことはこれで自分で明らかにしちゃったけど、
Randomの1ms~も多分違うんじゃないかなとはこれで思う
79デフォルトの名無しさん (ブーイモ MM67-oPsP)
2022/06/23(木) 16:15:51.40ID:te570uEsM8064 (オッペケ Sr3b-tycP)
2022/06/23(木) 16:30:56.77ID:6J8EAy2kr いやそれはなんのために言ってるわけ?
メソッドの実装の仕方の違いからくる性能差の疑問を解決したいだろう51に対して、
何を言いたいん?
「これじゃ分かんねえよ」とでも言いたいの?なら引っ込んでれば?
こっちは自分の予想を自分で検証してその植えでその誤りも認めたんやから
何もせず考えもせずわかんねえって言ってるだけやん
予想があるなら検証してコードもだしてくれよん?
メソッドの実装の仕方の違いからくる性能差の疑問を解決したいだろう51に対して、
何を言いたいん?
「これじゃ分かんねえよ」とでも言いたいの?なら引っ込んでれば?
こっちは自分の予想を自分で検証してその植えでその誤りも認めたんやから
何もせず考えもせずわかんねえって言ってるだけやん
予想があるなら検証してコードもだしてくれよん?
81デフォルトの名無しさん (ワッチョイ 2324-zXsU)
2022/06/23(木) 17:45:34.11ID:jvSS+4eW0 >>72
全く違う
他で大きく時間使われるところがあると大数の法則的な感じで軽い部分が圧倒的母数によって覆い隠されてしまう
特にGCやシステムコールは常に一定速度とは限らないから、そういう処理を挟めば挟むほど誤差が大きくなってすぐに終わる軽微な処理差が覆い隠されてしまう
全く違う
他で大きく時間使われるところがあると大数の法則的な感じで軽い部分が圧倒的母数によって覆い隠されてしまう
特にGCやシステムコールは常に一定速度とは限らないから、そういう処理を挟めば挟むほど誤差が大きくなってすぐに終わる軽微な処理差が覆い隠されてしまう
82デフォルトの名無しさん (ワッチョイ a75f-cRYK)
2022/06/23(木) 18:02:24.84ID:a115LlJm0 >>51
>>58の情報を信じて書いたけど
これで大体同じような数字が出たら>>58の通りベンチの取り方の問題のせいで出た差だと思うよ
MethodA,MethodB自体は>>72も検証してくれた通り変わらないはず
というか今MethodBのほうをどこかで使ってるんだとしたら、性能なんかより1ms以内連続して同じ値が出るような乱数でも問題無い使い方なのかを気にするべき
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private int _random = 0;
private void Test(Func<int> func) {
var sw = Stopwatch.StartNew();
var count = 10000;
for (var i = 0; i < count ; i++) {
label1.Text = func().ToString();
Application.DoEvents();
}
sw.Stop();
Console.WriteLine($"{sw.ElapsedMilliseconds} msec");
}
private int MethodA() {
return _random++;
}
private int MethodB() {
return (int)DateTimeOffset.Now.FromUnixTimeMilliseconds;
}
private void button1_Click(object sender, EventArgs e) {
Test(MethodA);
Test(MethodB);
}
}
>>58の情報を信じて書いたけど
これで大体同じような数字が出たら>>58の通りベンチの取り方の問題のせいで出た差だと思うよ
MethodA,MethodB自体は>>72も検証してくれた通り変わらないはず
というか今MethodBのほうをどこかで使ってるんだとしたら、性能なんかより1ms以内連続して同じ値が出るような乱数でも問題無い使い方なのかを気にするべき
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private int _random = 0;
private void Test(Func<int> func) {
var sw = Stopwatch.StartNew();
var count = 10000;
for (var i = 0; i < count ; i++) {
label1.Text = func().ToString();
Application.DoEvents();
}
sw.Stop();
Console.WriteLine($"{sw.ElapsedMilliseconds} msec");
}
private int MethodA() {
return _random++;
}
private int MethodB() {
return (int)DateTimeOffset.Now.FromUnixTimeMilliseconds;
}
private void button1_Click(object sender, EventArgs e) {
Test(MethodA);
Test(MethodB);
}
}
83デフォルトの名無しさん (ワッチョイ a702-KtZt)
2022/06/23(木) 18:09:26.02ID:ey2ezatM0 とりあえず64がアホだという事は判る
84デフォルトの名無しさん (ワッチョイ 5a01-UZ+b)
2022/06/23(木) 18:14:56.67ID:3EmxumxM0 label1.Text = func().ToString();を
label1.Text = $”{i}: {func().ToString()}”;にでもすれば
>>58が書いてる内容が原因かどうかはっきりわかるでしょ
label1.Text = $”{i}: {func().ToString()}”;にでもすれば
>>58が書いてる内容が原因かどうかはっきりわかるでしょ
8564 (ワッチョイ 13ac-tycP)
2022/06/23(木) 18:19:33.38ID:4fvcgSgI0 >>81
何が全く違うんやねん
一般論はいいけど、それが51の言ってるAとBの差の理由になるのは何なのよっていうことじゃん?
まあそもそも51のコードにそこまでの差が出るのかどうかも今のワイは知らん立場やが
51はBのほうが速くなってるから疑問なんやろ、まあ他のコードのとこに依存ありそうで気になるな
何が全く違うんやねん
一般論はいいけど、それが51の言ってるAとBの差の理由になるのは何なのよっていうことじゃん?
まあそもそも51のコードにそこまでの差が出るのかどうかも今のワイは知らん立場やが
51はBのほうが速くなってるから疑問なんやろ、まあ他のコードのとこに依存ありそうで気になるな
87デフォルトの名無しさん (ワッチョイ 2324-zXsU)
2022/06/23(木) 18:41:00.93ID:jvSS+4eW089デフォルトの名無しさん (ワッチョイ b72f-WaTF)
2022/06/23(木) 19:40:58.09ID:1Th4d0L20 >5chって一般論話す場だろ
初めて聞いたわ。
ここ技術系の板だぜ。個別問題に一般論しか返せないなら邪魔だから黙ってろ
初めて聞いたわ。
ここ技術系の板だぜ。個別問題に一般論しか返せないなら邪魔だから黙ってろ
90デフォルトの名無しさん (ワッチョイ a702-KtZt)
2022/06/23(木) 19:45:10.46ID:ey2ezatM0 using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System;
[MemoryDiagnoser(false)]
public class RandomBenchmark
{
[Params(10000)] public int A;
private readonly Random _random = new Random();
public int MethodA() => _random.Next(1, 100);
public int MethodB() => new Random().Next(1, 100);
[Benchmark]
public int BenchA()
{
int result = 0;
for (int i = 0; i < A; i++) result += MethodA();
return result;
}
[Benchmark]
public int BenchB()
{
int result = 0;
for (int i = 0; i < A; i++) result += MethodB();
return result;
}
public static void Main() => BenchmarkRunner.Run<RandomBenchmark>();
}
| Method | A | Mean | Error | StdDev | Allocated |
|------- |------ |------------:|---------:|---------:|----------:|
| BenchA | 10000 | 80.88 us | 0.489 us | 0.434 us | - |
| BenchB | 10000 | 1,490.26 us | 9.404 us | 8.797 us | 720,001 B |
using BenchmarkDotNet.Running;
using System;
[MemoryDiagnoser(false)]
public class RandomBenchmark
{
[Params(10000)] public int A;
private readonly Random _random = new Random();
public int MethodA() => _random.Next(1, 100);
public int MethodB() => new Random().Next(1, 100);
[Benchmark]
public int BenchA()
{
int result = 0;
for (int i = 0; i < A; i++) result += MethodA();
return result;
}
[Benchmark]
public int BenchB()
{
int result = 0;
for (int i = 0; i < A; i++) result += MethodB();
return result;
}
public static void Main() => BenchmarkRunner.Run<RandomBenchmark>();
}
| Method | A | Mean | Error | StdDev | Allocated |
|------- |------ |------------:|---------:|---------:|----------:|
| BenchA | 10000 | 80.88 us | 0.489 us | 0.434 us | - |
| BenchB | 10000 | 1,490.26 us | 9.404 us | 8.797 us | 720,001 B |
91デフォルトの名無しさん (ワッチョイ ca2d-MKW/)
2022/06/23(木) 20:56:11.83ID:pqpGOzkV0 >>51
皆が指摘してるように余計な処理を省いたら、たぶん、結果が逆転すると思う
(自分の所では逆転してMethodAの方が60倍位速かった)
private void Test2( Func<int> func )
{
var sw = Stopwatch.StartNew();
var count = 10000; // ※速すぎて結果が0msecになると思うから1桁増やした方が良い
for ( var i = 0; i < count; i++ )
{
func();
}
sw.Stop();
Console.WriteLine( $"{sw.ElapsedMilliseconds} msec" );
}
private async void button2_Click( object sender, EventArgs e )
{
await Task.Run( () => Test2( MethodA ) );
await Task.Run( () => Test2( MethodB ) );
}
皆が指摘してるように余計な処理を省いたら、たぶん、結果が逆転すると思う
(自分の所では逆転してMethodAの方が60倍位速かった)
private void Test2( Func<int> func )
{
var sw = Stopwatch.StartNew();
var count = 10000; // ※速すぎて結果が0msecになると思うから1桁増やした方が良い
for ( var i = 0; i < count; i++ )
{
func();
}
sw.Stop();
Console.WriteLine( $"{sw.ElapsedMilliseconds} msec" );
}
private async void button2_Click( object sender, EventArgs e )
{
await Task.Run( () => Test2( MethodA ) );
await Task.Run( () => Test2( MethodB ) );
}
92デフォルトの名無しさん (ワッチョイ a702-KtZt)
2022/06/23(木) 20:58:51.74ID:ey2ezatM0 少なくとも >>51 のコードでは、Label.Text の更新とApplication.DoEventの時間測ってるのと変わらん
93デフォルトの名無しさん (ワッチョイ ca2d-MKW/)
2022/06/23(木) 20:59:14.76ID:pqpGOzkV09464 (ワッチョイ 13ac-sER5)
2022/06/23(木) 21:03:40.24ID:4fvcgSgI095デフォルトの名無しさん (ワッチョイ ca2d-MKW/)
2022/06/23(木) 21:07:01.92ID:pqpGOzkV0 ついでにfunc().ToString(); でも逆転するな
96デフォルトの名無しさん (ワッチョイ ca2d-MKW/)
2022/06/23(木) 21:21:12.73ID:pqpGOzkV0 .NetFramework4.8 Debugビルドにて
■label1.Text = func().ToString();
MethodA: 5480[msec]
MethodB: 48[msec]
■func().ToString()
MethodA: 8[msec]
MethodB: 20[msec]
■func():
MethodA: 7[msec]
MethodB: 18[msec]
■>>91
MethodA: 0[msec]
MethodB: 12[msec]
■label1.Text = func().ToString();
MethodA: 5480[msec]
MethodB: 48[msec]
■func().ToString()
MethodA: 8[msec]
MethodB: 20[msec]
■func():
MethodA: 7[msec]
MethodB: 18[msec]
■>>91
MethodA: 0[msec]
MethodB: 12[msec]
97デフォルトの名無しさん (ワッチョイ ca2d-MKW/)
2022/06/23(木) 22:05:36.69ID:pqpGOzkV0 .NET Core 6.0 Debugビルドにすると
A,Bどちらも4500〜4600msec位で若干ばらつくがほぼ同じ
結局のところ、>>58が正解で、.NET Framework4.8のRandomの挙動の違いで
Textプロパティの内部で処理がスキップされるか否かってことだろうね
Randomの値の検証はもう面倒臭いからやらないけど
A,Bどちらも4500〜4600msec位で若干ばらつくがほぼ同じ
結局のところ、>>58が正解で、.NET Framework4.8のRandomの挙動の違いで
Textプロパティの内部で処理がスキップされるか否かってことだろうね
Randomの値の検証はもう面倒臭いからやらないけど
98デフォルトの名無しさん (ワッチョイ a702-KtZt)
2022/06/23(木) 22:19:46.46ID:ey2ezatM0 まとめるとこうだな
・Label.Textの更新速度がクソ遅いのでRandomの処理時間は誤差
・new Randomで同じ値が返ってきた場合、Label.Textが更新されないから速くなってるだけ
https://referencesource.microsoft.com/#system.windows.forms/winforms/managed/system/winforms/control.cs,4048
・Label.Textの更新速度がクソ遅いのでRandomの処理時間は誤差
・new Randomで同じ値が返ってきた場合、Label.Textが更新されないから速くなってるだけ
https://referencesource.microsoft.com/#system.windows.forms/winforms/managed/system/winforms/control.cs,4048
99デフォルトの名無しさん (ワッチョイ 5b79-LlJt)
2022/06/24(金) 02:50:44.64ID:gZdHgxGE0100デフォルトの名無しさん (ブーイモ MMba-3YOV)
2022/06/24(金) 07:20:28.71ID:fuiDR9PnM 仕様から推測した原因で間違いないか最終的に動作でも確認しといたほうがいいのでは?
パラメータ有りのnew Random(i)したり>>84みたいにカウンタもLabel.Textに反映して
MethodBがMethodAと同様に遅くなれば一件落着
パラメータ有りのnew Random(i)したり>>84みたいにカウンタもLabel.Textに反映して
MethodBがMethodAと同様に遅くなれば一件落着
101デフォルトの名無しさん (ワッチョイ 2324-zXsU)
2022/06/24(金) 09:06:25.48ID:nZzm6L7c0 >>88>>89
結果的に俺が一番最初に指摘した一般論の通りだったな
結果的に俺が一番最初に指摘した一般論の通りだったな
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【フジテレビ】『サン!シャイン』3月で終了 放送わずか1年… 谷原章介MC起用も 視聴率低迷、3%台の壁を越えれず 後継番組はなし [冬月記者★]
- チキンラーメンやカップヌードル、来年4月から5-11%値上げ…袋麺の日清ラ王などは内容量減らす ★2 [蚤の市★]
- 【話題】おでんの好きな具は?! 「だいこん」「たまご」「もち巾着」「ちくわぶ」「こんにゃく」「牛すじ」★2 [ひぃぃ★]
- 【社会】丸亀製麺12月24日は15時30分で閉店 従業員とその家族のため [あずささん★]
- 【文春】松岡昌宏が「日本テレビへの戸惑い」を語った!「鉄腕DASHの出演について、我々に進退を決める選択肢はないんだなと思った」 [Ailuropoda melanoleuca★]
- 売買春は「性を買う側の尊厳も害される」…平口洋法務相… 東大法学部卒、元高級官僚議員の「素顔」とは [少考さん★]
- そろそろダウンタウン+入るべき?
- 森口博子って何してた人なの?
- 中国「共に高市と戦おう」フランス「我々は一つの中国政策を堅持する」 [931948549]
- 大谷翔平をクロスボウで射抜きたいよな
- ハゲだけどおハゲって言わないで
- じゃん拳、グー🏡💥👊😅👊💥🏡
