ciao,
> Il 13/10/2010 09:55, iem4voos ha scritto:
>> Cari Guru e Plonisti,
>> sono alle prese con un portlet per visualizzare gli articoli più
>> commentati. Inizialmente avevo tentato un approccio, richiamando gli
>> oggetti, poi sapendo che ovunque viene scritto che richiamare gli oggetti è
>> male e porta a un notevole rallentamento ho cercato di risolvere il problema
>> usando solamente i "brains".
>>
>> Una volta finito, ho confrontato i tempi di esecuzione delle due procedure
>> [getA() e getB()] e paradossalmente ,in media, la procedura che rievoca
>> tutti gli oggetti è anche se di poco più veloce (anche se con un wrost case,
>> anche se raro, molto elevato)
>>
>> Da qui la mia domanda: ho sbagliato qualcosa io o il comportamento è dovuto
>> perchè l'ho testato su un istanza con pochi oggetti (<10) ?
A spanne, guardando il tuo codice, mentre bevevo del caffé dopo pranzo, noto
che in getA tu richiami una volta il catalog e poi un metodo in plone_utils
(che non ho indagato cosa faccia) mentre in getB richiami allo stesso modo il
catalog nella prima parte e successivamente fai tante chiamate al catalog
quanti sono gli oggetti trovati al primo giro.
A me spesso non piace scendere in cantina però già questo, pur considerata la
mia totale ignoranza sul metodo getDiscussionThread, mi porta a pensare che
getB possa essere più lento anche per questo fatto (hai n-uplicato le chiamate
al catalog) ma queste sono solamente supposizioni da verificare.
Una considerazione più importante riguarda l'uso di getObject nel mondo.
Usare getObject non è peccato capitale in generale bensì il suo uso dev'essere
attento a seconda del contesto in cui viene utilizzato.
Solitamente il suo uso è da considerarsi scorretto ed inefficiente all'interno
dei page template ai quali dovrebbero venire passati oggetti più semplici
possibile e nei page template non deve esserci manipolazione di dati.
es A:
pippo_view.py
...
def results(self):
return portal_catalog.search(....)
...
pippo_view.pt
...
<tal:res repeat="res view/results">
<div tal:define="obj res/getObject">
<!-- ciò e male e peccaminoso dannazione eterna insieme a Vanni Fucci
-->
...
...
A livello di controller o model è tutto un altro discorso, se non posso
aggiungere al catalog gli indici di cui ho bisogno per effettuare meno chiamate
possibili per raggiungere l'oggetto ho solo questa possibilità, ecco uno
stupido esempio.
es B:
pippo_view.py
...
def results(self):
res = portal_catalog.search(....)
for i in res:
obj = i.getObject()
yield dict(qualcosa= obj.get_qualcosa_che_non_ho_nel_catalog(),
url = i.getURL())
...
pippo_view.pt
...
<tal:res repeat="res view/results">
<div>
<span tal:content="res/qualcosa">
<!-- questo è meglio del primo esempio -->
...
...
cfr. Professional Plone Development cap.13 pag. 301 (... def cinemas(self): ...
non richiama getObject comunque ma il concetto è lo stesso)
Per questioni più di basso livello lascio la palla a qualcun altro ;)
_____________
Giorgio
_______________________________________________
Plone-IT mailing list
[email protected]
http://lists.plone.org/mailman/listinfo/plone-it
http://www.nabble.com/Plone---Italy-f21728.html