Is it possible to use 'inline' MSIL (Intermediate Language) similar to how
you can use inline assembly in C/C++? If not, how can I include some code
written in IL in my project? Thanks,
Chris LaJoie
Nov 15 '05
19 4492
Chris, .method private hidebysig static int32 Add(int32 op1,int32 op2) { .locals init (int32 retval) IL_0000: ldarg.0 IL_0001: ldarg.1 IL_0002: add IL_0003: stloc.0 IL_0004: br.s IL_0006
IL_0006: ldloc.0 IL_0007: ret }
Surely you're looking at a non-optimized debug build? Compile with /o
and look again, the C# compiler can definitely do better than this.
Mattias
--
Mattias Sjögren [MVP] mattias @ mvps.org http://www.msjogren.net/dotnet/
Please reply only to the newsgroup.
BTW it doesn't compile at runtime everytime.
there is different policy on when a given method or assembly or method
should be compiled (you could choose but I don't remember how) however each
method is compiled only once and cached.
"Mattias Sjögren" <ma************ ********@mvps.o rg> wrote in message
news:uu******** ******@TK2MSFTN GP10.phx.gbl... Chris,
.method private hidebysig static int32 Add(int32 op1,int32 op2) { .locals init (int32 retval) IL_0000: ldarg.0 IL_0001: ldarg.1 IL_0002: add IL_0003: stloc.0 IL_0004: br.s IL_0006
IL_0006: ldloc.0 IL_0007: ret }
Surely you're looking at a non-optimized debug build? Compile with /o and look again, the C# compiler can definitely do better than this. Mattias
-- Mattias Sjögren [MVP] mattias @ mvps.org http://www.msjogren.net/dotnet/ Please reply only to the newsgroup.
Lloyd Dupont <net.galador@ld > wrote: BTW it doesn't compile at runtime everytime. there is different policy on when a given method or assembly or method should be compiled (you could choose but I don't remember how) however each method is compiled only once and cached.
I don't believe that's true. I believe that unless you specifically
ngen the assembly, the JITted code won't be stored on disk anywhere.
(It's cached within the lifetime of the app, of course, but that's a
different matter.)
In a future version it *could* cache the code, of course, but I don't
believe it does at the moment.
--
Jon Skeet - <sk***@pobox.co m> http://www.pobox.com/~skeet/
If replying to the group, please do not mail me too
Chris LaJoie <ch***@etriptra der.com> wrote:
<snip> that's a ratio of 8 lines vs. my 4 lines. Which one will be faster?
Just for fun, I *did* actually benchmark this - and to my surprise,
your version *was* faster (over 1000000000 iterations, it took about
3.5s as opposed to 6.3 for the original). I'm very surprised that the
JITter couldn't figure the two out to be identical.
However, I got almost exactly the same benefit by moving the hand-
optimized code into a separate DLL. It means it needs to be public,
which isn't terribly pleasant, but it's unlikely that there will be
many routines which actually *do* benefit significantly from this kind
of approach (and only those which actually *are* bottlenecks in the
app) so this shouldn't be needed very often.
--
Jon Skeet - <sk***@pobox.co m> http://www.pobox.com/~skeet/
If replying to the group, please do not mail me too
Jon,
See inline ****
Willy.
"Jon Skeet" <sk***@pobox.co m> wrote in message news:MP******** *************** *@news.microsof t.com... Lloyd Dupont <net.galador@ld > wrote: BTW it doesn't compile at runtime everytime. there is different policy on when a given method or assembly or method should be compiled (you could choose but I don't remember how) however each method is compiled only once and cached.
*** I guess OP meant, cached in memory which is correct.
I don't believe that's true. I believe that unless you specifically ngen the assembly, the JITted code won't be stored on disk anywhere. (It's cached within the lifetime of the app, of course, but that's a different matter.)
In a future version it *could* cache the code, of course, but I don't believe it does at the moment.
-- Jon Skeet - <sk***@pobox.co m> http://www.pobox.com/~skeet/ If replying to the group, please do not mail me too
Interresting test Jon. A few days ago I benchmarked our program's functions
written in C# (compiled with /o) against the ones written in IL and got
similar results. My IL code was nearly twice as fast. I would post the
code for you to see and test, but I don't want to give out company code and
risk losing my job. ;)
I believe that inline IL would be invaluable in situations where speed is
essential, and the C# compiler isn't compiling it in the most efficient way.
I plan on writing up a formal request/suggestion regarding inline IL in .NET
languages to Microsoft. I value your input and I'd like to ask your opinion
on this. Do you believe this would be a valuable addition, or am I wasting
my time?
Thanks,
Chris LaJoie
"Jon Skeet" <sk***@pobox.co m> wrote in message
news:MP******** *************** *@news.microsof t.com... Chris LaJoie <ch***@etriptra der.com> wrote:
<snip>
that's a ratio of 8 lines vs. my 4 lines. Which one will be faster?
Just for fun, I *did* actually benchmark this - and to my surprise, your version *was* faster (over 1000000000 iterations, it took about 3.5s as opposed to 6.3 for the original). I'm very surprised that the JITter couldn't figure the two out to be identical.
However, I got almost exactly the same benefit by moving the hand- optimized code into a separate DLL. It means it needs to be public, which isn't terribly pleasant, but it's unlikely that there will be many routines which actually *do* benefit significantly from this kind of approach (and only those which actually *are* bottlenecks in the app) so this shouldn't be needed very often.
-- Jon Skeet - <sk***@pobox.co m> http://www.pobox.com/~skeet/ If replying to the group, please do not mail me too
Chris LaJoie writes: Interresting test Jon. A few days ago I benchmarked our program's functions written in C# (compiled with /o) against the ones written in IL and got similar results.
I'm new, but it certainly seems that compiler/jitter aren't very good. The
example given earlier was particularly striking. Is there an expectation
that they'll get better, soon? Are there competing products that do a
better job?
An inline feature would be nice, but it would be even better to have a
competent compilation in the first place.
Michael Roper
Michael,
The code you saw earlier was not optimized code. I'm not entirely sure what
the code would look like if it was optimized, but I can tell you that for
the most part, the C# (or VB) compiler does an awesome job.
You have probably heard that assembly is faster than C/C++, but do you know
why? It's because the human mind is much more inventive and can think about
problems in many different ways to come up with the best/fastest solution.
A compiler has limitations. Someone please jump in if I'm wrong, but this
is how I look at it.
The only time I would ever write in a 'low-level' language like IL is if
speed was very important (which isn't very often). It's only these rare
situations that I believe IL would be invaluable.
Chris LaJoie
"Michael Roper" <mi******@encra ft.com> wrote in message
news:bj******** ****@ID-160215.news.uni-berlin.de... Chris LaJoie writes: Interresting test Jon. A few days ago I benchmarked our program's functions written in C# (compiled with /o) against the ones written in IL and got similar results. I'm new, but it certainly seems that compiler/jitter aren't very good.
The example given earlier was particularly striking. Is there an expectation that they'll get better, soon? Are there competing products that do a better job?
An inline feature would be nice, but it would be even better to have a competent compilation in the first place.
Michael Roper
Chris LaJoie <ch***@etriptra der.com> wrote: Interresting test Jon. A few days ago I benchmarked our program's functions written in C# (compiled with /o) against the ones written in IL and got similar results. My IL code was nearly twice as fast. I would post the code for you to see and test, but I don't want to give out company code and risk losing my job. ;)
Understandable :)
I believe that inline IL would be invaluable in situations where speed is essential, and the C# compiler isn't compiling it in the most efficient way. I plan on writing up a formal request/suggestion regarding inline IL in .NET languages to Microsoft. I value your input and I'd like to ask your opinion on this. Do you believe this would be a valuable addition, or am I wasting my time?
I would personally rather MS spent the time on improving the
compiler/jitter to come up with the same kind of code to start with -
that would give a bigger bang for the buck, I believe. I'd rather not
*have* to resort to IL for the kind of method you showed before.
On the other hand, they've already got the assembler itself - maybe it
wouldn't be a bad idea (especially as there are things you can do with
IL that you can't do in C#, as mentioned before). I think I'd probably
suggest making it pretty limited though: rather than inline IL within a
method, keep it to a per-method basis. That would mean it could stick
with the current IL without anyone having to worry about which
parameter/local variable corresponded with which IL stack variable,
etc.
--
Jon Skeet - <sk***@pobox.co m> http://www.pobox.com/~skeet
If replying to the group, please do not mail me too
"Chris LaJoie" <ch***@etriptra der.com> wrote in message
news:%2******** ********@TK2MSF TNGP10.phx.gbl. .. Michael, The code you saw earlier was not optimized code. I'm not entirely sure what the code would look like if it was optimized,
..method private hidebysig static int32 Add(int32 op1,
int32 op2) cil managed
{
// Code size 4 (0x4)
.maxstack 2
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: add
IL_0003: ret
} // end of method Test::Add
Looks sort of familiar to me ;)
<SNIP>
/Magnus Lidbom This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Raymond Lewallen |
last post by:
Is there some article out there that helps in reading MSIL? I've been
looking but can't find anything, and I'm probably just looking in the wrong
spots for the wrong keywords. I understand mov, call, jmp, ptr, dword and
some of the other obvious pieces. I'm looking to understand some of the
less obvious pieces of MSIL so I can better understand how my code is being
constructed in release mode.
TIA,
Raymond Lewallen
|
by: Raymond Lewallen |
last post by:
Microsoft,
Can I make a request for a newsgroup specific to MSIL? I have taken great
interest in MSIL and have done a lot of reading into MSIL, and written,
compiled and tested with success a few il programs. I'm sure this is a
topic of interest to many people, as it is at the heart of .Net.
If any of you readers/posters are also interested in an intermediate
language specific newsgroup, please respond.
|
by: TrickyDicky |
last post by:
Hi all,
I'm just starting to experiment with MSIL but am getting confused
about c# and MSIL integration.
I understand that c# is compiled into MSIL before it is JIT'ed and
then executed. I also understand that it is possible for me to
generate my own MSIL using the System.Reflection.Emit namespace.
However, is it possible for my c# code to call into my
pre-MSIL-compiled code, passing and returning values?
|
by: Pawel |
last post by:
Ary you know tools to convert MSIL code (Assembly) to Win32 (not Just In
Time)?
|
by: ThomasR |
last post by:
I was wondering on the breadth of optimization with .NET JIT compiler.
Let's presume I have an assembly of static classes - mostly helper
functions. Some of these functions may be very small (small enough
that the optimizing compiler would inline them).
If I have another assembly that references this helper libary
assembly, could .NET's JIT compiler inline compile the usage of these
small helper functions?
| |
by: Teis Draiby |
last post by:
I am about to move my C++ application to C#. Parts of my previous
application consisted of inline SSE2 assembly code optimized for the P4
processor. What options do I have to integrate that part into my C#
application?
There are no such things as intrinsics support in C#, right?
Thank you very much!
regards, Teis
|
by: James dean |
last post by:
My understanding is the MSIL runs on the CLR and the CLR is basically
the JIT compiler plus Garbage collection. This part "MSIL runs on the
CLR" is a bit vague to me can anyone give me a clearer definition and
explain how these 3 work together.
*** Sent via Developersdex http://www.developersdex.com ***
|
by: NigelW |
last post by:
Clarification needed please.
If I compile a C++ program with the /clr option inpsection
of the resulting assembly with ILDASM shows MSIL even for
methods in classes for which I have not specified garbage
collection with __gc.
Am I correct in thinking there is really two kinds of
managed (i.e. MSIL) code from C++, that which uses garbage
collection and that which does not?
|
by: John Doe |
last post by:
Hi all,
I have a lot of confusion about what this runtime environment is.
When I write an application with unmanaged code and unmanaged data, can
I compile it to the MSIL, or it will compile mandatorily to the x86
instruction set?
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
| |
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |