|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() |
Bonjour à tous,
J'aimerais coder l'algorithme du crible segmenté en c++. J'ai déjà bien exploré le crible normal, et les performances en hausse de la version segmentée m'attirent. Du coup j'ai écris le code suivant, qui est une version très naïve du crible, je veux juste que ça fonctionne et pouvoir après l'optimiser. Code :
Du coup mon problème est le suivant : Si je déclare max à plus de 100.000, le programme plante au moment de la déclaration du vector<int> segment. Ce que je ne comprend pas, étant donné que je l'initialise avec la variable "slice" qui n'a rien à voir avec "max". Si je remplace ce vector par un array de int, ça marche très bien. Autre problème, et c'est peut-être lié, si vous lisez le code vous remarquerez ça : Code :
![]() Du coup, est-il possible "proprement" de fixer la taille du vector<int> segment dans ma boucle z ? Autre question, niveau performance, que vaut-il mieux choisir entre un vector et un array, sachant que je compte déclarer des array/vector de unsigned long long (64 bits donc) d'une taille comprise entre 32k et 256k selon le choix de l'utilisateur ? Merci pour vos éclaircissements |
||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 673 ![]() |
Bonjour,
quel compilateur utilises-tu? Essaie de remplacerpar, et dis-nous ce que ça donne. De façon générale, les tableaux sont aussi rapides que les vector. Mais dans certains cas, vector est plus rapide. |
|
|
00
|
|
|
#3 | ||||
![]() ![]() Cyrille Network programmer Inscription : juin 2010 Messages : 1 555 ![]() |
Bonjour,
Citation:
vector représente un tableau, en interne il s'agit d'un tableau tout ce qu'il y a de plus classique, maquillé pour contenir des fonctions et le modifier. les seules actions "lentes" de vector sont l'ajout d'élément, quand une réallocation est nécessaire. Dans tous les cas, vector ne sera pas plus rapide qu'un C-Array, puisqu'il ajoute une indirection. Mais on peut compter sur l'inline etc afin d'optimiser tout ça et que ça passe (complètement) inaperçu. Le mieux étant de réserver la taille suffisante, pour qu'aucune réallocation ne soit faite avec les ajouts à venir, avec vector::reserve ![]() Citation:
Code :
Le pourquoi du crash me dépasse par contre, que dit le debuger ? |
||||
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 673 ![]() |
Il me semble que la move semantic, déjà utilisée dans certaines implémentations de std::vector, permet de gagner du temps dans certains cas.
|
|
|
00
|
|
|
#5 | ||
|
Invité de passage
![]() |
Merci pour vos réponses.
J'ai déjà essayé de faire un simple vector<int> segment(slice), sans mettre de valeur d'initialisation, ça foire toujours. Je compile sous MinGW, la dernière version en date. Je précise, après avoir posté hier j'ai essayé de faire comme suit : Code :
![]() (EN ce qui concerne la relation entre max et slice, comme tu remarques, slice est toujours égal à 10.000 dans chacun de mes test, vu que max est toujours supérieur à 10.000). Le debugger indique : "Program received signal SIGTRAP, Trace/breakpoint trap. In ntdll!TpWaitForAlpcCompletion () (C:\Windows\system32\ntdll.dll)". Au fait, j'ai vu une source en C où le gars utilisait les fonctions malloc, memcpy, etc, pour allouer de façon dynamique la place nécessaire en mémoire. Est-ce plus rapide, ou simplement parcequ'il n'utilise pas le C++ ? EDIT : Bon pour 2.000.000 le programme plante aussi, mais pas pour 3 ou plus. EDIT 2 : Je remarque quelque chose, le programme plante, mais m'affiche le on nombre de premiers, ce qui veut dire qu'il plante après la boucle for principale, ce qui semble étrange. EDIT 3 : Encore plus étrange ! Le programme plante à 39204, 198917, 996005, 4972901. Il y a un facteur 5 (à peu près, de 4.99 à 5.07) entre chacun de ces nombres. Théorie du complot ?
|
||
|
|
00
|
|
|
#6 | |||||
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Parfois le comportement d'un programme peut sembler étrange lorsqu'on corrompt la mémoire
Tu essaies en effet de modifier l'accès à un emplacement non permis lorsque tu déclares : Code :
Code :
PS : Citation:
|
|||||
|
|
00
|
|
|
#7 | ||
|
Invité de passage
![]() |
Merci pour ta réponse
Finalement j'ai trouvé l'erreur, qui ne venait pas du tout du vector segment, bien que je ne comprenne pas pourquoi. L'erreur était ici : Code :
Par contre les performances sont très décevantes, je ne m'attendait pas à ça. Je trouve les premiers jusqu'à 10.000.000 en 5s500, c'est le temps qu'il me faut pour aller jusqu'à 1.000.000.000 avec mon autre implémentation sans la segmentation. Je pensais que cette version serait "cache-friendly" puisqu'elle utilise un segment qui rentre dans le cache. Mais que je fasse slice = 128; ou slice = 4096 * 1024, ça marche pratiquement pareil, la version avec 128 marche même mieux. C'est étrange
|
||
|
|
00
|
|
|
#8 | |||
![]() ![]() Cyrille Network programmer Inscription : juin 2010 Messages : 1 555 ![]() |
Citation:
Pour un tableau de nb éléments, on pourra accéder de tableau[0] à tableau[nb-1] |
|||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com