Start Debugging

Etiqueta: comparison

72 posts · Página1de8

iterador con yield return vs devolver una List<T>: lo que realmente cuesta un método IEnumerable en C#
Un método con yield return cuesta un objeto de máquina de estados de 40 bytes por llamada, sin importar cuántos elementos produzca; una List<T> cuesta todo el arreglo interno por adelantado. Medido en .NET 10.0.10: el iterador gana en memoria y en salida anticipada, List<T> gana cuando el llamador enumera más de una vez, necesita Count o llama a ToList().
Setter de FileSystemInfo.LastWriteTime vs File.SetLastWriteTime en .NET
Ambos terminan en la misma llamada al sistema operativo, así que la marca de tiempo que se escribe es idéntica. Las diferencias están alrededor: qué caché se invalida, si los directorios funcionan en Windows, cómo se convierte un DateTime que no es UTC y si puedes apuntar a un handle abierto. Usa File.SetLastWriteTimeUtc, por handle cuando el archivo está abierto. Verificado en .NET 10.0.10.
Bucle con ref T vs indexación de Span<T> en C#: por qué la versión con span es igual de rápida o más en .NET 10
En .NET 10, un bucle for normal sobre span[i] acotado por span.Length se compila a un bucle sin comprobación de límites, con reducción de intensidad y cuenta regresiva. Un bucle escrito a mano con Unsafe.Add(ref r, i) y un índice int conserva una extensión de signo y una comparación con cuenta progresiva, y midió entre 2 y 5% más lento. Benchmarks y desensamblado del JIT para arm64 y x64 en .NET 10.0.10.
shared_preferences vs un archivo JSON con path_provider para guardar ajustes en Flutter
Usa shared_preferences (SharedPreferencesWithCache) para un puñado de flags planos y un archivo JSON en getApplicationSupportDirectory para un objeto de ajustes estructurado. Cubre el patrón de escritura atómica, la condición de carrera de los guardados concurrentes, la trampa de la carpeta Documentos en Windows y Linux, el soporte web y costos de escritura medidos en Flutter 3.44.8.
Lazy<T> vs LazyInitializer.EnsureInitialized vs double-checked locking en C#
Usa Lazy<T> por defecto: ejecuta la factory una sola vez, almacena en caché las excepciones y sus lecturas son demasiado baratas para medirlas tras la inicialización. Usa LazyInitializer.EnsureInitialized cuando inicializas de forma diferida muchos campos o posiciones de un arreglo y no puedes pagar un objeto extra por valor. El double-checked locking escrito a mano casi nunca vale la pena en .NET 10.
FileSystemWatcher vs sondeo para detectar cambios de archivos en un recurso compartido de red en .NET
En un recurso compartido SMB o NFS, el sondeo es la fuente de verdad y FileSystemWatcher es, como mucho, una pista. FileSystemWatcher no detecta los cambios remotos en Linux y macOS, desborda su búfer de red de 64 KB y se detiene para siempre cuando se cae la conexión. Usa una comparación periódica de instantáneas y deja que el watcher solo adelante un escaneo. Verificado en .NET 10.0.10.
Siguiente