Start Debugging

タグ: comparison

72 件 · ページ1/8

yield return イテレーターと List<T> を返す方法の比較: C# で IEnumerable を返すメソッドの本当のコスト
yield return メソッドは、生成する要素数に関係なく、呼び出しごとに 40 バイトのステートマシンオブジェクト 1 つ分のコストがかかります。List<T> は内部配列全体を先に確保します。.NET 10.0.10 で計測した結果、メモリと早期終了ではイテレーターが有利で、呼び出し側が複数回列挙する場合、Count が必要な場合、ToList() を呼ぶ場合は List<T> が有利でした。
.NET における FileSystemInfo.LastWriteTime セッターと File.SetLastWriteTime の違い
どちらも最終的には同じ OS 呼び出しに行き着くため、書き込まれるタイムスタンプは同一です。違いはその周辺にあります。どのキャッシュが無効化されるか、Windows でディレクトリを扱えるか、UTC 以外の DateTime がどう変換されるか、開いているハンドルを対象にできるか、です。File.SetLastWriteTimeUtc を使い、ファイルが開いている場合はハンドル経由で設定してください。.NET 10.0.10 で検証済みです。
C# の ref T ループと Span<T> インデックスの比較: .NET 10 で Span 版が同等以上に速い理由
.NET 10 では、span.Length を上限にした単純な for ループ span[i] は、境界チェックなし、ストレングスリダクション済み、カウントダウン形式のループにコンパイルされます。int インデックスで手書きした Unsafe.Add(ref r, i) ループは符号拡張と加算方向の比較が残り、計測では 2 から 5% 遅くなりました。.NET 10.0.10 の arm64 と x64 のベンチマークと JIT 逆アセンブルを紹介します。
Flutter の設定保存に shared_preferences と path_provider の JSON ファイルのどちらを使うべきか
少数のフラットなフラグには shared_preferences (SharedPreferencesWithCache) を、構造化された設定オブジェクトには getApplicationSupportDirectory に置く JSON ファイルを使います。アトミックな書き込みパターン、同時保存の競合状態、Windows と Linux での Documents フォルダーの罠、Web 対応、Flutter 3.44.8 で計測した書き込みコストを解説します。
Flutter の Expanded と Flexible の違い: FlexFit.tight と FlexFit.loose を解説
子ウィジェットが Row や Column 内の自分の割り当て分を埋める必要があるなら Expanded、割り当て分より小さくてもよいなら Flexible を使います。Flutter 3.44 での実測レイアウトで、余った領域の行き先、loose な子が兄弟に領域を譲らない理由、無制限の制約下で Flexible だけが使える場面を確認します。
C# の Lazy<T>、LazyInitializer.EnsureInitialized、ダブルチェックロッキングの比較
基本は Lazy<T> を使ってください。ファクトリを 1 回だけ実行し、例外をキャッシュし、初期化後の読み取りは計測できないほど軽量です。多数のフィールドや配列スロットを遅延初期化していて、値ごとの追加オブジェクトを避けたい場合は LazyInitializer.EnsureInitialized を使います。手書きのダブルチェックロッキングは、.NET 10 ではほとんど割に合いません。
FileSystemWatcher とポーリングの比較: .NET でネットワーク共有上のファイル変更を検出する
SMB や NFS の共有では、ポーリングが信頼できる情報源であり、FileSystemWatcher はせいぜいヒントにすぎません。FileSystemWatcher は Linux と macOS ではリモートの変更を見逃し、ネットワーク上の 64 KB バッファーであふれ、接続が切れると完全に停止します。定期的なスナップショットの差分を使い、ウォッチャーは早めのスキャンを促すだけにしてください。.NET 10.0.10 で検証済みです。
C# で待機するときの Thread.Sleep と Task.Delay と SpinWait の違い
非同期コードでの時間指定の待機には await Task.Delay を使い、Thread.Sleep は自分が所有する専用スレッドでのみ使い、SpinWait はロックフリーのコード内でのマイクロ秒未満の待機にだけ使います。条件を待つ場合は、この 3 つではなくシグナル (ManualResetEventSlim、SemaphoreSlim、TaskCompletionSource) を使ってください。.NET 10.0.10 で計測しています。
EF Core のクエリを並列実行するための AddDbContextPool と AddDbContextFactory の比較
AddDbContextPool は DI スコープごとに 1 つのスコープ付き DbContext を渡すため、2 つのクエリを同時に実行できません。AddDbContextFactory と AddPooledDbContextFactory は呼び出しごとにコンテキストを返すので、並列クエリに向いています。EF Core 11 RC 1 での計測では、プール付きファクトリはコンテキストを 342 ns、40 B で作成しますが、プールなしでは 17 us、44 KB かかります。
次へ