ふらっと C#,C♯,C#(初心者用) Part155

■ このスレッドは過去ログ倉庫に格納されています
2022/06/17(金) 08:42:12.88ID:CPX9Pfyj0
!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
30デフォルトの名無しさん (ワッチョイ cebb-h11B)
垢版 |
2022/06/22(水) 12:05:02.40ID:PETcyPz40
インターフェイスは、デザインパターンやユニットテストを多少でも知っていないと意味不明だろう
2022/06/22(水) 12:38:55.59ID:+v1vNSu7r
まあ書いてみたときに便利さを実感するわな
32デフォルトの名無しさん (ワッチョイ cebb-h11B)
垢版 |
2022/06/22(水) 12:56:59.75ID:PETcyPz40
どうだろね
数時間で完成する規模のものしか書かないのであれば、記述が増えて不便になったと思うかもしれないし・・・・
2022/06/22(水) 13:00:52.20ID:1cdxoy9qd
実際にはほとんどテストが目的だから、>>29みたいな説明で納得した気になってるとかなりギャップを感じるよね
一方で拡張ポイントを作るためにinterface使う場合は非常に恣意的な設計になるので、これまた>>29のようなメンタルモデルとはだいぶ違う感じになる
34デフォルトの名無しさん (アウアウウー Sa47-vQ73)
垢版 |
2022/06/22(水) 13:58:54.21ID:bIOoQPo7a
JavaとJavaBeansのことか
2022/06/22(水) 15:18:26.16ID:IP7+Sy+B0
>>26
合ってる。
小難しく考えず、要は「俺のこと呼び出すならこれとこれのメソッド実装しとけ」ってこと。
だんだん使いこなせてきて、もうちょっと凝ったことやろうと思うと型制約とかが出てくる
2022/06/22(水) 15:19:46.32ID:pCRUTkSs0
普段意識しないだけで、インターフェースはいたるところにある
判りやすい例がforeachステートメント
あれはListではなくIEnumerableに対してループしている
2022/06/22(水) 15:42:58.01ID:81K3MuoLd
車が家の場合は?
2022/06/22(水) 17:28:55.97ID:A/muOnk30
>>33
インターフェイスの目的がテストってのは違うんじゃね
もともとは多重継承させないための仕組みだろ

もっとも使われてるシーンがテストだってならまあそうかもしれんが

>>36
初心者むけの例であんまり例外的な条件あげつらうののもうどうかとは思うが
じつはforeachはIEnumerable実装してなくても可能なんだがな
2022/06/22(水) 17:54:44.92ID:FYBnfkKla
>>20
石器時代の産物だなw
40デフォルトの名無しさん (ワッチョイ 3b5f-sER5)
垢版 |
2022/06/22(水) 18:10:20.15ID:5Bb+Exnq0
初心者向けなら最初はテストのためって言ってしまっても問題ないと思う

初心者のときに俺が一番ピンときたのは、
ファイル作成や書き込みをテストしたくなったときに使った System.IO.Abstractions だな
ファイルシステム自体を抽象化(IFileSystem)することで
テストの度に実際のファイルをセットアップしなくてもいいことが分かった時は結構感動した
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オブジェクトを都度生成しているので遅そうに思えるのですが。
2022/06/22(水) 19:22:48.61ID:EFlIvheoM
>>41
計測に使ったコード見せて
2022/06/22(水) 19:58:57.85ID:pCRUTkSs0
RandomNumberGenerator.GetInt32の方がおすすめよ
ゲームみたいにシード値を固定にしたい場合はその限りではないけど
速度が欲しい場合はXorshiftもあるんでついでに比較するといい
2022/06/22(水) 20:07:52.96ID:6/q1nl240
C++だと、メンバ変数をループでアクセスしたりすると遅くなるよ
C#も多分変わらんのでは
2022/06/22(水) 20:16:40.07ID:1cdxoy9qd
>>44
そんなもん誤差
Randomクラスが中でどれだけフィールドにアクセスしてると思ってるんだ
2022/06/22(水) 20:19:45.04ID:ITHh+IXJ0
Rレジスタを読むだけじゃないのか
2022/06/22(水) 21:10:25.85ID:MLZMXa4p0
ローカル変数に保持するとかなりの確率でレジスタに入るがstaticフィールドに紐づいてるインスタンスだと逆に絶対にその都度メモリにアクセスすることになる
それもその都度多重ポインタを辿っていく事になるので何度もreadする変数は出来ればローカル変数に一度入れた方が良い
レジスタ利用されずともヒープへのアクセスとスタックへのアクセスじゃ局所性の問題からスタックの方が早いし手間以外にはメリットしかない
2022/06/22(水) 21:42:35.06ID:XpS14TAH0
>>41
計測してみたけどBのほうが圧倒的に遅かった
2022/06/22(水) 21:49:22.91ID:XpS14TAH0
環境で最適化内容に差があったりするのかな?
コード貼っておくので計測してみて
https://dotnetfiddle.net/Fesi8q
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);
}
}
2022/06/22(水) 23:12:43.31ID:BDP06NEh0
AとBの実行順は変えてみた?
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();
2022/06/22(水) 23:19:35.02ID:MLZMXa4p0
てかループ枚にToString()を挟んでる時点で後発の方が100倍早くなるのはヒープアロケーション関係だろうね
とりあえずそのコードじゃRandom自体のパフォーマンス差なんてほぼ計れてないと思うよ
2022/06/22(水) 23:50:09.49ID:XpS14TAH0
>>51
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の使い方が正しくないとかは、いったん置いておいて、
なぜこれほど差が出るのかが知りたいです。
気づかずに遅い実装をしない為には、何に気を付ければ良いのかが知りたいです。
2022/06/23(木) 00:40:24.63ID:VlRKcYRwd
Textプロパティは>>53も指摘している通りクソ遅いから>>53の言うとおりに直しなさい
2022/06/23(木) 00:47:12.21ID:VlRKcYRwd
あと、Bの方は頻繁に同じ値が返ってないか?
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;} も用意すること
2022/06/23(木) 02:12:34.18ID:3EmxumxM0
>>56
かかってる時間を見るとBが最適化されて速いというわけじゃなくAが異常に遅いんだね
コードからはなんでそんな遅くなるのか全然わからないから絞り込んでいって切り分けるかプロファイリングするかかな

それ以外で簡単にできるものだと
A、B、A、B、A、Bと3回ずつ回して差をみる
FormじゃなくCLIでやってみる
BenchmarkDotNetで計測してみる
とか
2022/06/23(木) 09:47:54.73ID:d0910tAHM
Randomより遅い処理色々混ざってるから計測になってない
計測したい処理を完全に独立したメソッドにしてBenchmarkDotNetで測れ
2022/06/23(木) 10:02:19.23ID:VlRKcYRwd
>>61
公の場でのベンチマークにそういう変なライブラリを使うのは悪手
使う側にもその結果を検証する側にも不要な疑念が生じて、ソースを見ることになり結局時間の無駄
2022/06/23(木) 10:04:16.16ID:uYSGjbtO0
公の場?
2022/06/23(木) 10:59:37.96ID:uYSGjbtO0
いわゆる.NETだと(だっけ)プロパティへのアクセスが遅くなるっていうハナシじゃないん?
どうしてもならリフレクションとかでどうにかこうにかするとか、そういう話だった気はする
2022/06/23(木) 11:05:10.95ID:szzSpCywM
いわゆらない.NETの話はこのスレで出てくるのか?
2022/06/23(木) 11:22:03.54ID:/qnvtXmgM
>>58
これだろうな
2022/06/23(木) 11:43:08.08ID:6zHFEOYgM
>>64
そういうレベルの話じゃなくて、Control.Textは内部でWinAPIを呼んでいてビチグソ遅い
2022/06/23(木) 12:07:07.81ID:3EmxumxM0
>>58, 66
なるほど納得
俺環で再現しなかったのはFrameworkのバージョン違いが原因だった
.NET Core以降は1ms以内でもシードが変わるようになってる
2022/06/23(木) 12:13:05.94ID:uYSGjbtO0
コンソールアプリでも似たような結果になったんだが気のせいかな?(4.8)
ちなみにrandom使わずにやってみても同じ(intの和)

プロパティへのアクセスだなあとワイは思うけどどやろね
2022/06/23(木) 12:14:45.20ID:/osWwN6CM
>>62
公ってなんだよw
.NETの速度を売りにしてるライブラリは大体これ使ってる
2022/06/23(木) 12:17:22.87ID:jvSS+4eW0
基本的に出力は重い
Console.WriteLineですらただの数値計算と比べると圧倒的に重い
Controlの操作は>>67が言うように内部でSendMessageが走るので更にめちゃくちゃ重い
2022/06/23(木) 14:13:54.26ID:uYSGjbtO0
コンソールアプリ、BenchmarkDotNetでやってみたら大して変わらんかったわ
Randomじゃなくてintの和でも同じ傾向
速度の違いはデバッグ時の状況の影響かもね

ちなControl.Textがうんたらの人たちは、ただの改善おじさんやな
比較の話で共通部分のコード直せって意味わからんわな
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);
2022/06/23(木) 14:44:45.09ID:pqpGOzkV0
>>69
何を根拠にプロパティは遅いって判断したんだ
ただのメソッド呼び出しだぞ
特定のプロパティが遅いのはプロパティの中の実装のせいなので別の話
リフレクションは普通遅くなるはずだが
2022/06/23(木) 14:53:28.22ID:uYSGjbtO0
>>74
ワイの勘違いだったわ
2022/06/23(木) 15:31:00.54ID:te570uEsM
>>73
このintの和のケースではBは最適化が効いて return 5; になっていると思われる
Randomでは同様の最適化はできないはずだから状況が違う
2022/06/23(木) 15:31:31.06ID:te570uEsM
訂正
return 10;
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~も多分違うんじゃないかなとはこれで思う
2022/06/23(木) 16:15:51.40ID:te570uEsM
>>78
切り分けの仕方が不適切なんだよ
>>51のコードではボトルネックは明らかにTextやToStringやRandomの実装にあり、フィールドアクセスの有無やプロパティ自体のオーバーヘッドなんか誤差
>>73のような超マイクロベンチマークとは測ってるものが全然違うわけ
その処理時間の大小が定性的に同じだったとしても、それは恐らく偶然
定量的に評価しないと意味がない
2022/06/23(木) 16:30:56.77ID:6J8EAy2kr
いやそれはなんのために言ってるわけ?
メソッドの実装の仕方の違いからくる性能差の疑問を解決したいだろう51に対して、
何を言いたいん?
「これじゃ分かんねえよ」とでも言いたいの?なら引っ込んでれば?
こっちは自分の予想を自分で検証してその植えでその誤りも認めたんやから

何もせず考えもせずわかんねえって言ってるだけやん
予想があるなら検証してコードもだしてくれよん?
2022/06/23(木) 17:45:34.11ID:jvSS+4eW0
>>72
全く違う
他で大きく時間使われるところがあると大数の法則的な感じで軽い部分が圧倒的母数によって覆い隠されてしまう
特にGCやシステムコールは常に一定速度とは限らないから、そういう処理を挟めば挟むほど誤差が大きくなってすぐに終わる軽微な処理差が覆い隠されてしまう
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);
}
}
2022/06/23(木) 18:09:26.02ID:ey2ezatM0
とりあえず64がアホだという事は判る
2022/06/23(木) 18:14:56.67ID:3EmxumxM0
label1.Text = func().ToString();を
label1.Text = $”{i}: {func().ToString()}”;にでもすれば
>>58が書いてる内容が原因かどうかはっきりわかるでしょ
2022/06/23(木) 18:19:33.38ID:4fvcgSgI0
>>81
何が全く違うんやねん
一般論はいいけど、それが51の言ってるAとBの差の理由になるのは何なのよっていうことじゃん?
まあそもそも51のコードにそこまでの差が出るのかどうかも今のワイは知らん立場やが

51はBのほうが速くなってるから疑問なんやろ、まあ他のコードのとこに依存ありそうで気になるな
2022/06/23(木) 18:21:37.32ID:4fvcgSgI0
>>82
まあ正直今どきRandom使うなとはワイも思ったw
2022/06/23(木) 18:41:00.93ID:jvSS+4eW0
>>85
ん?5chって一般論話す場だろ
そりゃ自分でベンチ計れば結論出せるけどそんなことする義理はない一方で一般論レスするのは5秒で終わるし
2022/06/23(木) 19:08:45.37ID:4fvcgSgI0
>>87
しょうもな、わからないんやろ、引っ込んでて
2022/06/23(木) 19:40:58.09ID:1Th4d0L20
>5chって一般論話す場だろ
初めて聞いたわ。
ここ技術系の板だぜ。個別問題に一般論しか返せないなら邪魔だから黙ってろ
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 |
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 ) );
}
2022/06/23(木) 20:58:51.74ID:ey2ezatM0
少なくとも >>51 のコードでは、Label.Text の更新とApplication.DoEventの時間測ってるのと変わらん
2022/06/23(木) 20:59:14.76ID:pqpGOzkV0
>>91ほど変えなくても
>>51
label1.Text = func().ToString();

func();
に置き換えるだけで結果が逆転するな
2022/06/23(木) 21:03:40.24ID:4fvcgSgI0
>>90
やっぱ差異あってもその程度だよなあ
これだけで 2000ms とか差が出るのは考えにくいよなあ
2022/06/23(木) 21:07:01.92ID:pqpGOzkV0
ついでにfunc().ToString(); でも逆転するな
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]
2022/06/23(木) 22:05:36.69ID:pqpGOzkV0
.NET Core 6.0 Debugビルドにすると
A,Bどちらも4500〜4600msec位で若干ばらつくがほぼ同じ

結局のところ、>>58が正解で、.NET Framework4.8のRandomの挙動の違いで
Textプロパティの内部で処理がスキップされるか否かってことだろうね
Randomの値の検証はもう面倒臭いからやらないけど
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
2022/06/24(金) 02:50:44.64ID:gZdHgxGE0
>>98
ギャハハハw
難しいなw
2022/06/24(金) 07:20:28.71ID:fuiDR9PnM
仕様から推測した原因で間違いないか最終的に動作でも確認しといたほうがいいのでは?

パラメータ有りのnew Random(i)したり>>84みたいにカウンタもLabel.Textに反映して
MethodBがMethodAと同様に遅くなれば一件落着
2022/06/24(金) 09:06:25.48ID:nZzm6L7c0
>>88>>89
結果的に俺が一番最初に指摘した一般論の通りだったな
2022/06/24(金) 09:10:29.92ID:ec4i6GcX0
>>101
お前何もしてないじゃん
2022/06/24(金) 09:14:09.95ID:nZzm6L7c0
>>102
>>98が言ってる上記の結論をこのスレで一番最初に指摘したけど
2022/06/24(金) 09:17:32.89ID:ec4i6GcX0
検証してくれたのは違う人じゃん
なに自分の手柄にしてんの
2022/06/24(金) 09:27:01.49ID:nZzm6L7c0
>>104
単なる数値計算と比べて出力が激重なんてことは検証しなくても分かる程度に明らかな事だからな
実際俺以外にもちらほら指摘しとる奴おるし
せっかくただのint結果に小分けされてるものを毎回出力に紐づけるとか発想がスタティックおっさんと同レベルだからオブジェクト指向プログラミング向いてないで
2022/06/24(金) 09:46:49.82ID:ec4i6GcX0
>>105
しょうもな、後からならなんとでも言えるから
2022/06/24(金) 09:58:54.60ID:VlIywyIA0
> ちなControl.Textがうんたらの人たちは、ただの改善おじさんやな
> 比較の話で共通部分のコード直せって意味わからんわな
2022/06/24(金) 10:03:47.04ID:ec4i6GcX0
>>107
それは誤りやったな、51には悪いことしたわ
そんときはTextの仕様知らんかったでな
他のやつは98の提示があって始めて証明できてたな
2022/06/24(金) 12:18:00.54ID:p+qJoCDWM
普段から速度意識してプログラミングしてない奴は、出力が遅いという当たり前の事を知らない事は良くある
そう言う奴には口で言っても感覚的に理解出来んから数字を見せるのが一番早い
2022/06/24(金) 12:58:40.19ID:kHrWfcT90
>>103
お前が言ったのは一般論の可能性だ

結果的にそれが正しかったとしても
それを個別事例に当てはめて検証したのは別の人だろ

ちなみに今回の原因は、コントロールのアクセスや出力が遅いことじゃないんだぜ
それならAもBも同じだけ遅くて差が出る原因にならんからな
2022/06/24(金) 13:05:30.94ID:VlIywyIA0
誰が原因を解明したかなんて質問者からすればどうでもいい話である
醜い
2022/06/24(金) 13:19:04.19ID:tHNubtgb0
出力が遅いとか条件次第でスキップする仕様等を知らなくても、
計測を目的としたループの中には対象(今回はRandom)以外の処理はなるべく入れない
と言う原則を守っていれば避けられた話だな。
2022/06/24(金) 13:26:09.89ID:kHrWfcT90
いや、そもそもRandomの速度を測定したいって話じゃないだろ、これ
2022/06/24(金) 14:24:15.51ID:nZzm6L7c0
>>110
実際に検証した人がGJであることは別に否定してないが?
大本の原因は同一インスタンスでは1ms以内だとシードが変わらない&同一文字列だと出力更新が成されないって事だったようだが、
「毎回newする vs インスタンス使いまわし」という本来質問者が意図してたであろうこの差を調べたいってことであればControl.Textへの代入を挟むと、本来調べたいヵ所が誤差に収斂してしまって調査不可能になるって結論だろ
そしてStopwatchクラスで順次調査すると順番によって速度が変わるなんてことは往々にしてあるから必ずしも「AもBも同じだけ遅くなる」とは限らないってこともちゃんと指摘してる
2022/06/24(金) 14:27:59.50ID:tEJIL7500
最初に指摘出来てぼくちゃんえらいでちゅねぇ
2022/06/24(金) 15:42:06.42ID:kHrWfcT90
>>114
>本来質問者が意図してたであろうこの差を調べたい
ああ、そもそもの食い違いはそこか
別にお前の指摘内容を個別にみれば間違ってるとは言わんが
インスタンス生成の速度みたいとか勝手な想像でしかないな

本来の質問者のベンチの意図は不明なんだがな
インスタンスの生成の差を見たかったのか、ローカル変数とクラス変数の速度差をみたかったのか
違う要因で速度計測してて最終的にあのコードまで落ちたのか

結果として予想と違うけど原因は何かって質問だぜ
質問した意図はボトルネックなコードは避けたいって話だったし
2022/06/24(金) 15:56:21.70ID:0JrGBM9l0
雑ッッッッッ魚
2022/06/24(金) 17:24:37.81ID:VlIywyIA0
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
2022/06/24(金) 17:51:39.39ID:MtTs9G+lM
解決したんだからしょーもない事で喧嘩するなよw
2022/06/24(金) 18:14:27.28ID:NAI/rIyW0
元の質問者はもうこの流れ見て逃げてるかもしらんけど、
計測方法自体が間違ってると色々な人を混乱に陥れるので、
これからは、本当に計測したい部分以外の余計な要素を全て排除して
正しい方法で測って欲しいと思うw
2022/06/24(金) 19:22:50.70ID:nn4VojDf0
論点がズレて喧嘩始まるのはこの板の名物だな
2022/06/24(金) 22:04:14.69ID:3GxA+CY50
ワイだの草だの言ってんのみると、まとめキッズが大量に流入してきてるしな
2022/06/25(土) 12:00:40.04ID:Fily2x+h0
顧客の意図を汲んで問題を分析して解を出す速度もこの業界では重要スキルだからこれからも精進したまえ
2022/06/25(土) 12:03:57.86ID:1xFYE0ZgM
昔わざと炎上させて残業代を狙うやつがいて非常に厄介だった
2022/06/25(土) 21:08:15.68ID:YzwccikL0
非同期処理について質問なんですけど、taskを受け取ってその状態を見て処理が終わってるかどうかチェックして…みたいな感じじゃないですか
例えば通常の関数だったら、戻り値を受け取るのは呼び出した関数の処理が終わって、そこで初めてですよね
でも非同期だと処理終わってないのに戻り値が渡されちゃうって認識でいいですか?そして渡されたあとも進行状況に応じて変化し続けると
2022/06/25(土) 21:36:39.54ID:MoozsICfd
>>125
処理が終わっているかどうかのチェックなんかしない
Taskを受け取ったら、Taskに対して「完了後に次に実行したい処理」を登録する
そして完了後に次の処理を呼び出すのはTaskを返す側の責任であり、受け取った側は気にしない
次の処理が登録された時点で既にTaskが完了していれば次の処理がすぐ呼ばれるかもしれないし、数秒後かもしれない
非同期処理とはそういうもの
2022/06/25(土) 21:42:23.39ID:zqnvknwe0
>>125
> 非同期だと処理終わってないのに戻り値が渡されちゃうって認識でいいですか?
非同期メソッドを呼んで戻ってきてるのは戻り値を戻す処理を実行してるTask<TResult>であって、
その時点で戻り値が渡されている訳ではないよ。
Taskが終了した時点でResultに結果が格納されるが、
普通はTaskを直接弄ったりせず、awaitで待って結果を受け取る。
2022/06/25(土) 22:53:30.13ID:YzwccikL0
>>非同期メソッドを呼んで戻ってきてるのは戻り値を戻す処理を実行してるTask<TResult>であって、
ここと
>>その時点で戻り値が渡されている訳ではないよ。
ここのつながりがよくわからないのです
1行目でTask<TResult>型の戻り値が戻ってますよね
それなのに戻り値が渡されていないというのはどういうことでしょうか

あとiscompletedプロパティで終了しているかを判断するのは一般的ではないのですか?
2022/06/25(土) 23:06:32.65ID:dWIrjb1E0
>>128
Taskは作業管理機であって結果ではない
task.Resultをして初めて結果を取り出せる
task.Resultを呼び出す前に作業が完了していれば即戻り値を得られるし、そうじゃないなら内部でwhile (!isComplited) Sleep(1);みたいな事をして作業が終わるまで待機した後に得られる
「作業が終わっていたら結果を貰う、そうじゃなければ別の事をする」っていうシーンに限りIsComplitedで確認する(Resultを使うと終わるまで強制的に待機させられるため)
大抵の場合は「Task投げる→他の事する→Task結果を受け取る」って言う一本道なのでIsComplitedをせずにResultでそのまま貰うことが多い
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況