Benchmark Linq2SQL, Subsonic2, Subsonic3 – Qualche altra idea per renderli più veloci?

Sto lavorando con Subsonic 2 da oltre 3 anni …

Dopo che Linq appare e quindi Subsonic 3, comincio a pensare di passare ai nuovi futures Linq connessi a sql.

Devo dire che inizio a muovermi e porto il mio subsonico 2 con SubSonic 3, e molto presto scopro che la velocità era così bassa che non ci credevo – e avvia tutti quei test.

Quindi provo Linq2Sql e vedo anche un ritardo – confrontalo con Subsonic 2.

La mia domanda qui è, in particolare per linq2sql, e l’imminente versione dotnet 4, che altro posso fare per velocizzarlo? Che altro sulle impostazioni di linq2sql, o classi, non su questo codice che ho usato per i miei messaggi

Metto qui il progetto che faccio i test, anche le schermate dei risultati.

Come faccio i test – e l’accuratezza delle mie misure.

Io uso solo per la mia domanda Google Chrome, perché è difficile per me mostrare qui un sacco di altre misure che ho fatto con programmi più complessi. Questo è il più semplice, misuro solo i dati letti. Come posso provarlo. Faccio un Thread.Sleep semplice (10 secondi) e vedo se vedo 10 secondi su Google Chrome Measure, e sì lo vedo.

http://sofit.miximages.com/performance/GoogleChromeFastSpeedMesure.gif

qui ci sono più test con questo Sleep thead per vedere cosa effettivamente Chrome dà.

10 secondi di ritardo
Ritardo di 100 ms
Zero ritardo

C’è solo un piccolo 15ms che va in disordine, è così piccolo confrontarlo con il resto dei miei test che non mi interessa.

Quindi quello che misuro

Misuro solo i dati letti tramite ciascun metodo: non ho contato i dati o il ritardo del database, o qualsiasi lettura del disco o qualcosa del genere. Più avanti sull’immagine con il risultato mostro che non esiste alcuna attività del disco sulle misure
Guarda questa immagine per vedere cosa realmente misuro e se questo è corretto

Perché ho scelto questo tipo di test

È semplice, è reale, ed è vicino al mio vero problema che ho trovato il ritardo di Subonic 3 nel programma reale con dati reali.

Ora lascia testare il dals

Inizia da vedere questa immagine Ho 4-5 chiamate su ogni metodo, uno dopo l’altro.

I risultati sono Per un ciclo di 100 volte, chiedere 5 righe, una non esiste, approssimativamente ..

Adonet semplice: 81ms
SubSonic 2: 210ms
linq2sql: 1.70sec
linq2sql usando CompiledQuery.Compile: 239ms
Subsonic 3: 15.00sec (wow – extreme slow)

Il progetto http://www.planethost.gr/DalSpeedTests.rar

Qualcuno può confermare questo benchmark o fare qualche ottimizzazione per aiutarmi?

Altri test

Qualcuno pubblica qui questo link http://ormbattle.net/ (e poi rimuovilo – non so perché) In questa pagina puoi trovare dei test avanzati davvero utili per tutti, ad eccezione di Subonic 2 e di Subonic 3 che ho qui!

Ottimizzazione

Quello che veramente chiedo qui è se qualcuno può ora qualche trucco su come ottimizzare i DAL, non cambiando il codice di test, ma cambiando il codice e le impostazioni su ogni dal. Per esempio…

Ottimizzazione di Linq2SQL

Comincio a cercare come ottimizzare Linq2sql e ho trovato questo articolo , e forse esiste ancora.

Finalmente eseguo i trucchi da quella pagina, e ottimizzo il codice usandoli tutti. La velocità era vicina a 1,50 sec da 1,70 …. grande miglioramento, ma ancora lento.

Poi ho trovato un modo diverso – lo stesso articolo di idea , e wow! la velocità è esplosa. Usando questo trucco con CompiledQuery.Compile, il tempo da 1.5sec ora è 239ms. Ecco il codice per il precompilato …

Func<DataClassesDataContext, int, IQueryable> compiledQuery = CompiledQuery.Compile((DataClassesDataContext meta, int IdToFind) => (from myData in meta.Products where myData.ProductID.Equals(IdToFind) select myData)); StringBuilder Test = new StringBuilder(); int[] MiaSeira = { 5, 6, 10, 100, 7 }; using (DataClassesDataContext context = new DataClassesDataContext()) { context.ObjectTrackingEnabled = false; for (int i = 0; i < 100; i++) { foreach (int EnaID in MiaSeira) { var oFindThat2P = compiledQuery(context, EnaID); foreach (Product One in oFindThat2P) { Test.Append("
"); Test.Append(One.ProductName); } } } }

Ottimizzazione di SubSonic 3 e problemi

Faccio molti profiling delle prestazioni e inizio a cambiare uno dopo l’altro e la velocità è migliore ma ancora troppo lenta. Li invio sul gruppo subsonico ma ignorano il problema, dicono che tutto è veloce …

Ecco alcune acquisizioni dei miei profili e punti di ritardo all’interno del codice sorgente subsonico

Ho finito per fare in modo che subsonic3 faccia più call sulla struttura del database piuttosto che sui dati stessi. È necessario riconsiderare il modo in cui si richiedono i dati e seguire l’idea subsonic2 se ciò è ansible.

Prova a fare precompilare a 3 subsoniche come ho fatto in linq2Sql ma fallisco per il momento …

Ottimizzazione di SubSonic 2

Dopo aver scoperto che Subonic 3 è estremamente lento, avvio i miei controlli su Subson 2 – che non ho mai fatto prima credendo che sia veloce. (e questo è)

Quindi è venuto fuori con alcuni punti che possono essere più veloci. Per esempio ci sono molti loop come questo che in realtà sono lenti a causa della manipolazione delle stringhe e si confrontano all’interno del ciclo. Devo dirti che questo codice ha chiamato milioni di volte! per un periodo di pochi minuti! di dati che chiedono dal programma.

Su piccole quantità di tavoli e piccoli campi forse questo non è un grande pensiero per alcune persone,

ma su una grande quantità di tavoli, il ritardo è ancora di più. Quindi decido e ottimizzo il subsonico 2 da solo, sostituendo la stringa comparata, con il numero a confronto! Semplice. Lo faccio quasi su ogni punto che il profiler dice che è lento. Cambio anche tutti i piccoli punti che possono essere anche un po ‘più veloci e disabilita alcuni pensieri non usati.

I risultati, 5% più veloci sul database NorthWind, quasi il 20% più veloce sul mio database con 250 tabelle. Ciò conta con 500ms in meno in 10 secondi di processo su northwind, 100ms più veloce sul mio database in 500ms di tempo di elaborazione. Non ho acquisizioni da mostrarti per questo perché li ho creati con codice diverso, tempo diverso e li ho rintracciati sulla carta.

Comunque questa è la mia storia e la mia domanda su tutto questo, che altro sai per renderli ancora più veloci …

Per queste misure ho usato Subsonic 2.2 ottimizzato da me, Subsonic 3.0.0.3 un po ‘ottimizzato da me, e Dot.Net 3.5