2015-12-15 3 views
4

En théorie, sur les processeurs modernes qui est plus rapide:Ce qui est plus rapide pour opération NON: table précalculée ou `~`

  • recevant pas résulter de la table
  • ou le calcul par ~ (en C) fonctionnement ?

En supposant que toute la table s'insère dans le cache L1.

Bitwise pas:

uint8_t bitwise_not(uint8_t arg) { return ~arg; } 

Tableau non:

// precalculcating table (once) 
uint8_t table[0x100]; 
for (int i = 0; i < 0x100; ++i) { table[i] = ~static_cast<uint8_t>(i); } 

// function 
uint8_t table_not(uint8_t arg) { return table[arg]; } 

// xor_not: 
uint8_t xor_not(uint8_t arg) { return arg^0xff; } 

On ne une seule opération, mais plusieurs opérations de milliards, est la lecture du cache L1 plus rapidement que toute opération logique ou non? (Je pense que L1 est plus rapide, mais ne peut pas le prouver.)

Pratiquement, comment le mesurer?

+2

Avez-vous essayé de comparer le code? Il serait probablement plus facile pour quelqu'un de signaler une erreur dans votre technique de benchmarking, plutôt que d'écrire un benchmark pour vous. –

+0

@JonnyHenly Comment l'évaluer correctement? Il est toujours mesuré à 1 ns pour les deux fonctions. Le comptage des tacts du processeur ('rdtsc') n'est pas une bonne méthode de mesure, car le comptage des tacts ne dit rien sur le temps d'exécution (en 2015). – vladon

+0

Une seule opération de ce type est trop rapide pour faciliter le benchmark. Vous devrez donc répéter l'opération des millions ou des milliards de fois pour obtenir un temps de mesure. –

Répondre

11

Aucune. Utilisez simplement l'opérateur ~ inline dans votre code. C'est une instruction de machine. Un appel de fonction ou une recherche de table sont plusieurs. Il n'y a aucun moyen non plus d'être plus rapide.

Je ne peux pas expliquer votre étrange conviction que le cache L1 est plus rapide que les registres.

+0

Supposons que les fonctions sont inline par le compilateur. Je ne demande pas lequel utiliser, c'est plus une question de théorie. – vladon

+0

Ma réponse reste la même. – EJP

+0

Oui, c'est la réponse évidente, donc +1. En supposant, bien entendu, que le processeur particulier ait une instruction machine pour cela, ce qui, me dit-on, n'est peut-être pas vrai pour les petits systèmes embarqués. Pour une discussion similaire, regardez les commentaires ici: http://stackoverflow.com/a/33910543/15727 - donc je suppose que la réponse plus longue commencerait par "ça dépend". Mais cette discussion était à propos de l'inverse et non inverse, alors peut-être que tous les processeurs ont un peu de bits pas d'instruction? –