es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El bucle foreach de C# es cómicamente más lento que el bucle for en un RaspberryPi.

Estaba probando una aplicación .NET en una RaspberryPi y mientras que cada iteración de ese programa tomó 500 milisegundos en una laptop con Windows, lo mismo tomó 5 segundos en una RaspberryPi. Después de algunos errores, encontré que la mayoría de ese tiempo se estaba gastando en un bucle foreach que concatenaba cadenas.

Editar 1: Para aclarar, ese tiempo de 500 ms y 5 s que mencioné fue el tiempo de todo el bucle. Colocó un temporizador antes del bucle y detuvo el temporizador después de que el bucle había terminado. Y, el número de iteraciones es el mismo en ambos, 1000.

Editar 2: Para medir el bucle, usé la respuesta mencionada aquí.

private static string ComposeRegs(List<list_of_bytes> registers)
{
    string ret = string.Empty;
    foreach (list_of_bytes register in registers)
    {
        ret += Convert.ToString(register.RegisterValue) + ",";
    }
    return ret;
}

De la nada, reemplacé el foreach con un bucle for, y de repente comenzó a tardar casi el mismo tiempo que en la laptop. De 500 a 600 milisegundos.

private static string ComposeRegs(List<list_of_bytes> registers)
{
    string ret = string.Empty;
    for (UInt16 i = 0; i < 1000; i++)
    {
        ret += Convert.ToString(registers[i].RegisterValue) + ",";
    }
    return ret;
}

¿Debería siempre usar bucles for en lugar de foreach? ¿O fue solo un escenario en el que un bucle for es mucho más rápido que un bucle foreach?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    En el escenario descrito, parece que el uso de un bucle for en lugar de un bucle foreach hizo una diferencia significativa en el tiempo de ejecución del programa. Sin embargo, esto puede no ser siempre el caso.

    La razón de la diferencia en el tiempo de ejecución probablemente se deba al hecho de que el operador += utilizado en el bucle foreach para concatenar cadenas crea un nuevo objeto de cadena cada vez que se utiliza. Esto puede llevar a la creación de un gran número de objetos de cadena y, por lo tanto, a la ralentización del programa.

    Por otro lado, el uso de un bucle for con el operador += solo crea el mismo objeto de cadena mientras itera a través de cada índice del bucle, reduciendo así la sobrecarga de la creación de nuevos objetos de cadena.

    Por lo tanto, en situaciones en las que se requiere la concatenación de cadenas dentro de un bucle, puede ser mejor utilizar un bucle for en lugar de un bucle foreach. Sin embargo, esto puede no ser siempre el caso, y es importante probar y optimizar su código para el caso de uso específico.

Comments are closed.