¿Es x += 1 más eficiente que x = x + 1?

5 minutos de lectura

¿Es x 1 mas eficiente que x
usuario7

En x = x + 1es x evaluado dos veces? Si es así, ¿eso significa en x += 1, x solo se evalúa una vez? ¿Cómo se evalúan las dos expresiones en términos de código intermedio del compilador?

Por ejemplo, x++ podría significar: tomar la ubicación de xcargar el contenido de x en un registro e incrementar el valor de x en memoria.

tambien he leido eso x += 1 es útil cuando x no es una variable simple, sino una expresión que involucra una matriz. ¿Alguna idea de por qué este es el caso?

  • Esto suena como un montón de suposiciones infundadas, en particular el título. No veo una razón por la que uno deba ser más eficiente que el otro y estoy razonablemente seguro de que no es el caso en la mayoría de los compiladores de C.

    – Konrad Rodolfo

    19 de septiembre de 2011 a las 13:44

  • Un compilador que vale el dinero que pagó compilará ambas expresiones en el mismo código objeto. Si le preocupa el rendimiento: la medidamida código diferente, indicadores de compilación diferentes, uso de recursos diferente, todo diferente.

    – pmg

    19 de septiembre de 2011 a las 13:45

  • ¿Sabes que x += 1 es más eficiente que x = x + 1? ¿Has mirado el código objeto generado?

    – José

    19 de septiembre de 2011 a las 13:45

  • ¿Qué tal encontrar algunos libros que no tengan 17 años?

    – Svish

    19 de septiembre de 2011 a las 13:56

  • Preguntar sobre UDT es una pregunta diferente. Esta pregunta es sobre C.

    –David Heffernan

    19/09/2011 a las 14:00

Solo para darle un ejemplo del “mundo real”, considere este programa:

int main()
{
    int i = 0;
    i += 1;
    i++;
    i = i + 1;
    return 0;
}

Compilándolo con GCC, en Darwin 11 con las siguientes banderas:

  • -S parada en ensamblador
  • -m32 a la plataforma de 32 bits, solo para simplificar un poco las cosas

Generará el siguiente programa, excepto por los comentarios y las líneas en blanco que agregué. Echa un vistazo especialmente en los comentarios.

        .section        __TEXT,__text,regular,pure_instructions
        .globl  _main
        .align  4, 0x90
_main:
        pushl   %ebp              # cdecl function stuff
        movl    %esp, %ebp        #
        subl    $12, %esp         # get room for variables    
        movl    $0, -12(%ebp)     # i = 0;

        ; i += 1
        movl    -12(%ebp), %eax   # load i in register a
        addl    $1, %eax          # add 1 to register a
        movl    %eax, -12(%ebp)   # store it back in memory

        ; i++
        movl    -12(%ebp), %eax   #
        addl    $1, %eax          # just the same
        movl    %eax, -12(%ebp)   #

        ; i = i + 1
        movl    -12(%ebp), %eax   #
        addl    $1, %eax          # just the same
        movl    %eax, -12(%ebp)   #

        movl    $0, -8(%ebp)
        movl    -8(%ebp), %eax
        movl    %eax, -4(%ebp)
        movl    -4(%ebp), %eax
        addl    $12, %esp
        popl    %ebp
        ret

.subsections_via_symbols

  • No sé por qué esto no está marcado como la respuesta, ya que proporciona una prueba y no solo una opinión.

    – nhouser9

    2 oct 2016 a las 21:43

  • Esto debe marcarse como la respuesta. Además, ¿encontramos alguna diferencia en otros compiladores o sigue el mismo patrón?

    – SanVed

    28 de noviembre de 2016 a las 14:12

  • @SanVed Gracias. Difícil de decir, considerando la cantidad de compiladores. Pero cualquier compilador con un desarrollo decente probablemente contendrá esta “inteligencia”. Los compiladores no son solo traductores directos de alto a bajo nivel, hay toda una ciencia involucrada y ejemplos como este se encuentran entre los elementos más básicos y primeros de esta ciencia. Por lo tanto, cualquier compilador importante y moderno debería incluirlo.

    – sidilio

    28 de noviembre de 2016 a las 22:43

En la mayoría de los compiladores estos serían idénticos

  • ¿Qué pasa con los compiladores más antiguos? que no optimizan tanto como los más nuevos… ¿por qué se evalúan de manera diferente?

    – usuario7

    19 de septiembre de 2011 a las 13:52

  • Si el compilador es ineficiente, puede ignorar el hecho de que se hace referencia a x dos veces y cargarlo y luego realizar la operación de incremento en el valor cargado.

    – Ofir

    19 de septiembre de 2011 a las 13:53

  • y ¿qué pasa con el comentario sobre las matrices?

    – usuario7

    19 de septiembre de 2011 a las 13:56

  • nuevamente: un buen compilador podrá producir el mismo código, pero uno ineficiente podría tener más problemas con expresiones más complejas, como las que involucran a los miembros de la matriz

    – Ofir

    19/09/2011 a las 14:00

¿Por qué x += 1 es más eficiente que x = x+1?

no lo es

¿Por qué x++ es más eficiente que x += 1?

no lo es


La razón de preferir x += 1 para x = x+1 surge cuando x se reemplaza con un identificador mucho más largo, o quizás un campo en una clase o estructura. En esa situación, el x += 1 La versión es más legible y, lo que es más importante, evita las trampas de repetirse.

¿Es x 1 mas eficiente que x
lxt

Así que ya hay algunas preguntas que cubren lo que estás preguntando aquí:

x=x+1 contra x +=1

Incrementando: x++ vs x += 1

¿Cual es mas rápido? ++, += o x + 1?

La conclusión es que en la mayoría pero no todos idiomas, el compilador los hará idénticos de todos modos, por lo que no hay diferencia en la eficiencia. Las preguntas anteriores entran en bastante detalle sobre el tema.

Con gcc, puede obtener el código ensamblador con gcc -S foo.c. lo probé con x += 1 y x = x + 1 y fue lo mismo

1647709222 11 ¿Es x 1 mas eficiente que x
R.. GitHub DEJAR DE AYUDAR A ICE

Porque se necesitan 4 caracteres para escribir en lugar de 5.

Esta es la única forma en que x+=1 es “más eficiente” que x=x+1. Sin embargo, el += operador tiene algunas otras ventajas, como el hecho de que (x)+=1 funciona en macros donde x es una expresión que puede tener efectos secundarios que desea evitar evaluar más de una vez…

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad