[過去ログ] ふらっと C#,C♯,C#(初心者用) Part155 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
74(1): デフォルトの名無しさん (ワッチョイ ca2d-MKW/) [sage] 2022/06/23(木) 14:44:45.09 ID:pqpGOzkV0(1/6) AAS
>>69何を根拠にプロパティは遅いって判断したんだ
ただのメソッド呼び出しだぞ
特定のプロパティが遅いのはプロパティの中の実装のせいなので別の話
リフレクションは普通遅くなるはずだが
91(2): デフォルトの名無しさん (ワッチョイ ca2d-MKW/) [sage] 2022/06/23(木) 20:56:11.83 ID:pqpGOzkV0(2/6) AAS
>>5151(8): 41 (ワッチョイ 8341-643o) [] 2022/06/22(水) 22:57:40.86 ID:LVeGoA3E0(1) AAS
みなさんありがとうございます。書いたコードはこんな感じです。
.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);
}
}
皆が指摘してるように余計な処理を省いたら、たぶん、結果が逆転すると思う
(自分の所では逆転して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 ) );
}
93: デフォルトの名無しさん (ワッチョイ ca2d-MKW/) [sage] 2022/06/23(木) 20:59:14.76 ID:pqpGOzkV0(3/6) AAS
>>91ほど変えなくても
>>51の
label1.Text = func().ToString();
を
func();
に置き換えるだけで結果が逆転するな
95: デフォルトの名無しさん (ワッチョイ ca2d-MKW/) [sage] 2022/06/23(木) 21:07:01.92 ID:pqpGOzkV0(4/6) AAS
ついでにfunc().ToString(); でも逆転するな
96: デフォルトの名無しさん (ワッチョイ ca2d-MKW/) [sage] 2022/06/23(木) 21:21:12.73 ID:pqpGOzkV0(5/6) AAS
.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]
97: デフォルトの名無しさん (ワッチョイ ca2d-MKW/) [sage] 2022/06/23(木) 22:05:36.69 ID:pqpGOzkV0(6/6) AAS
.NET Core 6.0 Debugビルドにすると
A,Bどちらも4500〜4600msec位で若干ばらつくがほぼ同じ
結局のところ、>>5858(5): デフォルトの名無しさん (スッププ Sdba-oPsP) [sage] 2022/06/23(木) 00:47:12.21 ID:VlRKcYRwd(2/3) AAS
あと、Bの方は頻繁に同じ値が返ってないか?
Randomの引数なしコンストラクタは現在のミリ秒単位の時刻をシードに設定するから、1ms以内に生成されたRandomオブジェクトは全て同じ結果を返すはず
前述の通りTextプロパティの変更は非常に重いので、値が変わらない場合は実際の変更を省略する実装になっている可能性がある
が正解で、.NET Framework4.8のRandomの挙動の違いで
Textプロパティの内部で処理がスキップされるか否かってことだろうね
Randomの値の検証はもう面倒臭いからやらないけど
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.042s