Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-04-2010, 14:31   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7046
[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 20:37.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2010, 20: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, 20:50   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7046
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 20:54.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2010, 23: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 : 17-04-2010 alle 23:46.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2010, 23:49   #5
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7046
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 : 17-04-2010 alle 23:55.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 01: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, 07: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, 07: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, 10: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, 13:19   #10
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7046
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 13:25.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 13:25   #11
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7046
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, 13: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 13:37.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 13:35   #13
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7046
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 13:38.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2010, 13: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, 13: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, 13: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, 13: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, 14:22   #18
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7046
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, 14: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, 14:44   #20
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7046
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 14:49.
Unrue è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Grazie a GLIMPSE-17775 il telescopio spa...
Samsung Galaxy A27 5G è ufficiale...
TCL aggiorna la sua gamma di monitor per...
Anche OPPO avrà uno smartphone co...
La Radeon RX 9070 XT appare su Steam e m...
L'America si ribella ai datacenter: bloc...
'Artificial General Engineer': l'IA di J...
Il drone NASA Dragonfly, che voler&agrav...
Stop immediato a Fable 5 e Mythos 5: il ...
"Prime Day Amazon il 23-26 giugno": sì e...
Oggi 2 super MacBook Pro M5 e M5 Pro, 24...
Tineco Floor One Station S9 Artist: il s...
Raggiunte nuove altitudine e velocit&agr...
Apple Watch Series 11 GPS a 339€ su Amaz...
Come un MacBook, ma con la RTX 5070: MSI...
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: 23:00.


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