- A Step Toward Realism
- Overview
- New Architecture Code Examples
- The Usual Type of Client-Side Code
- A Couple of Tweaks that Help Performance
- Collapsed Objects
- Statuses in One Single Byte
- Object Vector
- NonSerialized()
- Using "Dumb" Collections
- Another Struggle with Guids
- Oops, Maintainability Must Be Lost!
- And a Few Tweaks Not Applied Yet
- A New Test Application
- Results of the Throughput Tests
- Conclusion
Results of the Throughput Tests
I re-executed all tests with the GUI, but this time with a setup different from that used in the previous articles. I used only one single machine for everything, so "cross machines" actually means "cross AppDomains" instead. The test results are as before, but what is really important is that you run tests on your own. With real stuff instead. Results from simple tests (such as those following) give only a hint about what you can expect. Nothing more.
Okay, here goes... As usual, all throughput values are recalculated with the values for DataReader as the base. The higher the values, the better. The values within parenthesis are from the tests executed in Parts 14.
Table 1Read One Row
|
One User in AppDomain |
One User, Cross Machines |
DataReader |
1 |
1 |
Untyped DataSet |
0.6 (0.6) |
1.5 (1.4) |
Typed DataSet |
0.5 (0.4) |
1 (1) |
Wrapped DataSet |
0.6 (0.5) |
1.5 (1.3) |
Hashtable |
1 (0.9) |
3.7 (3.5) |
Custom Classes |
1 (1) |
4.1 (4) |
New Architecture |
1 |
3.8 |
Table 2Read Many Rows
|
One User in AppDomain |
One User, Cross Machines |
DataReader |
1 |
1 |
Untyped DataSet |
0.7 (0.5) |
9.1 (6.9) |
Typed DataSet |
0.5 (0.5) |
8 (6) |
Wrapped DataSet |
0.6 (0.5) |
8.9 (6.6) |
Hashtable |
0.9 (0.8) |
24.4 (17) |
Custom Classes |
1 (1) |
22.3 (15.9) |
New Architecture |
0.9 |
20 |
Table 3Read One Master Row and Many Detail Rows
|
One User in AppDomain |
One User, Cross Machines |
DataReader |
1 |
1 |
Untyped DataSet |
0.6 (0.5) |
8.2 (6.1) |
Typed DataSet |
0.5 (0.4) |
6.6 (5.1) |
Wrapped DataSet |
0.6 (0.5) |
7.9 (5.8) |
Hashtable |
0.9 (0.8) |
24.4 (16.2) |
Custom Classes |
1 (0.9) |
23.4 (16) |
New Architecture |
0.9 |
20.8 |
NOTE
Something happened to one of the machines I used when running the tests for Parts 14 six months ago. It works, but it is soooo slow. So I would have had to switch that machine in the test setup. If I did so, something had changed (together with a lot of small things, of course, such as new versions of this and that). Therefore, I thought it was interesting to show the results from a completely different test environment instead.
To summarize the test results: It's pretty obvious that the New Architecture has performance characteristics that are so far pretty close to the simplified Custom Classes tests. That is very good news. I'm satisfied with that for the moment.
Also worth mentioning is that all tests except the DataReader gain from the setup used here (one single machine instead of several machines that cooperate). It's especially obvious regarding cross machines (or cross AppDomains). My conclusion about why we get this result is that marshalling data is less expensive cross AppDomains relative cross machines, than several small calls (which is the case when the DataReader is used) cross AppDomains relative cross machines.