Je vais aller à l'encontre de la sagesse générale ici que std::copie aura une légère, presque imperceptible, la perte de performances. Je viens de faire un test et a constaté que pour être faux: je n'ai pas remarqué une différence de performance. Cependant, le gagnant a été std::copy.
J'ai écrit en C++ de l'algorithme SHA-2 mise en œuvre. Dans mon test, j'ai de hachage 5 chaînes à l'aide des quatre SHA-2 versions (224, 256, 384, 512), et je boucle de 300 fois. Je mesure le temps d'utilisation de Boost.minuterie. Que 300 compteur de boucle est assez complètement stabiliser mes résultats. J'ai couru à l'essai 5 fois chacun, en alternant entre les memcpy et la version std::version de la copie. Mon code prend avantage de l'accaparement des données en autant de morceaux que possible (de nombreuses autres implémentations de fonctionner avec des char
/ char *
, tandis que je fonctionne avec T
/ T *
(où T
est le plus grand type de l'utilisateur mise en œuvre est correcte dépassement de comportement), si vite accès à la mémoire sur le plus grand des types que je peux est au cœur de la performance de mon algorithme. Voici mes résultats:
Temps (en secondes) pour terminer l'exécution de l'algorithme SHA-2 tests
std::copy memcpy % increase
6.11 6.29 2.86%
6.09 6.28 3.03%
6.10 6.29 3.02%
6.08 6.27 3.03%
6.08 6.27 3.03%
Total de l'augmentation moyenne de la vitesse de std::copie de memcpy: 2.99%
Mon compilateur est gcc 4.6.3 sur Fedora 16 x86_64. Mon optimisation des drapeaux -Ofast -march=native -funsafe-loop-optimizations
.
Code pour ma SHA-2 implémentations.
J'ai décidé de lancer un test sur mon MD5 mise en œuvre. Les résultats ont été beaucoup moins stable, j'ai donc décidé de faire 10 séries. Cependant, après mes premières tentatives, j'ai obtenu des résultats qui varient fortement d'une exécution à l'autre, donc je suppose que il y avait une sorte de système d'exploitation, l'activité en cours. J'ai décidé de recommencer.
Même les paramètres du compilateur et des drapeaux. Il n'y a qu'une seule version de MD5, et il est plus rapide que l'algorithme SHA-2, donc je n'ai 3000 boucles sur un ensemble similaire de 5 chaînes de test.
Ce sont mes 10 derniers résultats:
Temps (en secondes) pour terminer l'exécution de MD5 tests
std::copy memcpy % difference
5.52 5.56 +0.72%
5.56 5.55 -0.18%
5.57 5.53 -0.72%
5.57 5.52 -0.91%
5.56 5.57 +0.18%
5.56 5.57 +0.18%
5.56 5.53 -0.54%
5.53 5.57 +0.72%
5.59 5.57 -0.36%
5.57 5.56 -0.18%
Total de la valeur moyenne de la diminution de la vitesse de std::copie de memcpy: 0.11%
Code pour mon MD5 mise en œuvre
Ces résultats suggèrent qu'il y a de l'optimisation de la std::copy utilisé dans ma SHA-2 tests que std::copy ne pouvait pas l'utiliser dans mon MD5 tests. Dans le SHA-2 tests, les deux tableaux ont été créés dans la même fonction qui a appelé std::copy / memcpy. Dans mon MD5 tests, l'un des tableaux a été transmise à la fonction en tant que paramètre de la fonction.
J'ai un peu plus de tests pour voir ce que je pouvais faire pour que les std::copie plus rapide encore. La réponse s'est avéré être simple: tourner sur le lien ci-optimisation du temps. Ce sont mes résultats avec LTO activée (option -flto dans gcc):
Temps (en secondes) pour terminer l'exécution de MD5 tests avec -flto
std::copy memcpy % difference
5.54 5.57 +0.54%
5.50 5.53 +0.54%
5.54 5.58 +0.72%
5.50 5.57 +1.26%
5.54 5.58 +0.72%
5.54 5.57 +0.54%
5.54 5.56 +0.36%
5.54 5.58 +0.72%
5.51 5.58 +1.25%
5.54 5.57 +0.54%
Total de l'augmentation moyenne de la vitesse de std::copie de memcpy: 0.72%
En résumé, il ne semble pas être une perte de performance pour l'utilisation de std::copy. En fait, il semble y avoir un gain de performance.