PDA

View Full Version : [Compiler] Java just-in-time vs C++


hollywoodundead
10-08-2013, 22:04
E' vero che il compilatore on the fly di java chiamato just-in-time compiler, riesce a tenere testa (a livello di prestazioni) ad un applicazione scritta in c++ che non ha bisogno di un interprete come la VM?

Riporto la fonte. Libro Core Java Volume I Fundamentals:

In the early days of Java, the language was interpreted. Nowadays, except on “micro” platforms such as cell phones, the Java virtual machine uses a just-in-time compiler. The “hot spots” of your code will run just as fast in Java as they would in C++, and in some cases, they will run faster.

EDIT: Riporto anche la continuazione per completezza:

Java does have some additional overhead over C++. Virtual machine startup time is slow, and Java GUIs are slower than their native counterparts because they are painted in a platform-independent manner.
People have complained for years that Java applications are too slow. However, today’s computers are much faster than they were when these complaints started. A slow Java program will still run quite a bit better than those blazingly fast C++ programs did a few years ago. At this point, these complaints sound like sour grapes, and some detrac- tors have instead started to complain that Java user interfaces are ugly rather than slow.

pabloski
10-08-2013, 23:16
Direi che la risposta c'è già in quello che hai citato

"and in some cases, they will run faster."

C'è un dibattito che dura da anni sulle performance dei compilatori just-in-time vs aot.

A meno di seri problemi nello sviluppo di un compilatore jit, è vero che ci sono casi in cui un programma jitted è più veloce di uno compilato aot.

I motivi sono legati principalmente alle possibilità che hanno i compilatori jit di realizzare ottimizzazioni impossibili per un compilatore aot.

Tommo
11-08-2013, 01:26
Il problema e' che i test che danno i JIT pari sono per certi versi una presa per il c**o - perche' non testano codice idiomatico del linguaggio.

Nel senso, se prendi codice C e lo traduci paro paro in codice Java e' molto probabile che i tempi viaggino tra 0.9x e 1.5x, che e' un ottimo risultato... ma questo e' un test puramente per il JIT e la VM che non tiene conto ne' delle performance del GC, ne' di quelle della libreria... semplicemente non e' il codice che scriverebbe un programmatore Java tipico.

Ad esempio in Java rimane molto costoso creare piccoli oggetti come Vettori, Colori etc, rispetto a C++... perche' a parte new e delete creare decine di oggetti, indipendentemente dalle dimensioni e' un problema per il garbage collector.
E' anche molto costoso fare chiamate a funzioni, dato che di default sono tutte virtuali (non a caso non c'e' l'overload degli operatori - decisero di non metterlo per "incoraggiare" la gente a sommare le cose a manina :D ), e se la tua idea e' fare un'esperienza utente fluida c'e' da contare anche il fatto che a random il GC parte e blocca tutti i thread per diversi millisecondi, risultando nei tipici scatti.
In piu' le performance della libreria standard fanno abbastanza schifo e vanno a sbattere contro tutti i limiti di Java stesso (oh the irony), quindi comunque si finisce a usare gli array C-style.

In finale, se usi Java come un linguaggio di alto livello e' lento. Se lo usi a basso livello e' veloce.
Non lo avrebbe mai detto nessuno :asd:

hollywoodundead
11-08-2013, 13:51
Il problema e' che i test che danno i JIT pari sono per certi versi una presa per il c**o - perche' non testano codice idiomatico del linguaggio.

Nel senso, se prendi codice C e lo traduci paro paro in codice Java e' molto probabile che i tempi viaggino tra 0.9x e 1.5x, che e' un ottimo risultato... ma questo e' un test puramente per il JIT e la VM che non tiene conto ne' delle performance del GC, ne' di quelle della libreria... semplicemente non e' il codice che scriverebbe un programmatore Java tipico.

Ad esempio in Java rimane molto costoso creare piccoli oggetti come Vettori, Colori etc, rispetto a C++... perche' a parte new e delete creare decine di oggetti, indipendentemente dalle dimensioni e' un problema per il garbage collector.
E' anche molto costoso fare chiamate a funzioni, dato che di default sono tutte virtuali (non a caso non c'e' l'overload degli operatori - decisero di non metterlo per "incoraggiare" la gente a sommare le cose a manina :D ), e se la tua idea e' fare un'esperienza utente fluida c'e' da contare anche il fatto che a random il GC parte e blocca tutti i thread per diversi millisecondi, risultando nei tipici scatti.
In piu' le performance della libreria standard fanno abbastanza schifo e vanno a sbattere contro tutti i limiti di Java stesso (oh the irony), quindi comunque si finisce a usare gli array C-style.

In finale, se usi Java come un linguaggio di alto livello e' lento. Se lo usi a basso livello e' veloce.
Non lo avrebbe mai detto nessuno :asd:

Questo sarebbe poi il motivo secondo te percui le applicazioni android che sono fatte prevalentemente in java (tranne qualche rara applicazione che debba essere necessariamente performante e allora in quel caso viene scritta in c++) presentano sempre quei rallentamenti tipici ad esempio del samsung galaxy s3 nonostante abbiano una potenza hardware ottima? Mentre invece le app su iphone risultano maggiormente fluide (tranne l'apple store su iphone che è stato ottimizzato male) grazie al fatto che sono scritte in objective-c? :)

nico159
11-08-2013, 17:34
Aggiungo che compilatori più avanzati come GCC e VC++ (MS) hanno qualcosa che si avvicina molto a JIT: profile guided optimizations
http://blogs.msdn.com/b/vcblog/archive/2013/04/08/profile-guided-optimization-pgo.aspx

Compilatori JIT come la JVM non sfruttano neanche "novità" introdotte dalle cpu 10 anni fa, come il supporto alla vettorizzazione :)

Inoltre come detto da Tommo la JVM di impone uno stile "generico" di allocamento imposto dalla implementazione del GC scelta all'avvio
In linguaggi con compilatori AOT solitamente manca un GC (alcuni è presente ma disattivabile come in D, altri come Go non puoi gestire la memoria da te)
Un GC non solo impone dell'overhead quando fa il suo lavoro (e con heap sui 4GB, la JVM può farti aspettare anche un paio di minuti :rolleyes: ) ma anche quando non entra in funzione ci sono dei costi (write barrier e probabilmente anche altro)
Ma ancora più importante non puoi creare il tuo stile di allocalmento specifico per il problema che ti stai affrontando -- che è dove le performance iniziano a brillare (custom allocator)

Personalmente, non ho mai visto codice "uguale" sulla JVM battere un compilatore con le giuste flags

JIT al momento è un pò come GC: è da 30 anni che si dice, che un giorno saranno più veloci della loro controparte

nico159
11-08-2013, 17:39
Questo sarebbe poi il motivo secondo te percui le applicazioni android che sono fatte prevalentemente in java (tranne qualche rara applicazione che debba essere necessariamente performante e allora in quel caso viene scritta in c++) presentano sempre quei rallentamenti tipici ad esempio del samsung galaxy s3 nonostante abbiano una potenza hardware ottima? Mentre invece le app su iphone risultano maggiormente fluide (tranne l'apple store su iphone che è stato ottimizzato male) grazie al fatto che sono scritte in objective-c? :)
Sì, di recente è stato scritto un bell'articolo al riguardo:
http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/

We feel so strongly about ARC being the right approach to memory management that we have decided to deprecate Garbage Collection in OSX. - Session 101, Platforms Kickoff, 2012, ~01:13:50

At the top of your wishlist of things we could do for you is bringing garbage collection to iOS. And that is exactly what we are not going to do… Unfortunately garbage collection has a suboptimal impact on performance. Garbage can build up in your applications and increase the high water mark of your memory usage. And the collector tends to kick in at undeterministic times which can lead to very high CPU usage and stutters in the user experience. And that’s why GC has not been acceptable to us on our mobile platforms. In comparison, manual memory management with retain/release is harder to learn, and quite frankly it’s a bit of a pain in the ass. But it produces better and more predictable performance, and that’s why we have chosen it as the basis of our memory management strategy. Because out there in the real world, high performance and stutter-free user experiences are what matters to our users. ~Session 300, Developer Tools Kickoff, 2011, 00:47:49

http://sealedabstract.com/wp-content/uploads/2013/05/Screen-Shot-2013-05-14-at-9.44.43-PM.png

hollywoodundead
11-08-2013, 20:25
Possiamo dire quindi che l'unica differenza per quanto riguarda le prestazioni tra java e c++ riguarda fondamentalmente la gestione della memoria, automatica in java tramite il GC e manuale in c++ delegata allo sviluppatore? Forse un tempo java era stato pensato, essendo un linguaggio multipiattaforma per eseguire programmi molto toy, quindi senza particolari richieste di prestazioni, vedi ad esempio Java ME per il mobile. Tuttavia oggi anche le applicazioni piu stupide richiedono prestazioni e gestione della memoria piu che buone per poter funzionare decentemente, il GC di allora non ha subito grosse novita in termini di gestione automatica della memoria. Con il passare del tempo voi penserete che elimineranno il GC quelli di java per implementare una gestione della memoria ibrida come già avviene con l'objective-c e l'ARC,oppure la gestione di memoria da parte del GC andrà a peggiorare con il passare degli anni? :)

pabloski
11-08-2013, 21:09
Possiamo dire quindi che l'unica differenza per quanto riguarda le prestazioni tra java e c++ riguarda fondamentalmente la gestione della memoria,


anche ma non solo

come fatto notare da nico159, la jvm hotspot no supporta nemmeno la vettorizzazione...in questo caso si tratta di un modo sicuro per rendere un programma più lento e senza fare nemmeno tanti sforzi :D


Forse un tempo java era stato pensato, essendo un linguaggio multipiattaforma per eseguire programmi molto toy,


no, è solo stato pensato per velocizzare di molto la scrittura dei programmi

loro accettano una penalizzazione in termini di performance, ma ci si guadagna in termini di tempi di sviluppo

ma è una situazione comune a tutti i linguaggi di un certo tipo, a partire da c# fino a python, php, ruby

si paga qualcosa sul fronte performance, per guadagnare qualcosa sul fronte dei tempi di sviluppo



Tuttavia oggi anche le applicazioni piu stupide richiedono prestazioni e gestione della memoria piu che buone per poter funzionare decentemente,


la teoria dominante è quella di scaricare sull'hardware questa responsabilità

più core, più gigahertz, più ram


Con il passare del tempo voi penserete che elimineranno il GC quelli di java

non lo faranno mai

e comunque le implementazioni della jvm sono tantissime, alcune decisamente migliori di hotspot

ad esempio c'è zing che ha un gc pauseless ( niente lag improvvisi :D ), oppure excelsior che implementa un compilatore aot per java

la stessa dalvik è profondamente diversa dalla jvm di oracle



oppure la gestione di memoria da parte del GC andrà a peggiorare con il passare degli anni? :)

andrà a migliorare, vista la presenza di sempre più core nei processori moderni

magari le performance per core peggioreranno, ma si rimedierà usando i tanti core a disposizione

hollywoodundead
11-08-2013, 21:17
anche ma non solo

come fatto notare da nico159, la jvm hotspot no supporta nemmeno la vettorizzazione...in questo caso si tratta di un modo sicuro per rendere un programma più lento e senza fare nemmeno tanti sforzi :D



no, è solo stato pensato per velocizzare di molto la scrittura dei programmi

loro accettano una penalizzazione in termini di performance, ma ci si guadagna in termini di tempi di sviluppo

ma è una situazione comune a tutti i linguaggi di un certo tipo, a partire da c# fino a python, php, ruby

si paga qualcosa sul fronte performance, per guadagnare qualcosa sul fronte dei tempi di sviluppo



la teoria dominante è quella di scaricare sull'hardware questa responsabilità

più core, più gigahertz, più ram



non lo faranno mai

e comunque le implementazioni della jvm sono tantissime, alcune decisamente migliori di hotspot

ad esempio c'è zing che ha un gc pauseless ( niente lag improvvisi :D ), oppure excelsior che implementa un compilatore aot per java

la stessa dalvik è profondamente diversa dalla jvm di oracle



andrà a migliorare, vista la presenza di sempre più core nei processori moderni

magari le performance per core peggioreranno, ma si rimedierà usando i tanti core a disposizione

Non li conoscevo quei due gestori di memoria. Quindi se io volessi, e se ne avessi le capacità, potrei creare un GC personalizzato come quello di Zing o Excelsior per rendere il GC di java il piu vicino possibile, in termini di prestazioni alla gestione della memoria di c++ e obj-c?

pabloski
11-08-2013, 21:34
Non li conoscevo quei due gestori di memoria. Quindi se io volessi, e se ne avessi le capacità, potrei creare un GC personalizzato come quello di Zing o Excelsior per rendere il GC di java il piu vicino possibile, in termini di prestazioni alla gestione della memoria di c++ e obj-c?

Non si tratta di gc ma di implementazioni della java virtual machine.

Sul rendere un gc più performante è possibile, ma per niente banale. Si tratta di campi in cui si fa ancora molta ricerca e ci sono ancora molte discussioni accese.

hollywoodundead
11-08-2013, 21:50
Non si tratta di gc ma di implementazioni della java virtual machine.

Sul rendere un gc più performante è possibile, ma per niente banale. Si tratta di campi in cui si fa ancora molta ricerca e ci sono ancora molte discussioni accese.

Si ma ad esempio il gc implementato da Zyng aggiunge direttamente delle funzionalità al gc default di java, tramite un algoritmo, offrendo appunto la funzionalità pauseless e quindi modifica direttamente alcune parti di comportamento del tradizionale GC. La JVM in questo caso interpreta solo le modifiche di gestione memoria, ma non viene toccata. :)

mone.java
12-08-2013, 07:43
E per quanto riguarda JRockit qualcuno ne sa qualcosa?

mone.java
13-08-2013, 07:11
Rilancio con un'altra domanda... Rivolta a chi di Assembly ne capisce piu di me (il primo che mi viene in mente è cdmauro... ma penso che per quante ne so io il mio gatto ha una maria in più)

Queste ottimizzazioni (es vettorizzazione) non vengono fatte perché nessuno si è messo li a implementarle oppure perché sono troppo dispendiose da fare a runtime, cioè un compilatore standard può "metterci il tempo che vuole e occupare la memoria che vuole" mentre un compilatore JIT deve tener conto che ha il programma in esecuzione...

Detto questo non converrebbe fare una sorta di cache locale con l'assembly generato al primo avvio ad esempio... e poi fare ottimizzazioni su di essa quando il programma non ha richieste particolari di CPU?

cdimauro
13-08-2013, 13:41
Sto partendo per la Germania, quindi ho difficoltà a scrivere con lo smartphone, per cui sarò sintetico.
Si, si può fare ciò che chiedi, ma... qualcuno deve rimboccarsi le maniche. Ed è anche corretto che un compilatore JIT possa generare una prima versione "grezza", per poi affinare e generare codice ancora più ottimizzato man mano che raccoglie informazioni a runtime. Ci sono parecchi studi in merito; cerca HP dynamo.
Comunque il vantaggio di usare un intermediate language al posto binario puro è rimane possibile eseguire una compilazione AoT ottimizzata per quella particolare piattaforma, grazie alle maggiori informazioni (e astrazione). Ad esempio compilare per un'architettura inesistente al momento della compilazione in IL.
Qualcosa del genere si potrebbe anche fare partendo dal binario puro, ma sarebbe molto più complicato.

marco.r
13-08-2013, 15:28
E' vero che il compilatore on the fly di java chiamato just-in-time compiler, riesce a tenere testa (a livello di prestazioni) ad un applicazione scritta in c++ che non ha bisogno di un interprete come la VM?

Riporto la fonte. Libro Core Java Volume I Fundamentals:


EDIT: Riporto anche la continuazione per completezza:

In teoria e' vero, in pratica oltre al compilatore in se' ci sono un altro paio di fattori da tenere in considerazione.

* Per ottenere certi risultati bisogna scrivere codice Java in modo meno idiomatico (tipicamente "alla C"). Questo puo' non essere un problema se si decide di farlo solo nelle parti piu' critiche per le performace
* Prima o poi bisogna usare delle librerie e queste possono avere performance buone o performance cattive. In particolare pero' nota che le librerie standard del C++ sono state scritte con le performance in mente, per cui anche se piu' difficili da utilizzare mediamente permettono di spremere meglio le risorse della macchina. Quelle di Java il piu' delle volte sono state sviluppate con la facilita' e correttezza d'uso come prima regola.
* Fattore "Enterprise". In un linguaggio umano, se devi generare delle immagini server-side userai una libreria con cui crei un oggetto PngImage, manipoli i Pixel, e la salvi su un array di byte per mandarlo al client.
In Java, molto probabilmente dovrai utilizzare un generico MultiMediaObjectGenerator che potrai modificare accedendo ai suoi MultiMediaItemPart , e che poi manderai al client con un qualsiasi AbstractCommunicationChannel. Tutti e tre descritti da specifiche diverse, ognuno implementato da cinque librerie diverse. Cosi' quando vorrai invece che mandare delle immagini via tcp vuoi mandare degli mp3 via smtp, potrai farlo "solo" cambiando le annotations delle tue classi. Basta che non ti lamenti delle performance, o degli stack trace da 100 e piu' metodi, di cui forse 2 sono stati scritti da te.

marco.r
13-08-2013, 15:37
Rilancio con un'altra domanda... Rivolta a chi di Assembly ne capisce piu di me (il primo che mi viene in mente è cdmauro... ma penso che per quante ne so io il mio gatto ha una maria in più)

Queste ottimizzazioni (es vettorizzazione) non vengono fatte perché nessuno si è messo li a implementarle oppure perché sono troppo dispendiose da fare a runtime, cioè un compilatore standard può "metterci il tempo che vuole e occupare la memoria che vuole" mentre un compilatore JIT deve tener conto che ha il programma in esecuzione...

Detto questo non converrebbe fare una sorta di cache locale con l'assembly generato al primo avvio ad esempio... e poi fare ottimizzazioni su di essa quando il programma non ha richieste particolari di CPU?
Penso sia dovuto soprattutto a mancanza di richieste. Java e' usato soprattutto lato server, non tanto per number crunching quanto per logica di business o servizi web, dove questo tipo di ottimizzazioni hanno una utilita' relativa.
Visto che storicamente le librerie performanti sono sempre state scritte in Fortran, C, C++, risulta molto piu' comodo utilizzare un linguaggio di scripting che si appoggi a queste (Python, ad esempio ma non solo) che non Java.

shinya
13-08-2013, 15:37
* Fattore "Enterprise". In un linguaggio umano, se devi generare delle immagini server-side userai una libreria con cui crei un oggetto PngImage, manipoli i Pixel, e la salvi su un array di byte per mandarlo al client.
In Java, molto probabilmente dovrai utilizzare un generico MultiMediaObjectGenerator che potrai modificare accedendo ai suoi MultiMediaItemPart , e che poi manderai al client con un qualsiasi AbstractCommunicationChannel. Tutti e tre descritti da specifiche diverse, ognuno implementato da cinque librerie diverse. Cosi' quando vorrai invece che mandare delle immagini via tcp vuoi mandare degli mp3 via smtp, potrai farlo "solo" cambiando le annotations delle tue classi. Basta che non ti lamenti delle performance, o degli stack trace da 100 e piu' metodi, di cui forse 2 sono stati scritti da te.

SI MA VUOI METTERE I VANTAGGIH!!1

hollywoodundead
23-08-2013, 22:33
OT: cidimauro è un altro dei tanti in fuga per l'estero, in questo caso the germany? :)

cdimauro
24-08-2013, 09:18
Sì, Ulm per la precisione. Non potevo far morire di fame la mia famiglia.

In Sicilia è molto difficile trovare un lavoro, e tante volte viene schiavizzato. Spostarmi dalla Sicilia verso Roma o in sù avrebbe significato scendere comunque nella mia terra un paio di volte l'anno, prendendo uno stipendio che mi avrebbe permesso di sopravvivere.

Allora tanto vale espatriare, perché c'è tutto da guadagnare. Intanto basta uscire appena fuori dall'Italia e il salario è molto più elevato (ovviamente in paesi come Svizzera, Germania, ecc.; in Europa la situazione non è tutta la florida).

Poi anche perché il valore e il merito vengono apprezzati, premiati, e... molto ricercati. Cercando lavoro all'estero, se sei discretamente bravo, la situazione diventa l'opposto che in Italia: a volte hai l'imbarazzo della scelta, e spesso sono le aziende che cercano te e non il viceversa.

Per non parlare poi dell'ambiente di lavoro, ma in generale anche dell'ambiente (civile) in cui vivi: i servizi funzionano MOLTO bene, c'è parecchia pulizia, ordine, e rispetto degli altri. Ovviamente non è tutto perfetto, ma la differenza con l'Italia è lampante. Qui ti preoccupi se l'autobus è in ritardo di un paio di minuti; e se non sei presente alla fermata all'orario previsto, c'è una discreta possibilità che tu l'abbia perso perché l'autista ha spaccato il secondo; ma lo stesso autista si ferma e ASPETTA alla fermata se per caso è arrivato troppo presto alla tappa prevista (ha un monitor LCD touchscreen in cui è mappato tutto, secondo per secondo).

Chi fosse ancora indeciso sul da farsi, può immaginare, quindi, quale sia il mio consiglio.

Tornando al topic, rispondo al volo a marco.r su un punto (sul resto mi trovo sostanzialmente d'accordo). La libreria standard C++ non è stata pensata per le prestazioni. Ricordo che per lo meno per il test della presenza di un elemento in un set oppure di una chiave in una mappa, il tempo era O(log n) e non O(1), come invece capita in altri linguaggi. Non so se la situazione è cambiata in questi anni, per cui mi fermo qui.

hollywoodundead
24-08-2013, 09:38
Sì, Ulm per la precisione. Non potevo far morire di fame la mia famiglia.

In Sicilia è molto difficile trovare un lavoro, e tante volte viene schiavizzato. Spostarmi dalla Sicilia verso Roma o in sù avrebbe significato scendere comunque nella mia terra un paio di volte l'anno, prendendo uno stipendio che mi avrebbe permesso di sopravvivere.

Allora tanto vale espatriare, perché c'è tutto da guadagnare. Intanto basta uscire appena fuori dall'Italia e il salario è molto più elevato (ovviamente in paesi come Svizzera, Germania, ecc.; in Europa la situazione non è tutta la florida).

Poi anche perché il valore e il merito vengono apprezzati, premiati, e... molto ricercati. Cercando lavoro all'estero, se sei discretamente bravo, la situazione diventa l'opposto che in Italia: a volte hai l'imbarazzo della scelta, e spesso sono le aziende che cercano te e non il viceversa.

Per non parlare poi dell'ambiente di lavoro, ma in generale anche dell'ambiente (civile) in cui vivi: i servizi funzionano MOLTO bene, c'è parecchia pulizia, ordine, e rispetto degli altri. Ovviamente non è tutto perfetto, ma la differenza con l'Italia è lampante. Qui ti preoccupi se l'autobus è in ritardo di un paio di minuti; e se non sei presente alla fermata all'orario previsto, c'è una discreta possibilità che tu l'abbia perso perché l'autista ha spaccato il secondo; ma lo stesso autista si ferma e ASPETTA alla fermata se per caso è arrivato troppo presto alla tappa prevista (ha un monitor LCD touchscreen in cui è mappato tutto, secondo per secondo).

Chi fosse ancora indeciso sul da farsi, può immaginare, quindi, quale sia il mio consiglio.

Tornando al topic, rispondo al volo a marco.r su un punto (sul resto mi trovo sostanzialmente d'accordo). La libreria standard C++ non è stata pensata per le prestazioni. Ricordo che per lo meno per il test della presenza di un elemento in un set oppure di una chiave in una mappa, il tempo era O(log n) e non O(1), come invece capita in altri linguaggi. Non so se la situazione è cambiata in questi anni, per cui mi fermo qui.

OT: Ma fai bene, io ho sempre detto che se prendi una laurea in informatica o hai già abbastanza esperienza alle spalle, e rimani in italia, ora come ora sei un cretino :D. L'estero come junior developer prendi 3000 sterline lorde che sono 2500 sterline circa nette. Trasformale in € e hai 3000€ netti, ripeto netti. La fonte, un conoscente che lavora a londra.

nico159
24-08-2013, 10:16
Tornando al topic, rispondo al volo a marco.r su un punto (sul resto mi trovo sostanzialmente d'accordo). La libreria standard C++ non è stata pensata per le prestazioni. Ricordo che per lo meno per il test della presenza di un elemento in un set oppure di una chiave in una mappa, il tempo era O(log n) e non O(1), come invece capita in altri linguaggi. Non so se la situazione è cambiata in questi anni, per cui mi fermo qui.
Stai facendo confusione, lo fa non per incapacità di chi scrive le varie implementazioni della STL, ma perchè è nel requisito di map mantenere l'ordine di inserimento
Ne deriva che std::map è un albero, e come tale appunto O(log n) per la ricerca

C++ TR1 ha aggiunto std::unordered_map che è una hashtable

Quindi due containers per usi diversi

E' un pò la situazione al contrario di Python, dove offre nativamente una hashtable ma non c'è alcun albero nella sua std (che io ricordi)

cdimauro
24-08-2013, 12:38
Esattamente. In Python se c'è un "contenitore" non ordinato (che è la norma), si usa una hash table.

Ricordo che in C++ l'albero veniva usato anche per implementare i set, oltre che le mappe, che sulla carta non dovrebbero essere ordinati.

Strana la scelta dell'albero, comunque, perché il requisito principale per una mappa o un set dovrebbe essere quello di recuperare velocemente una valore oppure di controllare la presenza o meno di un elemento. Molto, molto raramente potrebbe servire mantenere l'ordine d'inserimento degli elementi...

@hollywoodundead: se 3000 sterline lorde si trasformano in 2500 pulite, Londra è conveniente dal punto di fiscale; ma la vita, che io sappia, è molto cara.
Viceversa, in Germania si pagano parecchie tasse. Però ci sono un sacco di agevolazioni per le famiglie; ad esempio avendo moglie si può scegliere di sommare i redditi e il calcolo della percentuale delle tasse si fa prendendo come riferimento la metà del totale; oppure ti danno 182€ al mese per ogni figlio, fino alla maggiore età.
Comunque la vita è all'incirca la stessa che in Italia, se non addirittura inferiore.
Quando trovo QUI un barattolo di Nutella da 1Kg. a 3,99€, provo un forte senso di rabbia sapendo quanto la fanno pagare in Italia,ma soprattutto dove viene prodotta...

hollywoodundead
24-08-2013, 13:13
Esattamente. In Python se c'è un "contenitore" non ordinato (che è la norma), si usa una hash table.

Ricordo che in C++ l'albero veniva usato anche per implementare i set, oltre che le mappe, che sulla carta non dovrebbero essere ordinati.

Strana la scelta dell'albero, comunque, perché il requisito principale per una mappa o un set dovrebbe essere quello di recuperare velocemente una valore oppure di controllare la presenza o meno di un elemento. Molto, molto raramente potrebbe servire mantenere l'ordine d'inserimento degli elementi...

@hollywoodundead: se 3000 sterline lorde si trasformano in 2500 pulite, Londra è conveniente dal punto di fiscale; ma la vita, che io sappia, è molto cara.
Viceversa, in Germania si pagano parecchie tasse. Però ci sono un sacco di agevolazioni per le famiglie; ad esempio avendo moglie si può scegliere di sommare i redditi e il calcolo della percentuale delle tasse si fa prendendo come riferimento la metà del totale; oppure ti danno 182€ al mese per ogni figlio, fino alla maggiore età.
Comunque la vita è all'incirca la stessa che in Italia, se non addirittura inferiore.
Quando trovo QUI un barattolo di Nutella da 1Kg. a 3,99€, provo un forte senso di rabbia sapendo quanto la fanno pagare in Italia,ma soprattutto dove viene prodotta...

Ti sbagli, la vita è completamente diversa. L'equazione italia = Inghilterra/Germania/o addirittura la polonia non regge. Non voglio andare troppo fuori argomento pergiunta in un 3d da me aperto :D (se ti va possiamo aprire un topic apparte ;) ), posso "solo" dirti che, per quanto riguarda l'inghilterra è vero che alcune cose costano di piu (prevalentemente il cibo e i trasporti) per il resto le cose costano uguali o di meno. La vera differenza è che in inghilterra lo stipendio come ti ho già detto è moooolto piu alto. Qui stiamo parlando di uno junior developer, cioè una persona che non ha l'esperienza nemmeno di una formica (ad esempio me,con tutto il rispetto di una formica) che in un anno si porta a casa circa 30000 sterline nette. Senza contare tutti i benefits che ti danno come l'ingresso in palestra gratis,da 22 giorni a un massimo di 30 giorni (non ricordo se fossero 30 o 38 giorni) di ferie e via dicendo. Vuoi mettere l'ambiente di lavoro? qualcuno qua dentro è mai entrato in un ambiente di lavoro (uno studio di sviluppatori intendo) di londra? La pulizia delle postazioni, l'ordine, la disciplina e sopratutto il fatto di dialogare con i propri superiori come se non fossero dei superiori o dei capi.Non parlo nemmeno della prima azienda londinese nella classifica, ma della 7, quindi una via di mezzo. In italia, sempre che riesci a superare la barriera dell'apprendistato dove se soddisfi questa disequazione 23<=x<=29 hai buone possibilità di farti assume e sperare di arrivare al massimo della tua carriera a 1800€ (ora come ora, un tempo gli stipendi volavano) altrimenti, non importa quanto valido sia il tuo portfolio ma costi troppo per l'azienda. Ci sono anche grossi difetti a londra, ma i pregi superano di gran lunga i difetti. Se poi sei un tipo in gamba e riesci ad aprirti una startup, puoi finire tranquillamente pure nella Silicon Valley, nel cuore dei guru. ;)

WarDuck
24-08-2013, 13:17
Esattamente. In Python se c'è un "contenitore" non ordinato (che è la norma), si usa una hash table.

Ricordo che in C++ l'albero veniva usato anche per implementare i set, oltre che le mappe, che sulla carta non dovrebbero essere ordinati.

Strana la scelta dell'albero, comunque, perché il requisito principale per una mappa o un set dovrebbe essere quello di recuperare velocemente una valore oppure di controllare la presenza o meno di un elemento. Molto, molto raramente potrebbe servire mantenere l'ordine d'inserimento degli elementi...

...


Tra l'altro non è necessario usare un albero per mantere l'ordine di inserimento, basterebbe linkare gli elementi tra di loro (e tenersi il riferimento al last).
In questo caso si occupa più memoria (size del puntatore * size della hashtable) ma comunque si garantisce accesso O(1).

Che poi se non erro l'iteratore di map e set ti restituisce gli elementi secondo l'ordine naturale del comparatore usato e NON secondo quello di inserimento, ma non vorrei sbagliarmi.

nico159
24-08-2013, 13:26
Che poi se non erro l'iteratore di map e set ti restituisce gli elementi secondo l'ordine naturale del comparatore usato e NON secondo quello di inserimento, ma non vorrei sbagliarmi.
Sì ho detto ovviamente una vaccata, gli elementi sono ordinati secondo una funzione binaria, che di default è std::less

Non avrebbe senso altrimenti

Grazie della correzione ;)

hollywoodundead
24-08-2013, 14:10
a londra una stanza la paga 600 sterline al mese...

La gente non usa il cervello. A quella cifra la pagherebbe solo un cretino. La maggiorparte delle persone è convinta che prendere la stanza a 5 minuti dal posto di lavoro sia un affare quando con 400 sterline in zona 3, con la tube ( che sarebbe la metro) arrivi in centro in meno di 20 minuti, senza contare poi il fatto che al centro ti danno un buco mentre fuori zona si trova di meglio.Peró proviamo lo stesso a fare i cretini a londra e vediamo se conviene ancora oppure no rispetto a roma. Basta una semplice proporzione rapportata allo stipendio. A Roma mediamente un appartamento ( stiamo considerando solo una persona, non un appartamento condiviso) l'affitto lo paghi mediamente sui 600&euro;. Uno junior in italia prende dai 900&euro; ai 1200 &euro; e paga circa il 50% di quello che guadagna per l'affitto, in inghilterra spenderebbe 600 sterline e pagherebbe circa meno del 25% del suo stipendio solo per l'affitto. Non so se hai mai visto una busta paga in inghilterra come è fatta ( ci saranno al massimo se ricordo bene 3 voci) perció quello che perdi nei trasporti in inghilterra lo riguadagni nella burocrazia che e strasemplificata senza tutta sta mania di attaccare marche da bollo ovunque per ogni cavolo di documento.Lo stipendio di un software Engineer a londra quasi mai scende sotto le 25000 sterline lorde al mese, quindi anche nel peggiore dei casi a londra contro il migliore dei casi in italia c'è un bel 20/25% di differenza. :)

WarDuck
24-08-2013, 15:51
Non ho esperienze dirette di Londra, cmq so che a Roma si trovano stanze dai 400 ai 600€ che vengono affittate agli studenti, con regolare contratto, ovviamente dipende dalla zona, per cui non so dove trovi appartamenti a 600€ (considera che questo è il prezzo che si trova in provincia).

hollywoodundead
24-08-2013, 19:29
Non ho esperienze dirette di Londra, cmq so che a Roma si trovano stanze dai 400 ai 600€ che vengono affittate agli studenti, con regolare contratto, ovviamente dipende dalla zona, per cui non so dove trovi appartamenti a 600€ (considera che questo è il prezzo che si trova in provincia).

In centro a roma appartamenti sotto i 500€; non ne trovi quasi nessuno. Io non parlo di periferia ne tantomeno di appartamenti per studenti condivisi, perche in quel caso a londra come dicevo costano dalle 400 fino a scendere alle 110 sterline al mese e sicuramente ti danno un buco con altre 5 persone insieme a te. Se vai in periferia a londra, con 2500 sterline, spendi il 15% del tuo stipendio contro il 33% in italia. Solo che in italia nom guadagni 3000&euro;. Quello che dalle proporzioni non traspare bene è quello che ti rimane. In italia ti rimangono 600&euro;, in inghilterra te ne rimangono 2000 di sterline che sono circa 2400€;. Bisogna rifletterci. In inghilterra una casa la costruisco impiegando circa 4 volte e mezzo in meno di tempo che in italia. Ah ovviamente qua parliamo di un developer junior, non stiamo nemmeno considerando un senior. Poi in inghilterra c'è molta intraprendenza e competizione , non rimani fermo a vita come junior, si cerca sempre di far carriera e quindi sono tutti pronti un giorno ad aprirsi la propria start-up o ad emigrare in america per usufruire delle agevolazioni fiscali per farlo. :)

Tommo
25-08-2013, 03:49
La gente non usa il cervello. lol ensues

Guarda, mi sono trovato in questa situazione e ho preferito spendere quasi 150 euro in piu' al mese per stare a 8 minuti a piedi dall'ufficio, ti ringrazio per avermi giudicato come coglione dalla tua comoda sedia in italia :D

Per quanto mi riguarda, i soldi sono fatti per spenderli e una casa vicina al centro e' un valore, cosa difficile forse da comprendere con la mentalita' pezzentaccia da italiano.
A parte risparmiare quasi 30 minuti a viaggio (sono 5 ore a settimana, quasi un giorno di lavoro aggiuntivo) e i soldi del bus e la rottura di minchia di prendere i mezzi e alzarsi troppo presto, c'e' il vantaggio che tutte le cose divertenti si fanno al centro.
Per cui ogni volta che esci a farti una birra sono altri 30 minuti di rottura di palle, 30 minuti sottratti all'uscita (supponendo che non puoi andare a dormire 30 min piu' tardi) e in piu' in tutte le citta' i mezzi a una certa chiudono, e quindi se esci vivi nel terrore e non hai flessibilita', e in finale esci di meno e perdi occasioni per fare altro nella vita che non sia il lavoro.
Invece io qualunque ora faccio in massimo 10 min di bici sono a casa.

Questo per confermare il vecchio adagio "chi piu' spende meno spende".
Poi certo se il cash non cel'hai e' un'altro discorso :asd:

PS questo si' che e' un OT :asd:

hollywoodundead
25-08-2013, 07:33
Guarda, mi sono trovato in questa situazione e ho preferito spendere quasi 150 euro in piu' al mese per stare a 8 minuti a piedi dall'ufficio, ti ringrazio per avermi giudicato come coglione dalla tua comoda sedia in italia :D

Per quanto mi riguarda, i soldi sono fatti per spenderli e una casa vicina al centro e' un valore, cosa difficile forse da comprendere con la mentalita' pezzentaccia da italiano.
A parte risparmiare quasi 30 minuti a viaggio (sono 5 ore a settimana, quasi un giorno di lavoro aggiuntivo) e i soldi del bus e la rottura di minchia di prendere i mezzi e alzarsi troppo presto, c'e' il vantaggio che tutte le cose divertenti si fanno al centro.
Per cui ogni volta che esci a farti una birra sono altri 30 minuti di rottura di palle, 30 minuti sottratti all'uscita (supponendo che non puoi andare a dormire 30 min piu' tardi) e in piu' in tutte le citta' i mezzi a una certa chiudono, e quindi se esci vivi nel terrore e non hai flessibilita', e in finale esci di meno e perdi occasioni per fare altro nella vita che non sia il lavoro.
Invece io qualunque ora faccio in massimo 10 min di bici sono a casa.

Questo per confermare il vecchio adagio "chi piu' spende meno spende".
Poi certo se il cash non cel'hai e' un'altro discorso :asd:

PS questo si' che e' un OT :asd:

OT: prima di tutto io ti ho dato del cretino, non del coglione, quindi già hai appesantito la parola. L'altra cosa che mi fa ridere degli italiani in generale che vanno a londra, è la risposta che mi hai appena dato, cioè che io sarei un pezzente perchè sto in italia mentre te che vivi ora a londra, ti saresti trasformato in un angelo, una sorta di purificazione, ma perfavore..Le sottigliezze di cui parli sono cavolate, non sono 20 minuti che mi sveglio prima a cambiarmi la vita(dove lo vedi l'alzarsi troppo presto). Non so che lavoro fai te, per preoccuparti di 20 minuti per arrivare a lavoro, ma in genere nel settore di cui ho parlato io alle 18 sei fuori dall'ufficio, non è come in italia che esci alle 19.30/21 regolarmente. alle 18.30 arrivi a casa, te ci arrivi alle 18.10, mamma mia che differenza. Parli di terrore flessibilità, ma che cosa vai dicendo...:doh:.Poi se ti preoccupi cosi tanto dell'orario, dell'uscita al centro, della bevuta di birra con gli amici (che è uno dei principali difetti di londra) allora sicuramente non fai il software engineer ma altri lavori come pizzaiolo, cameriere che di solito vedono la porta exit solo verso le 23 di sera(posizioni che io rispetto comunque se uno all'inizio non riesce a trovare lavoro nel settore che gli interessa)ma che non centrano nulla con il settore di cui parlo io. :)

hollywoodundead
25-08-2013, 09:36
giovane, io ci lavoro in Inghilterra... :asd:

se prendi una stanza in zona 3 a 400 sterline (sempre una stanza in un appartamento condiviso eh...) poi devi fare l'abbonamento alla metro... hai idea di quanto costi?

P.S. hai mai fatto un giro nella metro nelle ore di punta?

che gli stipendi siano superiori in Italia non ci piove. che il costo della vita a londra sia ben superiore nemmeno. non è l'eldorado, ci vuole grandissimo spirito di sacrificio. Non è che tutti i neolaureati arrivano lì e guadagnano cifre astronomiche appena usciti dall'uni... il merito e le competenze giocano un ruolo fondamentale, al contrario che in italia.

no, non so che giri hai fatto tu, ma con 400/450 sterline trovi un appartamento (senza condivisione, mantenuto in buone condizioni). L'abbonamento alla metro costa sulle 120 sterline al mese. In centro si parlava di 600 sterline per l'appartamento, sempre se ti va bene, altrimenti il prezzo sale pure tranquillamente. Risparmi quelle 80/100 sterline e hai la comodità di non andare solo a lavoro ma di poterti spostare anche in altre zone periferiche di londra, cosa che senza abbonamento, cosa fai? te la fai a piedi?. Il mio è un discorso rivolto a chi vuole avere le stesse comodità piu o meno di chi abita al centro e vuole risparmiare gli euro che utilizzerà fintanto che non trova lavoro. Se poi hai la mamma e il papi (non mi riferisco a te) che ti pagano l'alloggio in centro, per i primi mesi allora non sei quel tipo di persona che deve pensare a queste sciocchezze. :)

hollywoodundead
25-08-2013, 10:43
un bilocale (one bedroom flat) a 35 minuti da waterloo costa sulle 750 sterline al mese, a cui devi aggiungere la council tax che è sulle 100 sterline al mese. a londra, sotto 1000-1200 sterline non trovi nemmeno studio flats, cioè monolocali.

Il bilocale di cui parli è fatto di marmo con con tanto di mattonelle dorate in bagno? :D guarda per mia esperienza, non so quanto assiduamente hai cercato l'appartamento in zona 3, ma qui non stiamo parlando di prendersi un appartamento permanente, dove per permanente intendo quegli alloggi ristrutturati in tutto e per tutto che arrivano a costare quelle cifre se non il doppio. Non stiamo parlando neanche di prenderci delle topaie con tane di topi (visti di persona). Qua si parla di sistemarsi in un locale decente, ne piu ne meno. Se arrivi già con il lavoro pronto è ovvio che andrai a cercare subito una sistemazione migliore rispetto a chi arriva a londra con qualche soldo. Per quanto mi riguarda un monolocale per chi si trasferisce, senza aver ancora trovato lavoro, va già benissimo. La council tax la paghi sia in centro che fuori, quindi è un parametro che non va considerato nella proporzionalità.



un abbonamento zona 1-4 costa 170 sterline al mese.

Un abbonamento zona 1-3 costa 120 sterline. Non cambiamo le carte in tavola, zona 4 non centra nulla. Volendo si potrebbe scegliere anche la zona 2 dove trovi degli appartamenti tutto sommato accessibili.

in centro a londra con 600 sterline al mese non si scomodano nemmeno di risponderti al telefono gli estate agents...

Tu cerchi appartamento tramite gli estate agents? guarda qui http://www.livinglondonway.com/, questo sito lo conoscono tutti oramai.


muoversi a londra senza avere trovato un lavoro dall'italia per come la vedo io è impossibile a meno che non ti metti in mente di spendere veramente tanto (ma veramente) oppure di vivere in un ostello...

L'alternativa è quella di mettersi dei soldi da parte prima di partire se non riesci a trovarlo dall'italia e in attesa di trovarlo lavori in "altri settori". Che è poi quello che fanno molti italiani emigrati a londra.



Non vorrei che la nostra discussione diventi un dibattito infinito, quindi, se caso mai non dovessi essere d'accordo su alcune parti prendila semplicemente la mia, come un esperienza diversa dalla tua. Non tutti quelli che arrivano a londra si fermano negli stessi posti, fanno le stesse cose e hanno quindi la stessa esperienza per poter fare un confronto di pareri. Magari uno va in zona 2 vede i prezzi in quella zona come sono, e crede che siano gli stessi in zona 3 e via dicendo, quando la zona 3 in realtà non è riuscito a visitarla per bene. Questo discorso lo faccio anche per me non solo per te. ;)

hollywoodundead
25-08-2013, 11:34
fammi capire, tu credi sinceramente di poter trovare un appartamento in zona 3 a londra a 600 sterline? 750 sterline al mese a 35 min da londra sono per normalissimi bilocali da 50 mq. Senza voler fare un dibattito infinito, io qua ci vivo... tu cerchi su internet o vivi qui? e no, la council tax è ben più alta se vivi a londra, quindi no, non puoi escluderla dal ragionamento... :asd:

e cmq si, qua si fa quasi tutto tramite estate agents perchè non hai nessun vantaggio a non farlo, a meno che rischiare personalmente... credit check anyone? :asd:

quel sito che hai linkato non ho idea di cosa sia... forse qualcosa per cercare una stanza se vieni dall'italia e vuoi studiare inglese... qui di certo non cerchi una casa da affittare tramite quel genere di siti... gestiti da italiani per giunta...una garanzia..

Ho esperienze dirette di un conoscente che vive a londra come ci vivi te. Ti ripeto un monolocale, a 400 sterline in zona 3 lo trovi. Ed è un monolocale (tu continui a parlare di bilocale) a 25 minuti da londra non 35 come scrivi te. La council tax se vivi in centro rispetto alla zona 3 non cambia di molto, la differenza precisa non la saprei, ma in quel caso se fosse piu costosa a londra centro torniamo punto e a capo che comprare casa in centro non conviene. Sei sicuro di vivere a londra, perchè Farnborough è bello distante da londra :D

ps: guardati anche qualche video su youtube di esperienze dirette di italiani emigrati all'estero, non per sentito dire, sempre su quell'azienda che ho riportato, poi ne riparliamo ;)

Tommo
25-08-2013, 12:15
OT: prima di tutto io ti ho dato del cretino, non del coglione, quindi già hai appesantito la parola. L'altra cosa che mi fa ridere degli italiani in generale che vanno a londra, è la risposta che mi hai appena dato, cioè che io sarei un pezzente perchè sto in italia mentre te che vivi ora a londra, ti saresti trasformato in un angelo, una sorta di purificazione, ma perfavore..

wat

mi spiace se ti sono sembrato ostile, ma il tono era assolutamente scherzoso... inoltre non mi sono trasformato ne niente, e' solo che vivendole le cose uno si rende conto un po' meglio che parlandone sui forum u know.
Quando non sei te a farti 20 ore di mezzi al mese e' facilissimo criticare chi spende di piu' per un po' di comodita', d'altra parte siamo un paese con 60 milioni di agenti immobiliari :asd:
E mi dispiace ma non importa quanto ti incazzi sul forum, rimarro' della mia idea... volevo solo condividere il mio punto di vista.
Grazie per aver provato a insegnarmi come si vive comunque, su un forum e dall'alto del tuo non avere alcuna esperienza diretta, ne faro' tesoro.

PS: Stoccolma :D

hollywoodundead
25-08-2013, 12:30
wat

mi spiace se ti sono sembrato ostile, ma il tono era assolutamente scherzoso... inoltre non mi sono trasformato ne niente, e' solo che vivendole le cose uno si rende conto un po' meglio che parlandone sui forum u know.
Quando non sei te a farti 20 ore di mezzi al mese e' facilissimo criticare chi spende di piu' per un po' di comodita', d'altra parte siamo un paese con 60 milioni di agenti immobiliari :asd:
E mi dispiace ma non importa quanto ti incazzi sul forum, rimarro' della mia idea... volevo solo condividere il mio punto di vista.
Grazie per aver provato a insegnarmi come si vive comunque, su un forum e dall'alto del tuo non avere alcuna esperienza diretta, ne faro' tesoro.

PS: Stoccolma :D

Mi raccomando la prossima volta l'appartamento prendilo sotto il palazzo reale, sicuramente sarai vicino a ogni cosa :D

Tommo
25-08-2013, 12:37
Mi raccomando la prossima volta l'appartamento prendilo sotto il palazzo reale, sicuramente sarai vicino a ogni cosa :D

Per quello non c'ho issoldi, e poi e' piu' lontano :D
Ma se guadagnassi in proporzione ci starebbe, e' quello che intendo.

cdimauro
25-08-2013, 15:11
@Tommo: la qualità della vita la misuro in maniera diversa, rispetto a te che ne hai parlato appositamente.
Io preferisco la tranquillità, in una zona più decentrata; non mi piace il caos e la confusione.
Usando i mezzi pubblici (che qui costano poco: 52€ al mese per l'abbonamento mensile, e circa 40€ al mese con quello annuale) sfrutto i tempi morti leggendo qualcosa. Quindi non è tempo che perdo, ma che impiego diversamente...
In ogni caso a piedi in azienda non potrei andarci, perché si trova nei pressi (quindi nemmeno all'interno) di un paesino (frazione?) e non al centro.
Sì, potrei anche cercare casa da quelle parti, ma per contro avrei in generale difficoltà a muovermi perché in quella zona i mezzi sono MOLTO più rari (è pur sempre un paesino, e non una zona decentrata della città). Diciamo che, per quel che ho capito del tuo stile di vita, ti troverebbero appeso a un albero dopo un po' di tempo... :asd:
La sera puoi uscire e andare in qualche locale anche in un posto più decentrato. Più lontano dal centro non significa che non trovi servizi e/o locali. Magari ce ne sono di meno o con meno frequenza, ma c'è tutto. Poi se vuoi cambiare locali in continazione, o ti piace girare nella zona centrale in mezzo a tanta gente, la questione è diversa e ti posso capire, ma sfruttando i mezzi pubblici puoi fare ugualmente quello che vuoi, pur con tutti i limiti del caso (orari notturni molto più diradati, o anche sospesi in alcune fasce orarie, peraltro ridotte).
Io non credo che ti cambi la vita dover perdere 15-20 minuti (in più) per andare al centro o al lavoro. Anche perché quando esci per cazzeggiare il tempo ha un valore relativo, o praticamente nullo: vai a farti un giro e basta, senza stare a controllare continuamente i minuti...

Comunque, forse è meglio ritornare in topic. Non pensavo che anche parlare di queste cose potesse portare a delle guerre personali... :rolleyes:
Tra l'altro non è necessario usare un albero per mantere l'ordine di inserimento, basterebbe linkare gli elementi tra di loro (e tenersi il riferimento al last).
In questo caso si occupa più memoria (size del puntatore * size della hashtable) ma comunque si garantisce accesso O(1).
Infatti. E' la soluzione adottata in Python per l'OrderedDict.
Che poi se non erro l'iteratore di map e set ti restituisce gli elementi secondo l'ordine naturale del comparatore usato e NON secondo quello di inserimento, ma non vorrei sbagliarmi.
Così ha ancora meno senso. Veramente, ho una gran difficoltà a capire perché hanno voluto complicare così tanto l'implementazione per degli oggetti che sono nati per risolvere ben altri problemi. Bah...

hollywoodundead
25-08-2013, 15:44
Tranquillo non si litiga :) si spera che ognuno sia abbastanza maturo da resistere. :D

Tommo
25-08-2013, 16:38
@Tommo: ot ot ot ot ot ot

Beh, e' una cosa molto personale :D
A Stoccolma il centro e' piu' tranquillo che la periferia (e anche la' non c'e' paragone con Roma) visto che e' quasi pedonale e pieno di parchi. In piu' l'ufficio sta in una zona centralissima, e non devo scegliere se stare vicino a quello o ai locali :D
E sono da solo.
E sono insofferente ai tempi morti a livello quasi ossessivo, sara' una deformazione professionale... voglio dire, ho pure preso la bici per metterci 4 minuti invece che 8.
Almeno se non ho niente da fare, prendo e mi vado a vedere un film al cinema dell'ufficio al volo :asd:

/OT

marco.r
25-08-2013, 17:46
Per quanto mi riguarda, i soldi sono fatti per spenderli e una casa vicina al centro e' un valore, cosa difficile forse da comprendere con la mentalita' pezzentaccia da italiano.

Non e' questione di essere pezzenti, ma di cosa ci fa uno con la casa... uno puo' decidere di spendere meno, oppure di spendere lo stesso per avere una casa piu' grande o piu' confortevole. Una casa piu' grande vuol dire avere piu' spazio per le stesse cose e quindi meno tempo perso a mettere in ordine, potere invitare piu' amici in casa o semplicemente poter fare attivita' che altrimenti non ti potresti permettere.
E' questione di priorita'.

Io ora vivo fuori citta' (in Italia), ci metto un po' ad arrivare al lavoro, ma quando mi gira posso invitare gli amici per una grigliata in giardino, o anche dentro casa, senza il rischio di dover fare stare in piedi qualcuno.
Il tempo per andare al lavoro e' un po' un pacco, ma in parte si recupera nella comodita' di poter usufruire dell'auto senza problemi e questo fa risparmiare tempo in altre occasioni... posso fare la spesa una volta alla settimana visto che carico tutto in auto, in paese tutto e' a cinque minuti a piedi o due minuti in auto, senza grossi problemi di parcheggio.


Invece io qualunque ora faccio in massimo 10 min di bici sono a casa.

Io invece qualunque tempo faccia in auto sono a casa asciutto :asd:.
Come dicevo, questione di priorita', e io sono molto pigro :D

marco.r
25-08-2013, 18:06
Tra l'altro non è necessario usare un albero per mantere l'ordine di inserimento, basterebbe linkare gli elementi tra di loro (e tenersi il riferimento al last).
In questo caso si occupa più memoria (size del puntatore * size della hashtable) ma comunque si garantisce accesso O(1).

Che poi se non erro l'iteratore di map e set ti restituisce gli elementi secondo l'ordine naturale del comparatore usato e NON secondo quello di inserimento, ma non vorrei sbagliarmi.

SI ma un albero binario e una hash table sono due cose totalmente diverse. Non e' che gli autori della libreria standard non sapessero cosa fossero gli hash table; se ricordo bene non furono inseriti nello standard perche' non si arrivo ad un accordo prima della deadline che si erano imposti, e piuttosto che inserire nello standard qualcosa di non ottimale, preferirono lasciarle fuori.
In realta' poco male perche' praticamente tutte le implementazioni della libreria standard hanno avuto una implementazione dell'hash table per... boh 15 anni ?
Il confronto quindi non ha molto senso perche' non e' mai stata una questione di "oddio utilizzo una mappa lenta perche' la ricerca e' log(N)", ma un "dove trovo una implementazione di una hash table da utilizzare nel mio progetto?".
Quando dico che la libreria standard del C++ e' realizzata con le performance in mente, non mi riferisco tanto a quello che c'e' o non c'e', ma come e' realizzato quello che c'e'.
Tenete presente che parliamo di 20 anni fa circa, quando le librerie standard di un linguaggio non erano poi cosi' complete come lo sono oggi.
Ad esempio gli stream di input e output sono stati pensati affinche' i metodi utilizzati per la lettura/scrittura non siano virtuali, ma che lo siano solo i metodi di caricamento/scaricamento dei buffer sottostanti, in modo che pur offrendo una interfaccia estendibile, questo non vada a discapito delle performance (rispetto al C).
Spero di aver reso l'idea

vendettaaaaa
25-08-2013, 19:42
Sì ma ne è passata di acqua sotto i ponti...STL e Standard Library sono state sviluppate nel frattempo, sono stati aggiunti altri contenitori (unordered_map come dicevano, e unordered_set, unordered_multimap, stack, queue, deque, ecc), e ora sono scritte in C++11.

Tommo
26-08-2013, 00:17
Sì ma ne è passata di acqua sotto i ponti...STL e Standard Library sono state sviluppate nel frattempo, sono stati aggiunti altri contenitori (unordered_map come dicevano, e unordered_set, unordered_multimap, stack, queue, deque, ecc), e ora sono scritte in C++11.

Beh, stack, queue e deque sono semplici wrapper (di default attorno a std::vector) quindi non fanno niente di nuovo e al massimo sono piu' lenti.
C++11 pero' porta le move semantics, che dovrebbero evitare una SVARIA di copie ad es. quando si cancella un elemento da un vector o si ritorna una stringa per valore, due casi estremamente comuni.

Pero' ottimizzazioni a parte, usare la STL invece che C puro ti ruba sempre quel 50% di performance... certo, dipende da cosa devi fare. Io ultimamente me ne frego e uso C++11 dappertutto, pero' quando c'e' quel pezzetto di codice che fa da collo di bottiglia, purtroppo l'ottimizzazione #1 e' togliere ogni traccia della STL.

marco.r
26-08-2013, 09:20
Beh, stack, queue e deque sono semplici wrapper (di default attorno a std::vector) quindi non fanno niente di nuovo e al massimo sono piu' lenti.
C++11 pero' porta le move semantics, che dovrebbero evitare una SVARIA di copie ad es. quando si cancella un elemento da un vector o si ritorna una stringa per valore, due casi estremamente comuni.

Pero' ottimizzazioni a parte, usare la STL invece che C puro ti ruba sempre quel 50% di performance... certo, dipende da cosa devi fare. Io ultimamente me ne frego e uso C++11 dappertutto, pero' quando c'e' quel pezzetto di codice che fa da collo di bottiglia, purtroppo l'ottimizzazione #1 e' togliere ogni traccia della STL.

Uhm, questo invece e' strano. Riesci a darmi un esempio ?

Tommo
26-08-2013, 09:45
Purtroppo non ho codice specifico... ti dovrai accontare degli aneddoti temo :D
La perdita di efficienza si nota piu' su larga scala quando tutte le copie in giro di stringhe iniziano a farsi sentire.
Pero' in un contest ho avuto un enorme vantaggio a a togliere tutte le std::string dal codice "hot", a quanto pare usare const std::string& non e' requisito sufficiente per impedire il passaggio per copia :D
std::vector stesso, specie se usato per contenere il tipo invece che un puntatore al tipo, ha una brutta tendenza a chiamare costruttori (copy e default) come se niente fosse.

Questo per dire, e' molto difficile prevedere che cosa fara' la STL su diversi compilatori, e molto spesso se si vuole essere sicuri che l'efficienza sia la stessa cross-platform l'unica e' provarle tutte o togliere tutto.

PS: si 50% era un tantino eccessivo :asd:

marco.r
26-08-2013, 10:47
Purtroppo non ho codice specifico... ti dovrai accontare degli aneddoti temo :D
La perdita di efficienza si nota piu' su larga scala quando tutte le copie in giro di stringhe iniziano a farsi sentire.
Pero' in un contest ho avuto un enorme vantaggio a a togliere tutte le std::string dal codice "hot", a quanto pare usare const std::string& non e' requisito sufficiente per impedire il passaggio per copia :D.

:mbe: non e' che ti eri dimenticato di mettere qualche & ? Se e' per riferimento e' per riferimento, non ci sono tante alternative :D
Mi verrebbe il dubbio che possa essere colpa di c_str, se l'hai usato, ma penso che tutte le implementazione della libreria standard non facciano altro che ritornare il puntatore alla memoria interna (quella di g++ fa cosi' ad esempio)
Se riesci a trovare un esempio sarebbe carino studiarlo e capire da cosa possa essere dovuto.


std::vector stesso, specie se usato per contenere il tipo invece che un puntatore al tipo, ha una brutta tendenza a chiamare costruttori (copy e default) come se niente fosse.

Qui hai un paio di tecniche che puoi usare.
Per evitare il costruttore di default, non inizializzare il vettore con la dimensione desiderata, ma lascialo a dimensione zero e "riserva" lo spazio.
Per evitare il costruttore di copia, con C++11 usa emplace_back invece che
push_back
Cosi', invece che

std::vector<Foo> bar(1000); // Chiama Foo() 1000 volte
for (unsigned i=0; i<bar.size(); ++i )
bar[i] = Foo(...); // costruttore di copia chiamato inutilmente


Scrivi qualcosa tipo

std::vector<Foo> bar;
bar.reserve(1000); // no costruttore di default
for (unsigned i=0; i<1000; ++i )
bar.emplace_back( Foo(...) ); // no costruttore di copia

Poi bisogna vedere di preciso cosa devi fare, ovviamente...



Questo per dire, e' molto difficile prevedere che cosa fara' la STL su diversi compilatori, e molto spesso se si vuole essere sicuri che l'efficienza sia la stessa cross-platform l'unica e' provarle tutte o togliere tutto.

PS: si 50% era un tantino eccessivo :asd:
No in realta', e' prevedibilissimo... solo che e' un sacco di roba ed e' difficile tenere tutto a mente, soprattutto quando si diventa vecchi :D (parlo per me eh)

vendettaaaaa
26-08-2013, 17:29
:mbe: non e' che ti eri dimenticato di mettere qualche & ? Se e' per riferimento e' per riferimento, non ci sono tante alternative :D
Mi verrebbe il dubbio che possa essere colpa di c_str, se l'hai usato, ma penso che tutte le implementazione della libreria standard non facciano altro che ritornare il puntatore alla memoria interna (quella di g++ fa cosi' ad esempio)
Se riesci a trovare un esempio sarebbe carino studiarlo e capire da cosa possa essere dovuto.


Qui hai un paio di tecniche che puoi usare.
Per evitare il costruttore di default, non inizializzare il vettore con la dimensione desiderata, ma lascialo a dimensione zero e "riserva" lo spazio.
Per evitare il costruttore di copia, con C++11 usa emplace_back invece che
push_back
Cosi', invece che

std::vector<Foo> bar(1000); // Chiama Foo() 1000 volte
for (unsigned i=0; i<bar.size(); ++i )
bar[i] = Foo(...); // costruttore di copia chiamato inutilmente


Scrivi qualcosa tipo

std::vector<Foo> bar;
bar.reserve(1000); // no costruttore di default
for (unsigned i=0; i<1000; ++i )
bar.emplace_back( Foo(...) ); // no costruttore di copia

Poi bisogna vedere di preciso cosa devi fare, ovviamente...



No in realta', e' prevedibilissimo... solo che e' un sacco di roba ed e' difficile tenere tutto a mente, soprattutto quando si diventa vecchi :D (parlo per me eh)
Ma usare una tastiera italiana con le lettere accentate no? :D

cdimauro
26-08-2013, 17:39
Dipende da dove trovi: magari non ce ne sono. :O

Comunque C++ e STL li ho usati alla fine della scorsa decade, per cui di C++11 non c'era manco l'ombra...

vendettaaaaa
26-08-2013, 18:48
Dipende da dove trovi: magari non ce ne sono. :O

Comunque C++ e STL li ho usati alla fine della scorsa decade, per cui di C++11 non c'era manco l'ombra...
Retrogrado :cool:

Tommo
26-08-2013, 20:28
:mbe: non e' che ti eri dimenticato di mettere qualche & ? Se e' per riferimento e' per riferimento, non ci sono tante alternative :D
Mi verrebbe il dubbio che possa essere colpa di c_str, se l'hai usato, ma penso che tutte le implementazione della libreria standard non facciano altro che ritornare il puntatore alla memoria interna (quella di g++ fa cosi' ad esempio)
Se riesci a trovare un esempio sarebbe carino studiarlo e capire da cosa possa essere dovuto.


L'esempio non cel'ho :(
Comunque era una funzione che tornava una reference al secondo membro (stringa) di un iteratore di un'unordered_map.
Vattelappesca :D

Inoltre con lo stepping non entrava in nessun operatore/costruttore esplicito, quindi puo' essere che sia qualcosa che il compilatore stava facendo dietro le quinte.
Sostituire tutto con const char* passati in giro (:muro: ) ha risolto il problema, e ovviamente ha velocizzato parecchio anche la costruzione della mappa (eliminando tutte le copie di stringhe e di memoria interne).


Qui hai un paio di tecniche che puoi usare.
Per evitare il costruttore di default, non inizializzare il vettore con la dimensione desiderata, ma lascialo a dimensione zero e "riserva" lo spazio.
Per evitare il costruttore di copia, con C++11 usa emplace_back invece che
push_back
Cosi', invece che...


E' un bel po' orrendo, se per sbaglio fai emplace dopo la grandezza riservata ti crasha :D
Forse in questo caso Array (http://en.cppreference.com/w/cpp/container/array) sarebbe la cosa migliore da usare, ma poi non growwa.


No in realta', e' prevedibilissimo... solo che e' un sacco di roba ed e' difficile tenere tutto a mente, soprattutto quando si diventa vecchi :D (parlo per me eh)

mah... le implementazioni della STL sono piuttosto portabili come behaviour, ma non ci metterei la mano sul fuoco che a livello di performance LLVM funziona uguale a libstlc++ che funziona uguale a CRT :D

Piccola chicca: nel caso di quel contest, massacrarsi a ricompilare tutto per usare la CRT statica e' valso 5% in meno sul tempo.

Ma usare una tastiera italiana con le lettere accentate no? :D

Quando m'hanno preso il pc ho deciso di fare il salto alla tastiera US-Mac, mai scelta fu piu' azzeccata.
Ci ho preso la mano in circa mezza giornata e ora scrivere su quella italiana mi fa strano almeno quanto scrivere su quella svedese... si vede che tastiera avevano in mente quando hanno deciso i simboli di C :D

marco.r
26-08-2013, 22:02
Ma usare una tastiera italiana con le lettere accentate no? :D

Il layout americano e' un must :D soprattutto perchi non vuole sboccare con le parentesi graffe e non puo' customizzarsi il layout....

marco.r
26-08-2013, 22:17
Inoltre con lo stepping non entrava in nessun operatore/costruttore esplicito, quindi puo' essere che sia qualcosa che il compilatore stava facendo dietro le quinte.
Sostituire tutto con const char* passati in giro (:muro: ) ha risolto il problema, e ovviamente ha velocizzato parecchio anche la costruzione della mappa (eliminando tutte le copie di stringhe e di memoria interne).

Per ottenere un risultato analogo bastava forse salvare i puntatori nella mappa... non e' detto, cmq sarebbe stato interessato provare


E' un bel po' orrendo, se per sbaglio fai emplace dopo la grandezza riservata ti crasha :D
Forse in questo caso Array (http://en.cppreference.com/w/cpp/container/array) sarebbe la cosa migliore da usare, ma poi non growwa.

No aspetta, la reserve riserva, ma se poi aggiungi l'elemento 1001 il vettore viene espanso. la reserve e' pensata proprio per dire al vettore "guarda che anche se faccio un push_back alla volta, so gia' che la lunghezza sara piu' o meno quella, per cui alloca gia' lo spazio necessario"



mah... le implementazioni della STL sono piuttosto portabili come behaviour, ma non ci metterei la mano sul fuoco che a livello di performance LLVM funziona uguale a libstlc++ che funziona uguale a CRT :D

Chiaro che le performance possono variare, quel che intendevo dire e' che se uno vuole riesce a capire in modo univoco e portabile (stavo per scrivere "chiaramente", ma poi ho cambiato idea :D) se verra' chiamato il costruttore di default o meno.


Quando m'hanno preso il pc ho deciso di fare il salto alla tastiera US-Mac, mai scelta fu piu' azzeccata.
Ci ho preso la mano in circa mezza giornata e ora scrivere su quella italiana mi fa strano almeno quanto scrivere su quella svedese... si vede che tastiera avevano in mente quando hanno deciso i simboli di C :D
Beh per un motivo o per l'altro fisicamente ho quasi sempre il layout italiano (piu' che altro per motivi di reperibilita', soprattutto sui portatili), tanto chi la guarda la tastiera ? :D
In realta' impostando layout inglese con lingua italiana sotto Windows (ma penso anche sotto Gnome) uno puo' scrivere tutte le lettere accentate che vuole preponendo uno dei due apostrofi (` o ') e poi la lettera... questo in realta' vale per un sacco di "varianti" come la dieresi con ", la tilde sopra la n con la ~ etc. Molto piu' comodo che ricordarsi N caratteri sparsi per la tastiera (ma molto scomodo per programmare.. e infatti lo uso solo quando devo scrivere documentazione per lavoro)

kwb
26-08-2013, 22:35
Volevo estendere il discorso, ritornando alla discussione originale :D , a Python e PyPy.
Come si relaziona quest'ultimo in termini di velocità rispetto a Java e rispetto a C++?
Inoltre, c'è qualche effettivo vantaggio nel non usare un compilatore JIT come fa Python? Se JIT da un effettivo vantaggio in termini di velocità, perchè non abbandonare il linguaggio puramente interpretato e passare al JIT?

Tommo
26-08-2013, 22:40
Per ottenere un risultato analogo bastava forse salvare i puntatori nella mappa... non e' detto, cmq sarebbe stato interessato provare


Vero, ma nel caso di quel programma avevo anche un'altro vantaggio... i puntatori facevano riferimento a un blocco di testo letto da file che coprivano in modo molto "denso"...
Quindi dopo averlo convertito in "C-like" potevo passare in giro direttamente puntatori a posizioni del file originale, praticamente facendo un solo malloc in assoluto.
Con le stringhe questo proprio non lo puoi fare :D

Penso sia una legge generale... piu' integri verticalmente e vai a basso livello, piu' efficienza (algoritmica e in esecuzione) ottieni. Ma paghi tutto con tempo e incomprensibilita'.


No aspetta, la reserve riserva, ma se poi aggiungi l'elemento 1001 il vettore viene espanso. la reserve e' pensata proprio per dire al vettore "guarda che anche se faccio un push_back alla volta, so gia' che la lunghezza sara piu' o meno quella, per cui alloca gia' lo spazio necessario"


Avevo capito male emplace :D
Effettivamente estende il vettore anche lui, evita solo di chiamare l'operatore copia.
In effetti emplace+move sembra che possono evitare la maggior parte degli sprechi... ci vuole di fare dei test.


Chiaro che le performance possono variare, quel che intendevo dire e' che se uno vuole riesce a capire in modo univoco e portabile (stavo per scrivere "chiaramente", ma poi ho cambiato idea :D) se verra' chiamato il costruttore di default o meno.


Rimane da vedere se a quel punto no conviene buttare tutto al secchio e rifarlo in C :asd:

nico159
27-08-2013, 08:03
Vero, ma nel caso di quel programma avevo anche un'altro vantaggio... i puntatori facevano riferimento a un blocco di testo letto da file che coprivano in modo molto "denso"...
Quindi dopo averlo convertito in "C-like" potevo passare in giro direttamente puntatori a posizioni del file originale, praticamente facendo un solo malloc in assoluto.
Con le stringhe questo proprio non lo puoi fare
Quando mi sono ritrovato in casi come questo (e sono comuni) ho usato: http://www.boost.org/doc/libs/1_54_0/libs/utility/doc/html/string_ref.html

LLVM se non sbaglio include nativamente qualcosa di similare

Stesse performance, rimanendo però nella comodità di avere un qualcosa di più che non due puntatori, ovvero con vari algoritmi pensati per funzionare in questi casi

Penso sia una legge generale... piu' integri verticalmente e vai a basso livello, piu' efficienza (algoritmica e in esecuzione) ottieni. Ma paghi tutto con tempo e incomprensibilita'.
Lo credo anche io, così come credo che se uno cerca veramente le performance vivere di cose come "il compilatore ci penserà lui" e simili, è un ragionamento assurdo, e ripeto per me

Io da semplice studente, concordo con te sul dire che la STL non è la soluzione a tutti i problemi perchè la STL non può coprire tutti i casi di utilizzo

Non sono d'accordo però con le tue conclusioni. Se qualcosa manca alla STL non significa che l'intero progetto deve migrare a C
C++ di suo può regredire nativamente a C, puoi mischiare i due stili esattamente dove serve (e se serve) lasciando tutto il resto in C++
Questo perchè comunque C++ ha cose a costo zero che non sono male, come i namespace, l'ereditarietà singola, i template, i costruttori/distruttori, RAII, i metodi non virtuali, l'overload degli operatori, i fuctors e probabilmente anche altro di cui puoi far uso senza problemi, C no

Tommo
27-08-2013, 10:46
Quando mi sono ritrovato in casi come questo (e sono comuni) ho usato: http://www.boost.org/doc/libs/1_54_0/libs/utility/doc/html/string_ref.html

Bello questo, mi sa che glielo copio :D

Non sono d'accordo però con le tue conclusioni. Se qualcosa manca alla STL non significa che l'intero progetto deve migrare a C


No no ma che siamo pazzi, mica ho detto questo...
Ho detto che il *subset da ottimizzare* del programma lo porti in C, non piu' di una funzione o due, di solito.
Che magari continua a prendere in input std::strings, e poi usa .c_str().
Non ci tengo a scrivere programmi in C nel 2013 :asd:

marco.r
27-08-2013, 11:23
Vero, ma nel caso di quel programma avevo anche un'altro vantaggio... i puntatori facevano riferimento a un blocco di testo letto da file che coprivano in modo molto "denso"...
Quindi dopo averlo convertito in "C-like" potevo passare in giro direttamente puntatori a posizioni del file originale, praticamente facendo un solo malloc in assoluto.
Con le stringhe questo proprio non lo puoi fare :D

Penso sia una legge generale... piu' integri verticalmente e vai a basso livello, piu' efficienza (algoritmica e in esecuzione) ottieni. Ma paghi tutto con tempo e incomprensibilita'.

Non e' questione di integrazione verticale; e' questione di utilizzare l'astrazione corretta. Nel tuo caso le string sono la soluzione sbagliata perche' a te non serviva una stringa a se' stante, ma una sottostringa che faccia riferimento ad uno slice di una stringa piu' ampia. Il fatto che fosse una classe C++ e' irrilevante, potevi fare lo stesso errore anche in C (copiando ogni volta le stringhe in un nuovo array per poterle terminare con uno '\0' in modo che fossero "stringhe C").



Rimane da vedere se a quel punto no conviene buttare tutto al secchio e rifarlo in C :asd:
Mah, per esperienza di solito no. Che poi usare puntatori non vuol dire "fare in C", vuol dire usare puntatori in C++ :D.

cdimauro
29-08-2013, 21:08
Volevo estendere il discorso, ritornando alla discussione originale :D , a Python e PyPy.
Come si relaziona quest'ultimo in termini di velocità rispetto a Java e rispetto a C++?
Mediamente inferiore, ma non so di quanto.
Inoltre, c'è qualche effettivo vantaggio nel non usare un compilatore JIT come fa Python? Se JIT da un effettivo vantaggio in termini di velocità, perchè non abbandonare il linguaggio puramente interpretato e passare al JIT?
Perché a volte quello che si guadagna in velocità si perde in consumo di memoria, che può anche essere molto elevato rispetto alla soluzione interpretata (anche se ciò non è sempre vero; ci sono casi in cui il consumo di memoria è molto più ridotto). Poi anche per il tempo di startup, che può essere superiore per la soluzione con JIT.