Il 19/01/2012 12:24, LudovicoVan ha scritto:
> "Soviet_Mario" wrote in message
> news:4f173c71$0$1388$4faf...@reader2.news.tin.it...
>> Il 18/01/2012 19:18, LudovicoVan ha scritto:
>
>> In una lista di oggetti (Che contengono array tridimensionali di
>> double, diciamo fino a qualche centinaio di coordinate, ho messo un
>> puntatore alla funzione di istanza di quella classe che mi legge
>> internamente tali coordinate, ma non ero sicuro di come trattasse la
>> reference, acc. a me)
>
> Un centinaio di oggetti per i 24 byte dei tre double fa 2.4K, cioe' se
> non e' proprio un'applicazione performance-critical ed il famoso
> bottle-neck in qualche funzione super-annidata, stai comunque
> risparmiando una goccia nel mare.
mah ... una goccia per ogni oggetto. Ma di quegli array
vaganti ce ne ho parecchi.
Già solo se campiono dei punti su una superficie sferica a
8-10 cerchi e 12 punti per cerchio, ho 300 double. Metti di
avere un centinaio di oggetti grafici che vagano (avanti e
indietro tra array di calcolo 3d, di rendering 2d, e altre
strutture temporanee), credo che sia più leggero spostare
solo o assegnare delle gran reference.
Anche se commetto ancora errori
L'altro giorno ho assegnato come facevo in VB 6 un array ad
un altro array. E mi sorprendevo che dopo il rendering mi
trovavo soprascritti i dati originali.
Beh, usando array.copy(sorg, dest, size) non accedeva più.
Quel che ottenevo era non di copiare i dati ma di assegnare
la reference. Buccia di banana. In VB6 invece si copiavano i
dati.
> Ma quello che cerco di comunicare qui
> e' un'indicazione generale: il codice va prima di tutto scritto a regola
> d'arte (o, da manuale), con leggibilita', semplicita' e
> (conseguentemente) manutenibilita' al primo posto.
non ci riesco molto ma sono d'accordo. Anche perché se non è
leggibile, perdo le fila.
Questo cavolo di modellatore per cui mi sono preso una fissa
mostruosa, è già oltre le ottanta paginate di roba, e non ho
più la più vaga idea di quante classi ci siano e come
interconnesse. Il fatto che il motore funziona mi sorprende
quasi (mi sforzo di interconnettere il meno possibile, chiaro).
Ma fino al motore di calcolo ancora ci capivo abbastanza.
Ora mi è presa la fissa che voglio renderlo scriptabile, non
sono riuscito a fare il grafo di regole sintattiche come
volevo inizialmente. Pensavo di fare dei patterns di
sintassi errate a corto raggio. Poi sono passato a un
generatore di regole che produrrebbe tutte le possibili
sintassi corrette (ma sono stato ingenuo, già ho scoperto
che tra vari tipi di parentesi, metacaratteri opzionali,
delimitatori etc, l'istruzione più banale che allocava un
singolo punto dotato di nome mi ha sfornato 432 possibili
sintassi corrette ... sono rimasto basito. Devo
necessariamente rinunciare alla risoluzione analitica
lineare, iterativa diciamo, per tornare all'enunciazione
ricorsiva, di regole in termini di sotto regole, se no per
descrivere tutte le possibili enunciazioni delle istruzioni
di scripting non mi basta più il disco fisso).
Cmq sia concordo che l'esigenza di leggibilità è la priorità
suprema appena scrivi qualcosa di un po' incasinato, se no
ti ci perdi dentro.
> Ottimizzare (per
> esempio denormalizzando, oppure andando a limare sui cicli di CPU
sulla velocità non ci penso proprio, perché non ho idea
dell'efficienza delle singole istruzioni o containers vari.
Sullo spazio dipende, a volte lo spreco è eclatante e non
difficile da limare, allora da fastidio lasciarlo in loco.
Ma per spreco essenzialmente intendo le operazioni di copia
fisica di parametri dentro e fuori lo stack, o magari
eseguire miriadi di concatenazioni su stringa da pochi byte
ognuna, o redim una dietro l'altra. Ci sono cose che son
proprio brutte come design.
Per le stringhe sto cominciando a usare StringBuilder (che
forse è più simile alle vecchie BStr che non il classico
tipo String di NET, che non è poi tanto simile al vecchio).
E per gli array, sempre più spesso liste, che non
ridimensionano per niente.
> o sui
> singoli byte) viene sempre dopo e sempre e solo dove e quando serve, e
> ovviamente ha un costo rispetto ai criteri ideali di partenza, cioe' ci
> si perde in leggibilita', manutenibilita' ecc.
>
>> > Comunque tutto cio' e' documentato, devi solo spulciare un po' in >
>> MSDN...
>>
>> A volte non trovo gli argomenti perché se il gergo specifico
>> aggiornato non lo conosci in modo corretto, tante volte
>
> E' vero che d'acchitto non e' di facile lettura, ma se prendi
> l'abitudine di consultare la documentazione ogni volta che stai usando
> qualcosa che non usi proprio tutti i giorni (personalmente la considero
> parte integrante del lavoro quotidiano), la documentazione si fa
> rapidamente piu' chiara, e come si chiamano le cose e dove trovarle
> piano piano viene fuori pure. Te lo dico anche per esperienza personale,
si ma tu sei programmatore di mestiere. Io no, solo hobby.
Inoltre da qualche anno i periodi di urgenza estrama sono
rarefatti. Giusto da 3 settimane mi son messo a costruire
questo modellatore (che graficamente non ha grosse pretese,
ragiona solo in termini wireframe, non ha nemmeno il
concetto di superficie ... e probabilmente non riuscirò a
estenderlo a posteriori)
> visto che ho cominciato con Microsoft e ..Net una decina di anni fa,
> prima usavo altro (in particolare il Borland Delphi, che e' OO Pascal,
> per applicazioni Windows) e ricordo anch'io di avere avuto difficolta'
> inizialmente: ma poi tutto si fa piu' chiaro.
>
>> salvo la multiple inheritance e l'odio per le interfacce
>
> A me non piace l'abuso delle interfacce in nome della testability
> (un'altra delle ovvie aberrazioni), ma per il resto non bisognerebbe
> avere certe avversioni.
touchè !
> L'ereditarieta' multipla a volte si', farebbe
> comodo, ma ad oggi non ho ancora trovato nulla che non si potesse
> costruire ugualmente al costo forse di una minima duplicazione di codice
> e magari di qualche capriola con i generics...
effettivamente dei generics me ne faccio delle discrete
abbuffate. L'altra settimana sono riuscito per la prima
volta a fornire l'overload (con un delegato) dell'operatore
standard CompareTo e fare in modo che con una riga
(list.sort) mi si implementasse lo zordering tridimensionale
di segmenti di estremi noti.
Spero che dentro la pancia usi un algoritmo O(n) o almeno
O(n log(n)), tipo il quicksort. Ma poi non sono stato a
indagare, mi pareva di averlo letto.
>
> In generale, la filosofia dietro .Net e' quella di fornire un framework
> molto potente
si su questo non ci piove, è monumentale
> ma allo stesso tempo ragionevolmente semplice da usare e
> senza tutte le super-complicazioni del codice nativo.
eh, qui invece l'impatto di uno abituato a pensare in codice
di basso e medio livello è doccia fredda. Io non l'ho
trovato facile né naturale. Ma pace, un po' alla volta ci si
assuefà.
> Questo consente
> alti livelli di produttivita' e relativamente pochi "sbattimenti" anche
> a chi non e' un super-professionista e non mastica C++
L'impatto non felicissimo iniziale con l'ereditarietà
singola e i template non proprio robusti effettivamente l'ho
avuti perché venivo proprio dal C++ (anche da VB 6, ma .NET
è un po' più simile al C++ che al VB 6 imho, al di la della
somiglianza delle parole chiave del basic, che infatti sono
state ampliate).
> e WinAPI a
> colazione. Questo ovviamente pero' viene al costo di qualche
> sofisticazione in meno,
mah, non è questione di sofisticazione. E' l'abitudine a
scrivere codice con pochi effetti sotto il cofano, diciamo.
E quando invece scrivi delle righe che immagini ne
sottendano centinaia nascoste, ti raccapezzi a fatica.
> ma se proprio .Net ti sta stretto, l'unico
non credo che mi vada stretto, semmai non ne traggo tutto
quel che può dare.
Poi Murphy insegna che se un vestito ti va largo in 100'000
punti salvo un paio, andrai a cozzare proprio contro quel
paio dove ti servirebbe qualcos'altro :-)
Il che avviene perché se vieni dai template "veri" del C++
pensi in modo diverso, e pensare in un modo e adattarlo non
è mai una strada indolore
> consiglio sarebbe quello di passare a C++ nativo appunto: ma in realta'
> non lo consiglio,
per la verità non ho mai amato il C++ per l'efficienza (che
pure ha, sia chiaro), ma per la compattezza del codice che
puoi produrre, e la possibilità di astrarre in modo
vertiginoso. D'altra parte come RAD per costruire le
interfacce GUI e il debug al volo, con tutte le versioni di
VB mi ero sempre trovato molto bene, e ora comincio a
trovarmi anche in NET (in particolare è veramente possente
il debugging integrato)
> a meno che non sono i proverbiali progetti segreti per
> la NASA... :)
>
>> e sto perdendo praticamente il vizio di riscrivere contenitori ed
>> oggetti esistenti per abusare a piene mani di quelli built in (a parte
>> la serializzazione, che non mi entra e non mi piace)
>
> That is very good, there is never point in reinventing the wheel,
> soprattutto se il framework in questione ti offre delle soluzioni
> built-in di alta qualita'. C'e' veramente poco margine per le
> ottimizzazioni in user code in .Net...
E manco ambisco ad ottimizzare qualcosa di cui non ho
nemmeno capito bene la filosofia di fondo.
Quando non capisci tutto, credo che sia meglio lasciar fare :)
>
>> In più non ho capito la scelta filosofica di fondo tra ValueTypes e
>> RefTypes ... ho un vago sospetto che la persistenza dei primi sia
>> stata prevista essenzialmente per ragioni di efficienza nel
>> passaggio/copia di piccoli oggetti
>
> Non e' l'unico approccio possibile, in ogni caso e' un approccio
> abbastanza convenzionale per un sistema la cui filosofia e'
> essenzialmente strongly-typed. Value types e reference types, prima
> ancora che un diverso memory model, hanno una diversa *semantica*!
mah ... tipo ? A parte non poter definire/istanziare con NEW
(e non avere il GC che cmq va dietro le quinte) che altra
differenza di notazione esiste ?
> L'efficienza, come le performances, e' al primo posto solo nelle
> priorita' dei principianti: 9/10, un codice scritto a regola d'arte e'
> *anche* (aggratis!) un codice performante e quant'altro...
vabbè, vado
ciao
Soviet
>
> -LV
>