Era un po' che volevo fare qualche prova a riguardo ma, da buon programmatore, sono essenzialmente pigro.
Partendo dalla demo dell'articolo di Brian Noyes in cui fà una analisi delle varie tipologie di comunicazione utilizzabili da uno smarclient, sono andato a vedere come si relazionano queste due modalità di portarsi a spasso i dati (prescindendo da ragionamenti da quale sia meglio in termini di SO ;-)).
Essenzialmente un'applicazione winform che chiama un webservice che interroga l'adventrure works (Il tutto fatto con la RC di vs2005 e la CTP di settembre di SQL).
I dati vengono presi con una query 'semplice' ovvero
SELECT SalesOrderID, UnitPrice, CarrierTrackingNumber, ModifiedDate
FROM Sales.SalesOrderDetail
WHERE (SalesOrderID < 44000)
estraendo circa 300 record (un numero di record verosimile per quello che solitamente mi serve).
Questi dati vengono poi messi da un oggetto di accesso ai dati in un array di 'entity object' in un caso
e in un dataset tipizzato nell'altro.
Dal webservice vengono esposti i due metodi corrispondenti, che oltre a ritornare l'oggetto ritornano anche il tempo di esecuzione (ticks).
Nel caso del dataset il metodo è:
HiResTimer è un timer un po' più preciso del DateTime.now.ticks usato da Noyes (comunque non sposta di molto il discorso sigh!).
Lo smart client chiama questi due ws e fà qualche ulteriore statistica sui tempi.
Il risultato è che, ovviamente, gli entity object sono più performanti.
Per questi abbiamo il risultato seguente
Array Ticks: Call=44,421 milliseconds 87% (Tick=159010)
service=4,2731 milliseconds 8% (Tick=15296)
Serialize=40,148 milliseconds 78% (Tick=143714)
databind=6,4647 milliseconds 12% (Tick=23141)
total=50,886 milliseconds 100% (Tick=182151)
per i dataset
Dataset Ticks: Call=122,01 milliseconds 78% (Tick=436775)
service=14,126 milliseconds 9% (Tick=50568)
Serialize=107,89 milliseconds 69% (Tick=386207)
databind=34,048 milliseconds 21% (Tick=121878)
total=156,06 milliseconds 100% (Tick=558653)
Ovvero un tempo di mezzo decimo per gli EO contro un decimo e mezzo per dataset ovvero un fattore 3.
Aumentando il numero di records (5000) le differenze si assottigliano arrivando ad un fattore 2
Array Ticks: Call=236,04 milliseconds 95% (Tick=844919)
service=40,865 milliseconds 16% (Tick=146280)
Serialize=195,17 milliseconds 78% (Tick=698639)
databind=11,527 milliseconds 4% (Tick=41263)
total=247,56 milliseconds 100% (Tick=886182)
per i dataset
Dataset Ticks: Call=412,00 milliseconds 71% (Tick=1474794)
service=46,953 milliseconds 8% (Tick=168073)
Serialize=365,05 milliseconds 63% (Tick=1306721)
databind=164,91 milliseconds 28% (Tick=590316)
total=576,91 milliseconds 100% (Tick=2065110)