Me di cuenta esa implementación de una fórmula usa goto, y eso me hizo pensar : ¿es más lenta que otras construcciones de control de flujo?
goto
no será más lento que cualquier otro mecanismo de control de flujo. Es, como la mayoría de los mecanismos de control de flujo compilados en una instrucción br.s
(o similar) MSIL. Sin embargo, hay algunas situaciones donde goto
puede ser un poco más rápido. En su mayoría se limitan a situaciones que implican el uso de break
y continue
dentro de bucles anidados. Considera el siguiente código.
bool condition = false;
for (int i = 0; i < BigNumber; i++)
{
for (int j = 0; j < i; j++)
{
for (int k = 0; k < j; k++)
{
condition = Evaluate(i, j, k);
if (condition)
{
// break out of everything
}
}
}
}
Existen diferentes formas en que se puede salir de todo. Aquí hay un método.
bool condition = false;
for (int i = 0; i < BigNumber; i++)
{
for (int j = 0; j < i; j++)
{
for (int k = 0; k < j; k++)
{
condition = Evaluate(i, j, k);
if (condition) break;
}
if (condition) break;
}
if (condition) break;
}
El problema es que cada bucle debe comprobar la bandera condition
. Podríamos refactorizar esto con un goto
para hacerlo un poco más eficiente y un poco más elegante para arrancar.
for (int i = 0; i < BigNumber; i++)
{
for (int j = 0; j < i; j++)
{
for (int k = 0; k < j; k++)
{
if (Evaluate(i, j, k)) goto BAILOUT;
}
}
}
BAILOUT:
Por favor hazte un favor y no uses goto en C# !!! – MUG4N
@ MUG4N No hay nada de malo con los goto, es cómo los usas que los hacen malvados – GETah
@GETah Y son muy raramente usados de manera responsable, y hay muy poco valor en usarlos sobre las alternativas, entonces, ¿por qué tomar los riesgos? – Servy