Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-04-2010, 15:31   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7523
[C, C++] Allocazione dinamica e statica e velocità del codice

Ciao a tutti,

è un pò che mi pongo la seguente domanda. In generale, se alloco una matrice staticamente o dinamicamente, ed in seguito su tale matrice compio svariate operazioni magari in un ciclo, è possibile stabilire quale delle due allocazioni convenga fare in termini di performances?

Mi spiego meglio, da un punto di vista teorico, sapere in anticipo le dimensioni di una matrice potrebbe aiutare il compilatore ad ottimizzare meglio gli accessi. Così non è con una matrice dinamica.

Che ne pensate?

Ultima modifica di Unrue : 17-04-2010 alle 21:37.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2010, 21:36   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Da buon profano quale sono penso che un'allocazione statica sia più performante per una serie di motivi (tra cui il fatto di dover semplicemente fare una sottrazione sullo stack invece che un'allocazione magari costosa sull'heap, e una più stretta applicazione del principio di località del codice).

Certo però che le differenze diventano davvero trascurabili IMHO se le allocazioni sono poche. Non so se c'è veramente una convenienza...

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2010, 21:50   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7523
No aspetta, non intendevo performances nel senso di tempo speso per allocare. Ma tempo speso negli accessi alla matrice.;

Piccolo esempio che non ha alcun senso, ma tanto per capire:

Quote:
matrice[i][j] = matrice[i-1][j]*matrice[i][j] + 2^matrice[i][j-3]
Sarebbe più performante se matrice fosse nello stack o nello heap?

Nei vari codici che mi sono capitati tra le mani non ho mai rilevato differenze significative, quindi sembrerebbe che il compilatore non sfrutti le informazioni sulla dimensioni della matrice note a priori, e ciò mi pare molto strano.

Ultima modifica di Unrue : 17-04-2010 alle 21:54.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 00:41   #4
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Sarebbe più performante se matrice fosse nello stack o nello heap?
Ciao, ho trovato stimolante la tua domanda ...
pensandoci un attimo direi che è uguale perchè sono sempre indirizzi e la velocità della memoria è sempre uguale, in più a parità di operazioni fatte, che sia nello heap o nello stack, la CPU fa le medesime cose, carica scarica registri ecc....

ma da buon san Tommaso ho voluto provare.... chissà mai scopro qualcosa di nuovo... ma niente....

ecco infatti il test che ho fatto...

Ho preso in considerazione una matrice di 50x50 elementi come mi hai suggerito.
Il test è per windows.

(tieni in considerazione che sono stato sotto il secondo per il tempo di elaborazione, per non dovermi calcorare il riporto dei tempi stampati se ci mettevo più di un secondo)

Codice:
// This is a simple test ;)

#include <iostream>
#include <iomanip>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <windows.h>

using namespace std;

const short N = 50;

void calc(double[][N]);

double matrix_on_heap[N][N];

SYSTEMTIME tv;
SYSTEMTIME tv_later;

int main(void)
{
    int j = 10;
    double matrix_on_stack[N][N];

    cout << "Stack allocation:" << endl;
    while(j--) {
    GetSystemTime(&tv);
    calc(matrix_on_stack);
    GetSystemTime(&tv_later);
    cout << 10-j << " Time spent: " << tv_later.wMilliseconds-tv.wMilliseconds << " MilliSeconds" << endl;
    }
    cout << endl;
    j = 10;
    cout << "Heap allocation:" << endl;
    while(j--) {
    GetSystemTime(&tv);
    calc(matrix_on_heap);
    GetSystemTime(&tv_later);
    cout << 10-j << " Time spent: " << tv_later.wMilliseconds-tv.wMilliseconds << " MilliSeconds" << endl;
    }

    return(0);
}

void calc(double matrix[][N])
{
    srand(time(NULL));
    int x,y;
    // Matrix randomization
    for(x=0;x<N;x++)
    {
        for(y=0;y<N;y++)
        {
            matrix[x][y] = rand();
        }
    }
    srand(time(NULL)+1);
    for(x=0;x<N;x++)
    {
        for(y=0;y<N;y++)
        {
            matrix[x][y] = sqrt(pow(matrix[x][y],2)); // is a useless thing :)
        }
    }
}

Output:

Codice:
Stack allocation:
1 Time spent: 0 MilliSeconds
2 Time spent: 2 MilliSeconds
3 Time spent: 0 MilliSeconds
4 Time spent: 3 MilliSeconds
5 Time spent: 2 MilliSeconds
6 Time spent: 0 MilliSeconds
7 Time spent: 0 MilliSeconds
8 Time spent: 2 MilliSeconds
9 Time spent: 0 MilliSeconds
10 Time spent: 3 MilliSeconds

Heap allocation:
1 Time spent: 0 MilliSeconds
2 Time spent: 3 MilliSeconds
3 Time spent: 0 MilliSeconds
4 Time spent: 2 MilliSeconds
5 Time spent: 0 MilliSeconds
6 Time spent: 0 MilliSeconds
7 Time spent: 3 MilliSeconds
8 Time spent: 0 MilliSeconds
9 Time spent: 0 MilliSeconds
10 Time spent: 0 MilliSeconds

Process returned 0 (0x0)   execution time : 0.037 s
Sinceramente, può essere che il risultato del test non aiuti poi molto, come vedi a volte è 0 a volte è 3 millisecondi... ma d'altronde più dei millisecondi non possiamo andare, o meglio non saprei come fare....

In conclusione credo che l'unica controindicazione dell'allocazione nello stack piuttosto che nello heap è che lo stack è più limitato per quanto riguarda la dimensione della memoria allocabile.

Ultima modifica di Teo@Unix : 18-04-2010 alle 00:46.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 00:49   #5
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7523
Mm,

forse è necessario aumentare di più la dimensione della matrice, che so, 1000 x 1000. Proverei anche ad aumentare il tempo di esecuzione facendogli fare più conti, in modo da farlo "macinare" per circa un minuto. Domani faccio una prova.

Ultima modifica di Unrue : 18-04-2010 alle 00:55.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 02:53   #6
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
In teoria se non fai accessi troppo casuali non hai di che misurare, perché la velocità di accesso è sempre la stessa. Sia stack che heap risiedono nella RAM, quindi il tempo di accesso è sostanzialmente identico. L'importante è rispettare il principio di località, per non svuotare troppo spesso la cache della CPU.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 08:06   #7
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
forse è necessario aumentare di più la dimensione della matrice, che so, 1000 x 1000.
questo non si può fare, con 1000x1000 esaurisci lo stack disponibile ed hai SIGSEGV.

Come detto, forse è l'unica controindicazione di usare lo stack piuttosto che lo heap.
Inoltre se la dimensione della nostra ipotetica matrice diventa variabile bè allora a maggior ragione meglio usare lo heap, altrimenti hai un programma che, alla vista dell'utilizzatore, dopo una certa dimensione non funziona.

Quel che si può provare a fare è aumentare il tempo di calcolo, così prendiamo nota dei secondi...
più tardi aggiorno il test..... ma il risultato non credo proprio che cambierà
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 08:49   #8
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Uno dei problemi della mancata differenza prestazionale e' che il C non e' "conscio" della dimensione fissa della matrice allocata staticamente.
Mentre per quella dinamica e' plausibile che non la tenga in considerazione per diversi motivi, per quella statica e' meno intuitivo.

Le due situazioni sono quindi analoghe.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 11:21   #9
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Al massimo per matrici particolarmente piccole il compilatore fa l'unrolling dei loop se la dimensione è statica...
ma credo che i processori moderni lo facciano già da se con il branch prediction eccetera.

Magari serviva prima, ad oggi è difficile che otterrai risultati coerenti...
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 14:19   #10
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7523
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
questo non si può fare, con 1000x1000 esaurisci lo stack disponibile ed hai SIGSEGV.
Perché no? Basta aumentare la dimensione dello stack

Allora, ho fatto diverse prove. Inanzi tutto ho impostato lo stack a 20 mb con ulimit -s.

I codici sono compilati con il compilatore Intel 11. Questi sono i sorgenti:

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[]){

double matrice[1000][1000];

int seed;

seed = 10000;
srand(seed);


for( int i=0; i< 1000; i++)
    for( int j=0; j< 1000; j++)
        {
        matrice[i][j] =  (double)rand();
        }


for ( int iter=0; iter< 10000; iter++)
 {
  for( int i=1; i< 1000; i++)
      for( int j=1; j< 1000; j++)
         {
          matrice[i-1][j] = matrice[i][j-1]*pow(matrice[i][j], 3) + sin(matrice[i-1][j])/cos(matrice[i][j-1]) +  (double)rand();
         }

 }

  return 0;

}
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[]){

double** matrice;

int seed, i, j;

seed = 10000;
srand(seed);

int dim_1 = atoi(argv[1]);
int dim_2 = atoi(argv[2]);

matrice = (double**)malloc(dim_1*sizeof(double*));

for ( i=0; i< dim_1; i++)
     matrice[i] = (double*)malloc(dim_2*sizeof(double));


for(  i=0; i< dim_1; i++)
    for(  j=0; j< dim_2; j++)
        {
        matrice[i][j] =  (double)rand();
        }


for ( int iter=0; iter< 10000; iter++)
 {
  for(  i=1; i< dim_1; i++)
      for(  j=1; j< dim_2; j++)
         {
          matrice[i-1][j] = matrice[i][j-1]*pow(matrice[i][j], 3) + sin(matrice[i-1][j])/cos(matrice[i][j-1]) +  (double)rand();
         }

 }

for ( i=0; i< dim_1; i++)
        free(matrice[i]);

  free(matrice);

  return 0;

}
Ho compilato con -O2 e -O3, facendo tre prove per caso. Questi sono i risultati:

Quote:
***intel -02 static***

real 4m6.477s
user 4m6.479s
sys 0m0.006s

real 4m9.876s
user 4m9.883s
sys 0m0.002s

real 4m6.608s
user 4m6.615s
sys 0m0.003s

***intel -03 static***

real 4m14.665s
user 4m14.659s
sys 0m0.006s


real 4m12.640s
user 4m12.644s
sys 0m0.005s

real 4m14.278s
user 4m14.281s
sys 0m0.006s


***intel -02 dynamic***

real 3m57.196s
user 3m57.193s
sys 0m0.007s

real 3m52.174s
user 3m52.167s
sys 0m0.005s

real 3m56.752s
user 3m56.752s
sys 0m0.006s

***intel -03 dynamic***

real 3m56.296s
user 3m56.301s
sys 0m0.004s

real 3m49.180s
user 3m49.179s
sys 0m0.004s

real 3m56.351s
user 3m56.354s
sys 0m0.005s
Ricapitolando, non solo con le matrici statiche non si guadagna, ma addirittura sono leggermente più lente di quelle dinamiche! Non capisco, forse dipende anche dal compilatore e dai flags di ottimizzazione. Appena ho tempo faccio altre prove con gcc.

Ultima modifica di Unrue : 18-04-2010 alle 14:25.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 14:25   #11
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7523
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Uno dei problemi della mancata differenza prestazionale e' che il C non e' "conscio" della dimensione fissa della matrice allocata staticamente.
Mm, perché ?
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 14:33   #12
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Una matrice scritta cosi' e' comunque un vettore di puntatori a vettore

double matrice[1000][1000];
E l'accesso ad ogni singola cella prevede 2 operazioni di memoria.

diverso sarebbe scrivere la seguente
double matrice[1000*1000];
dove siamo sicuri che la zona di memoria allocata sia contigua indipendentemente dal compilatore.

Una situazione come questa permetterebbe di risolvere l'accesso alla singola cella con una singola operazione di memoria.
Una volta compilato pero' il C non e' piu' in grado di "ricordare" (non gliel'abbiamo mai detto in realta') che c'e' una relazione bidimensionale nella zona di memoria.
Possiamo scrivere noi la modalita' di accesso veloce

#define GetCell(mat,X,Y) mat[Y*1000+X]

In questo modo potremmo sfruttare la staticita' delle dimensioni.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 18-04-2010 alle 14:37.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 14:35   #13
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7523
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Una matrice scritta cosi' e' sempre un vettore di puntatori a vettore

double matrice[1000][1000];
E l'accesso ad ogni singola cella prevede 2 operazioni di memoria.

diverso sarebbe scrivere la seguente
double matrice[1000*1000];
dove siamo sicuri che la zona di memoria allocata sia contigua indipendentemente dal compilatore.

Una situazione come questa permetterebbe di risolvere l'accesso alla singola cella con una singola operazione di memoria.
Una volta compilato pero' il C non e' piu' in grado di "ricordare" (non gliel'abbiamo mai detto in realta') che c'e' una relazione bidimensionale nella zona di memoria.
Possiamo scrivere noi la modalita' di accesso veloce

#define GetCell(mat,X,Y) mat[Y*1000+X]

In questo modo potremmo sfruttare la staticita' delle dimensioni.
Ok, quindi suggerisci di linearizzare la matrice in un vettore, ed in effetti per avere migliori performances si fa sempre così. Ma questo si può fare anche con la matrice allocata dinamicamente, quindi si ritorna al punto di partenza.

Ultima modifica di Unrue : 18-04-2010 alle 14:38.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 14:37   #14
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Una matrice scritta cosi' e' sempre un vettore di puntatori a vettore

double matrice[1000][1000];


Non mi risulta.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 14:38   #15
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
In effetti c'era da aspettarsela una maggiore lentezza delle matrici statiche...

se ipotizziamo che i progettisti Intel abbiano seguito la massima "optimize the common case" è possibile che lo stack sia ottimizzato per trasferimenti di piccoli dati molto frequenti (es mem->registri) mentre invece l'heap è ottimizzato tramite cache per il caricamento di grosse moli di dati, che è il suo uso tipico.
Poi, il resto è segreto industriale
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 14:42   #16
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
No ho sbagliato.
Questo e' il vettore di vettori
double mat[][100];
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 14:45   #17
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Perché no? Basta aumentare la dimensione dello stack
a bè ok.

cmq per i risultati, può essere in effetti il compilatore io ho allungato i tempi per le elaborazioni e la matrice allocata nell'heap è un pelo più lenta....

può benissimo essere il compilatore, ho usato codeblocks su Win7, quindi tutta un'altra storia.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 15:22   #18
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7523
Questi sono i risultati con gcc 4.3:

Quote:
***gcc -O2 static***

real 7m21.909s
user 7m21.886s
sys 0m0.009s

real 7m38.066s
user 7m38.069s
sys 0m0.005s

***gcc -O2 dynamic***

real 7m40.072s
user 7m40.072s
sys 0m0.010s

real 7m40.459s
user 7m40.471s
sys 0m0.005s

***gcc -O3 static***

real 7m22.046s
user 7m22.031s
sys 0m0.006s

real 7m22.086s
user 7m22.059s
sys 0m0.003s


***gcc -O3 dynamic***

real 7m34.964s
user 7m34.947s
sys 0m0.018s

real 7m40.501s
user 7m40.516s
sys 0m0.003s
Inanzi tutto si nota che Intel straccia gcc ( ma questo me lo aspettavo, compilatore Intel su processore Intel non c'è storia). Ma la cosa curiosa è che la situazione si inverte: gcc pare essere più performante anche se di poco con l'allocazione statica..
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 15:35   #19
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
quindi possiamo dire che il tutto è molto dipendente dall'ambiente di compilazione?

Ma io non credo he vi sia una differenza per dinamica o statica per quanto riguarda le performance di lettura/scrittura a priori.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 15:44   #20
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7523
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
quindi possiamo dire che il tutto è molto dipendente dall'ambiente di compilazione?
A quanto pare si. Ho sentito dire che su AIX e compilatore xlc ( di IBM ) l'allocazione statica è più performante di un 30%. (Farò delle prove). Per fare un'analisi più approfondita andrebbe analizzato l'assembly generato, ma visto le differenze minime non ne vale proprio la pena

Ultima modifica di Unrue : 18-04-2010 alle 15:49.
Unrue è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
Alphabet perde 500 miliardi di dollari i...
Reddit cambia strategia dopo il calo del...
Calcolo quantistico, Intel annuncia l'ac...
DirectX Raytracing si aggiorna: pi&ugrav...
Honda lancerà nuovamente il proto...
La prima missione Amazon Leo con il razz...
Invia il tuo nome su Titano, la luna di ...
Starship: Ship 42 e Super Heavy Booster ...
Chrome, meno tab switching con la nuova ...
L'IA agentica spopola fra le aziende, ma...
ASUS UGen300 arriva in Italia a 299 euro...
Iliad aggiorna la gamma di offerte per I...
Stop ai social per i minori, perché Brux...
Google Chrome integra Gemini in Enhanced...
Meta lancia Waddle World e Style Sketch,...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:02.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v