Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

201
Vistas
¿Se pueden usar out y ref como variables temporales?

Cuando usamos cálculos externos o internos , con múltiples asignaciones y lecturas, ¿qué inconvenientes tiene? ¿Perjudicará el rendimiento?

 static bool TrySomeFunction(int x, int y, out int result) { result = 8; for (int i = 0; i < x; i++) { result += result + x; if (result == y) return false; } return true; }

O deberíamos usar una variable adicional:

 static bool TrySomeFunction(int x, int y, out int result) { int temp = 8; for (int i = 0; i < x; i++) { temp += temp + x; if (temp == y) { result = 0; return false; } } result = temp; return true; }

Actualización: cambió el nombre de la función de SomeFunction para que sea más claro para el uso previsto.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Resulta que cuantos más cálculos hacemos, mayor es la diferencia entre el rendimiento de ambos.

Creo que esto es de esperar, ya que aquí vemos un nivel extra de indirección. Las operaciones ldind y stind se usan para obtener/establecer el valor del parámetro out (indirectamente) y ldoc con stloc se usa para obtener/establecer valores para las variables locales.

Creo que el compilador no puede hacer ninguna optimización aquí (al menos convertir UseOutExtensively a DontUseOutExtensively ), porque esto podría cambiar el comportamiento del método si algún otro subproceso escribe en la ubicación del parámetro out al mismo tiempo que se ejecuta la función.

Prueba

Déjame simplificar un poco tu función para que nos concentremos solo en lo que nos interesa:

 void UseOutExtensively(out int result) { result = 0; for (int i = 0; i < 100; i++) { int temp = result; result = temp; } } void DontUseOutExtensively(out int result) { int temp = 8; for (int i = 0; i < 100; i++) { int anotherTemp = temp; temp = anotherTemp; } result = temp; }

Entonces, las funciones no hacen nada útil, simplemente intercambian el mismo valor entre las variables. Por lo tanto, no tenemos adiciones y condiciones complejas, solo obtener/establecer una variable out y obtener/establecer una variable local.

Así que el programa de prueba es el siguiente:

 int Iterations = 10000000; // we'll try 10^7, 10^8 && 10^9 Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < Iterations; i++) UseOutExtensively(out int result); Console.WriteLine("Using out extensively: {0}", sw.ElapsedMilliseconds); sw = Stopwatch.StartNew(); for (int i = 0; i < Iterations; i++) DontUseOutExtensively(out int result); Console.WriteLine("Don't use out extensively: {0}", sw.ElapsedMilliseconds);

Resultados:

iteraciones UseOutExtensively No Usar Extensivamente
10^7 918 330
10^8 8850 3331
10^9 92009 34823

Vemos que cuantas más operaciones realizamos, más se nota la diferencia en el rendimiento.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda