|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
[C#] Prestazioni funzioni
Ciao, sto cercando di ottimizzare le prestazioni di un mio progetto ed ho un dubbio.
Ho una classe che svolge determinate operazioni ricorrenti nella mia applicazione, come per esempio caricare una DataTable in base ad una query: Codice:
public static DataTable CaricaDt(string query, DataTable dt) { try { Connection.Apri(); MySqlDataAdapter da = new MySqlDataAdapter(query, Connection.cnMySql); da.Fill(dt); Connection.Chiudi(); return dt; Il fatto che io invii come parametro una dataTable, la quale viene riempita e poi restituita, non equivale al copiare la datatable quando la invio come parametro e poi afarla nuovamente ricopiare quando scrivo: datagrid.DataSource=CaricaDt(query,table)? Se non sbaglio, non passando il riferimento della dataTable, io vado ogni volta a farla ricreare in ram o sbaglio?
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2775
|
Sbagli perché dt, anche se non è passato "per riferimento", è un riferimento ad un oggetto datatable, in pratica è un indirizzo. Quindi quello che passi e quello che viene restituito è solo un indirizzo.
Vedi qui: http://msdn.microsoft.com/it-it/libr...=vs.80%29.aspx |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
HA ragione wingman.
E infatti nel tuo esempio e' anche inutile restituire la DataTable E' sufficiente non restituire nulla (void), in quanto il chiamante sa gia' che verra' modificata la stessa datatable passata alla funzione.
__________________
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. |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
Quote:
Codice:
dataGrid.DataSource = Database.CaricaDt(query, table);
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
Due domande:
- Per utilizzarla come dici tu, il metodo che variazioni dovrebbe subire? Perché così vuole come parametro una datatable; - Ci sarebbero vantaggi prestazionali?
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Dal canto mio farei comunque in maniera differente e mi affiderei alle tecniche di binding. Ne hai mai avuto a che fare? |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
Quote:
![]()
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Codice:
Database.CaricaDt(query, table); dataGrid.DataSource = table;
__________________
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. |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
Quote:
Inviato dal mio GT-I9300 con Tapatalk 2
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
La funzione che hai scritto è lineare e non ha alcun punto critico in quanto essenzialmente è una serie di chiamate a librerie della .NET. Le criticità pertanto possono esserci piuttosto nel codice scritto in tali librerie (cosa che sinceramente dubito essendo strarevisionate). |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
Ok grazie per il chiarimento.
Quindi ricapitolando, se ho capito bene, ogni qualvolta chiamo un metodo che lavora su una DataTable (o un oggetto .NET in generale? ), anche se tale metodo è in un'altra classe è come se stessi lavorando all'interno della classe in cui mi trovo a livello prestazionale? Non vado a perdere assolutamente nulla?
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Quote:
Per tutto il resto sì, vengono passati solo riferimenti
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
Altra piccola domanda: quando devo fare 3 query in base ad un valore inserito dall'utente per ricavare il valore di 3 campi di quel determinato record, inizialmente eseguivo le tre query singolarmente con ExecuteScalar ed avevo un valore alla volta, quindi un totale di 3 query.
Adesso stavo attuando il metodo di query unica, limitare il risultato ad una riga e mettere questa riga in una DataTable in modo che abbia tutti e tre i valori in un unico oggetto. Di funzionare funziona ma mi chiedevo se sotto qualche punto di vista l'utilizzo di una DataTable per una sola riga potesse essere uno spreco e se fosse preferibile utilizzare altro o va bene così ![]()
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:58.