[過去ログ] ふらっと C#,C♯,C#(初心者用) Part155 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
47: デフォルトの名無しさん (ワッチョイ 2324-zXsU) [sage] 2022/06/22(水) 21:10:25.85 ID:MLZMXa4p0(1/3) AAS
ローカル変数に保持するとかなりの確率でレジスタに入るがstaticフィールドに紐づいてるインスタンスだと逆に絶対にその都度メモリにアクセスすることになる
それもその都度多重ポインタを辿っていく事になるので何度もreadする変数は出来ればローカル変数に一度入れた方が良い
レジスタ利用されずともヒープへのアクセスとスタックへのアクセスじゃ局所性の問題からスタックの方が早いし手間以外にはメリットしかない
53
(2): デフォルトの名無しさん (ワッチョイ 2324-zXsU) [sage] 2022/06/22(水) 23:17:07.34 ID:MLZMXa4p0(2/3) AAS
>>51
51(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);
}
}
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
(1): デフォルトの名無しさん (ワッチョイ 2324-zXsU) [sage] 2022/06/22(水) 23:19:35.02 ID:MLZMXa4p0(3/3) AAS
てかループ枚にToString()を挟んでる時点で後発の方が100倍早くなるのはヒープアロケーション関係だろうね
とりあえずそのコードじゃRandom自体のパフォーマンス差なんてほぼ計れてないと思うよ
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.057s