Visual
Studio .Net in the Real World
For
all it's amazing features, the .Net framework
isn't going to provide al the tools that you need
to write your programs - and in particular, it's
not going to go too far when it comes to developing
multimedia applications. That is why, when looking
at this new piece of software, we must also look
at how well it interacts with other software,
libraries and 'real-world' situations.
DirectX
in the .Net languages
Particularly
within Visual Basic, DirectX opens the doors to
all forms of multimedia and is therefore extremely
important. Unfortunately, the results aren't good.
I had heard "on the grape-vine" already
that there were some compatability issues involved
in using the DirectX (for VB) type libraries in
.Net, and upon testing them myself I found these
stories to be true.
There
are two aspects to this problem, firstly (and
most importantly) the libraries themselves were
not designed with .Net in mind (as far as I know,
the .Net frameworks didn't exist when they wrote
the libraries, so not their fault really!) and
was custom designed for Visual Basic. Various
methods in the library which never caused any
problems with previous versions of VB are no longer
valid through the .Net system - in particular
the global D3DX functions dont exist. Secondly,
due to Microsoft replacing the COM standards (with
the new .Net frameworks etc..) you need to use
the "COM Interop" services to access
anything in the library - which adds a hefty speed
penalty to every call. This effectively nullifies
a lot of the reason for using DirectX to get high
performance multimedia.
When
I made an enquiry into the state of affairs (on
the MS newsgroups) one of the Microsoft team clarrified
that these problems had been noted, but there
was not going to be any patch/upgrade to fix things.
DirectX 9 will be using a .Net compatable managed
code library, which probably means it'll need
Visual Studio .Net to work, and should definitely
work properly! In the meantime, you can only try
using the functions that do work - but it's not
easy with a lot of core functions missing or just
not working. Direct3D and DirectPlay seem to be
the worst affected. Luckily, if you're using DirectX
through C++.Net you shouldn't have any problems
at all (as I mentioned earlier, Microsoft cant
really change the language).
Faster
Code?
Faster code is the holy-grail of almost every
multimedia/games programmer on the planet. Given
the complexity of the code/algorithms routinely
used in this field, performance is critical -
in a game, the difference between 30ms and 60ms
is the difference between playable and unplayable
(30ms = 35fps, 60ms = 15fps). Performance was
always going to be an interesting area - .Net
is generally aimed at web services, server side
applications and other similiar programs. These
programs would probably require a broadband internet
connection to operate properly, so whilst speed
is important (not many people like waiting!) it
is no-where near as important to the business
applications as it is to a multimedia application.
I
wrote 4 programs to test the speed, one in VB6,
one in VB.Net, one in VC++6 and one in VC++.Net.
Whilst each one was slightly different (due to
different languages!) they were identical in the
numbers, methods and functions; the idea being
to test each languages respective compiler. Before
you look at these results you need to bare in
mind that these aren't the defining benchmark
results for EVERYTHING - there would be no way
(in this review at least) to judge the speed of
everything. The raw results are in the following
table:
Test
Name
|
VB6
|
VB.Net
|
VC++6
|
VC++.Net
|
Square
Root
|
281.8882ns
|
630.0195ns
|
15.2994ns
|
27.6278ns
|
Sin
|
265.1841ns
|
665.9771ns
|
13.0751ns
|
25.4974ns
|
ArcCos
|
883.1846ns
|
1041.6985ns
|
13.4347ns
|
24.9710ns
|
ArcTan
|
326.3383ns
|
927.4561ns
|
14.5007ns
|
26.7352ns
|
System
Used: Athlon 700mhz, 288mb SysRAM, 15.3gb HDD.
(Tested again on 500mhz AMD K6-2, results followed
similiar trend).
Test Conditions: Clean boot of WindowsXP for
each version of the program.
Straight
away you can see that the C++ times are much faster
than the VB times, but this was to be expected
(we all know C++ is faster!), however there is
some pretty damning evidence straight away about
.Net's performance. I have to say I was genuinely
shocked when these results came out (and I have
run them at least 5 times each on seperate occasions
to check it is "constant"), even if
.Net was going to be faster/slower I expected
it to be a pretty close fight, not almost 1/2
the speed of previous (5yr old) compilers.
The
times above are for a single call of that particular
maths function (in nanoseconds), to get this result
a loop with 1 million iterations was used (to
find the total time) and then divided by 1 million
to get an average time for each individual call.
Whilst this will include some time used to execute
the loop code, all 4 programs used this same method
so any timing error will be in ALL times, thus
wont affect any comparisons. Each test of 1 million
iterations was called (back to back) 50 times
and then averaged again - to make sure that the
times weren't affected by any loading/initialisation
slow-down. I am pretty certain that the method
for getting these timing values is accurate, but
if you wish to dispute them feel free, but you
have to email
me with some code that I can try for myself
:)
Despite
the poor results above, there are some odd exceptions
to the rules - with more "complete"
tests using pre-written code of varying types
I would get faster results (particularly apparent
when doing memory manipulation/array access),
but they were limited to a maximum of 10% faster,
however, I also got several runs of these tests
showing that the previous compiler was faster...
odd!
Having
got these results I instantly went about trying
to work out why they are so poor. Whilst it is
unlikely to be just one reason, there is a very
obvious thing to note - the compiler technology
used. VB.Net no longer supports "native"
Win32 EXE's (like VB6 did), only VC++.Net still
compiled to proper EXE's. Instead, the compiler
actually compiles down to an intermediary assembly
like language - MSIL (Microsoft Intermediate Language).
This code is then compiled as the program runs
- using a JIT (Just In Time) compiler. As a result
of this, programs written with .Net often take
considerably longer to load up. To counter this,
I ran each test 50 times back to back (as mentioned
above), to make sure the JIT compilation wasn't
interfering - the compiler will keep compiled
functions in memory if they are going to be called
regularly - thus if the function is called 50
times it is safe to assume that it wont need to
re-compile it every single time. This lack of
full compilation may well account for the rather
poor times registered for VB.Net, however it shouldn't
be a reason for the poor VC++.Net times. During
my research into the matter, one individual suggested
that the C++.Net compiler compiles to MSIL (like
the other languages), but then does the runtime
compilation part at compile time, thus you're
left with a Win32 executable. I cannot find official
confirmation of this, but if it is true then it
could explain the poor results.
Portable
Executables
As
briefly mentioned above, .Net programs are compiled
to an intermediary assembly language. This means
the .exe files generated with .Net compilers aren't
actually the same (file format/data etc...) as
traditional .exe's from previous compilers. There
is one huge advantage to this - platform independance.
If the code is not specialised to a particular
instruction set / operating system (Win32/x86
etc...) but instead, uses a JIT compiler while
running, all that needs to be done to get the
program running on ANY computer is to write a
compatable JIT compiler. This means that we could
very soon see Linux, BeOS, MacOS .Net frameworks
- which means that you can distribute any .Net
application to any of these systems. This removes
some really big blockages in the distribution
of software - companies/teams at the moment spend
a long time developing software for 3-4 different
platforms, whereas now they can target only one
- the .Net framework. It also has forward-thinking
in mind, the move away from Win32 (to Win64/Win128?)
and x86 processors means that software will have
to be changed to make use of this - if it is compiled
to MSIL/.Net standards then all that needs to
change is the JIT/runtime compilation module.
However,
with all these great things it does leave for
one slight problem. Hacking. A little program
"Ildasm.exe" installed with Visual Studio
.Net allows you to decompile any .Net executable
to its MSIL source code. This isn't new - you
can decompile standard Win32 EXE's to the assembly/binary
data, however, ildasm.exe reveals a lot of information
with it's decompiler - and where is it getting
this information? it must be stored in the EXE!
Whilst I'm no amazing assembly-level programmer,
I can easily see how this can be used against
the softwares creators. If you look at this decompiled
sample, you'll see what I mean - it would
not be too hard to work out any file-accessing
code (such as that used for copy-protection/piracy)
and "crack" it. Particularly given this
powerful little tool - you can read the MSIL code,
potentially change it, then recompile it again!
(not that it needs full compilation though).
To
read the last page click here
or click here
to return to "Learning to Talk the Talk".
Introduction:
Introducing the software, and the aims of this
review.
Getting
Started With Visual Studio .Net:
The installer, version, prices etc...
The new
IDE: New things in
the Integrated Development Environment, and is
it an improvement?
Learning
to Talk the Talk:
Learning the new language (C#) and the changes
to Visual Basic
Visual Studio .Net in the Real World:
Performance and real world capabilities
Conclusion:
Summing everything up in a neat way
|