2012-09-18 51 views
6

revelación completa - que se inspiró en Is x += a quicker than x = x + a?¿Es + = más rápido que - =?

Aparte de eso, decidí probar += vs -=. Pruebas simples revelan que son más o menos lo mismo. Luego he intentado algo similar a:

std::vector<int> x; 
for (int i = 0 ; i < 10000 ; i++) 
    x.push_back(rand()%10); 

y llame += y -= proporcional a un número dado:

long long sum = 0; 

for (each number in the array) 
    if (x[j] < k) 
     sum += x[j]; 
    else 
     sum -= x[j]; 

así, si k es, digamos, pequeña, -= obtendría llama con más frecuencia (duuuh) Intenté con k = 2 que daría una mayor proporción de -= llamado, y con k = 5, que debería dar aproximadamente el mismo número de -= y +=.

La frase clave: llamar a -= es aproximadamente dos veces más rápido que llamar al +=. ¿Por qué sería más eficiente en este caso?

+4

Creo que hay cosas mejores para "inspirar". – Mysticial

+0

Probablemente solo una leve ventaja para A + B, considerando que A - B es solo A + (-B) – nullpotent

+7

Dos palabras: predicción de bifurcación. Sugerencia: Pruebe k = 8 –

Respuesta

15

I'm gonna jump in before Mysticial gets a hold of this and guess: branch prediction.

Por lo tanto, no es la -= vs +=.

La condición x[j] < k puede predecirse mejor cuando es casi siempre true o false de lo que puede ser cuando hay aproximadamente la misma cantidad de números para los cuales se puede evaluar a cualquiera.

Para k = 2, uno en 10 evaluará a false.

Para k = 5, serán más o menos iguales y se distribuirán al azar, por lo que es más difícil de predecir.

EDITAR: Vea http://ideone.com/1PYMl - todas las cosas adicionales están ahí para evitar la optimización del código no utilizado (el cout s).

tl; dr: Resultados para variar k:

k: 1 Time: 280 
k: 2 Time: 360 
k: 3 Time: 440 
k: 4 Time: 520 
k: 5 Time: 550 
k: 6 Time: 510 
k: 7 Time: 450 
k: 8 Time: 360 
k: 9 Time: 260 

como se puede ver, cuanto más cerca k llega a una condición caótica variable, el programa toma más. Hacia los extremos, toma aproximadamente la mitad del tiempo.

+4

por lo que predice que se trata de predicción de rama –

+0

Estaba a punto de decir exactamente lo mismo. Además, para responder a la pregunta principal en cuestión, en casi todas las arquitecturas, las instrucciones de adición y sub _ deben tomarse básicamente al mismo tiempo. – slugonamission

+0

@Mysticial hey - Me vinculé: P –

Cuestiones relacionadas