Dans Delphi sain d'esprit les gens utilisent un class
pour définir des objets.
Dans Turbo Pascal pour Windows, nous utilisions object
et aujourd'hui, vous pouvez toujours utiliser object
pour créer un objet.
La différence est qu'un object
vit sur la pile et un class
vit sur le tas.
Et bien sûr, le object
est déprécié.
Putting all that aside:
Y a-t-il un avantage à tirer, en termes de rapidité, en utilisant object
au lieu de la classe ?
Je sais que object
est cassé dans Delphi 2009, mais j'ai un cas d'utilisation particulier. 1) où la vitesse est importante et j'essaie de savoir si l'utilisation de object
rendra mon truc plus rapide sans le rendre bogué.
Cette base de code est en Delphi 7, mais je pourrais la porter en Delphi 2007, je n'ai pas encore décidé.
1) Le jeu de la vie de Conway
Long commentaire
Merci à tous de m'avoir aiguillé dans la bonne direction.
Laissez-moi vous expliquer un peu plus. J'essaie de faire une implémentation plus rapide de hashlife , voir aussi ici o ici pour un code source simple
Le détenteur actuel du record est golly mais golly utilise une traduction directe du code lisp original de Bill Gospher (qui est brillant comme algorithme, mais pas du tout optimisé au niveau micro). Hashlife permet de calculer une génération en temps O(log(n)).
Pour ce faire, il utilise un compromis espace/temps. Pour cette raison, hashlife a besoin de beaucoup de mémoire, des gigaoctets ne sont pas rares. En retour, vous pouvez calculer la génération 2^128 (340282366920938463463374607431770000000) en utilisant la génération 2^127 (170141183460469231731687303715880000000) en o(1) temps.
Comme hashlife doit calculer des hachages pour tous les sous-modèles qui apparaissent dans un modèle plus grand, l'allocation des objets doit être rapide.
Voici la solution que j'ai trouvée :
Optimisation de l'allocation
J'alloue un grand bloc de mémoire physique (réglable par l'utilisateur), disons 512 Mo. A l'intérieur de ce bloc, j'alloue ce que j'appelle piles de fromage . Il s'agit d'une pile normale où je pousse et saute, mais un saute peut aussi provenir du milieu de la pile. Si cela se produit, je le marque sur le free
(il s'agit d'une pile normale). En poussant, je vérifie le free
Si rien n'est libre, je pousse comme d'habitude. Je vais utiliser les enregistrements comme conseillé, cela semble être la solution avec le moins de frais généraux.
En raison de la façon dont le hashlife fonctionne, très peu pop
ping a lieu et beaucoup de push
es. Je garde des piles séparées pour les structures de différentes tailles, en m'assurant de garder l'accès à la mémoire aligné sur les frontières 4/8/16 octets.
Autres optimisations
- suppression de la récursion
- optimisation de la mémoire cache
- l'utilisation de
inline
- précalcul des hachages (à la manière des tables arc-en-ciel)
- détection des cas pathologiques et utilisation de l'algorithme de repli
- utilisation du GPU