Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

133
Views
¿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 answers
Answer question

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

Permítanme simplificar un poco su 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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!