Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

195
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda