Design a site like this with WordPress.com
Get started

El antipatrón “desenrollando switchs”

Las técnicas de desenrollado de bulces las usan los compiladores para optimizar el pipeline de los procesadores para aprovechar los huecos de las unidades funcionales disponibles y evitar que éstas estén ociosas y aumentando así el paralelismo del código consiguiendo de esta forma reducir el CPI.

Sin embargo nos empeñamos en una y otra vez todo ese conocimiento con código como este:

enum Axis
{
    XAxis,
    YAxis,
    ZAxis,
};
// code earlier in the function ensure that
// "axis" is always a valid axis
int newPosition;
switch (axis)
{
case XAxis:
     newPosition = m_position[XAxis] + amount;
     if (newPosition < m_minPosition[XAxis])
         newPosition = m_minPosition[XAxis];
     if (newPosition > m_maxPosition[XAxis])
         newPosition = m_maxPosition[XAxis];
     m_position[XAxis] = amount;
break;
case YAxis:
     newPosition = m_position[YAxis] + amount;
     if (newPosition < m_minPosition[YAxis])
         newPosition = m_minPosition[YAxis];
     if (newPosition > m_maxPosition[YAxis])
         newPosition = m_maxPosition[YAxis];
     m_position[YAxis] = amount;
break;
case ZAxis:
     newPosition = m_position[ZAxis] + amount;
     if (newPosition < m_minPosition[ZAxis])
        newPosition = m_minPosition[ZAxis];
     if (newPosition > m_maxPosition[ZAxis])
        newPosition = m_maxPosition[ZAxis];
     m_position[ZAxis] = amount;
break;
}

(me pregunto cuantas veces he escrito código así)

Empujados por saber que el código específico es más rápido que el código de propósito general, algunas veces no nos damos cuenta de que este mismo trozo de código se podría haber escrito de esta manera:

newPosition = m_position[axis] + amount;
if (newPosition &lt; m_minPosition[axis])
   newPosition = m_minPosition[axis];
if (newPosition &gt; m_maxPosition[axis])
   newPosition = m_maxPosition[axis];
m_position[axis] = amount;

Lo malo del switch primero que vimos es que no es fácil distinguir rápidamente si es un “error” del típico “copy&paste que queda nada para salir y me tengo que ir a casa” o hay algo escondido y sutil que hace de este código un ejemplo de libro.

Espero que os sirva.

Juan María Laó Ramos

Author: Juanma

Bueno, como reza el título de este blog y de las cosas que iré escribiendo ya os hareis una idea de cómo soy.

2 thoughts on “El antipatrón “desenrollando switchs””

  1. El que copió y pegó estaría de viernes a última hora y se dejó por reemplazar un par de XAxis por unos ZAxis :).

    Que por cierto, una asignación con un menor qué y otra asignación con un mayor qué, huelen a “clamp” (que evita mogollón de redundancias y permite montarlo para tipos vectoriales).

    Position = Math.Clamp(Position + Amount, Min, Max);

    http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml
    http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper.clamp.aspx
    http://docs.go-mono.com/?link=M%3aOpenTK.Vector3.Clamp(OpenTK.Vector3%40%2cOpenTK.Vector3%40%2cOpenTK.Vector3%40%2cOpenTK.Vector3%40)

    Like

  2. El que copió y pegó estaría de viernes a última hora y se dejó por reemplazar un par de XAxis por unos ZAxis :).

    Que por cierto, una asignación con un menor qué y otra asignación con un mayor qué, huelen a “clamp” (que evita mogollón de redundancias y permite montarlo para tipos vectoriales).

    Position = Math.Clamp(Position + Amount, Min, Max);

    http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml
    http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper.clamp.aspx
    http://docs.go-mono.com/?link=M%3aOpenTK.Vector3.Clamp(OpenTK.Vector3%40%2cOpenTK.Vector3%40%2cOpenTK.Vector3%40%2cOpenTK.Vector3%40)

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: