Re: Can you write code directly in CIL ???
- From: "Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: Tue, 27 Dec 2005 00:52:59 -0500
Peter,
I highly recommend that you read up on how Garbage Collection works
exactly.
--
- Nicholas Paldino [.NET/C# MVP]
- mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx
"Peter Olcott" <olcott@xxxxxxx> wrote in message
news:Hy4sf.37932$QW2.22826@xxxxxxxxxxxxx
>
> "Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx> wrote
> in message news:%23YB$FaqCGHA.3820@xxxxxxxxxxxxxxxxxxxxxxx
>> Peter,
>>
>> You are missing the point completely. If you implement your code as
>> managed code, even in IL, you can't stop a GC no matter what. Your
>> thread is going to be pre-empted (in most situations, except if you have
>> the GC running on a separate thread) and it WILL stop and it WILL affect
>> your performance when it happens.
>
> I don't care if a GC occurs during the execution of my code. It can't
> occur because of my code because my code knows how much memory it needs in
> advance and always needs all of this memory the whole time that it is
> executing. If some other process interrupts my code, it won't hurt it. My
> code just can't take more than 1/10 second to execute, since it needs to
> execute every second this will limit its use to 10% of the CPU time.
> Ultimately I want to limit my thread's required execution to no more than
> 10% of the CPU time. This means that this one function can't take more
> than 1/10 second to execute.
>
>>
>> Just because your code knows how much memory it needs doesn't mean
>> that you can pre-empt a GC. If it happens, it's going to happen, and
>> there is nothing you can do about it. Your 100-line function isn't going
>> to be able to stop it, and the CLR isn't going to care what your function
>> is doing.
>>
>> You can't just pretend its not going to happen. It does, and it will,
>> and you can't stop it. This isn't a choice you have if you are running
>> managed code, whether you do it in IL or not.
>>
>> This is what it means to have ^managed^ code. The CLR is going to
>> provide a good number of services, but you are going to have to pay for
>> them, and should be aware of how they impact your code.
>>
>> This is why I recommended that you use interop with your unmanaged
>> code. You will have your performance requirements fufilled, and not have
>> to worry about doing something that will ultimately be self-defeating.
>
> I don't think that unmanaged code would make a good .NET component. The
> current design requires the function to be implemented as a .NET
> component.
>
>>
>> --
>> - Nicholas Paldino [.NET/C# MVP]
>> - mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx
>>
>> "Peter Olcott" <olcott@xxxxxxx> wrote in message
>> news:GV3sf.37927$QW2.2410@xxxxxxxxxxxxx
>>>
>>> "Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx> wrote
>>> in message news:uvvaatpCGHA.4004@xxxxxxxxxxxxxxxxxxxxxxx
>>>> Peter,
>>>>
>>>> You don't understand a fundamental concept to .NET and CIL. Yes,
>>>> there are compilers that will perform optimization of IL to a certain
>>>> degree.
>>>>
>>>> However, when the managed code is run, the CLR will take the CIL and
>>>> then compile it into native code. At this point in time, it is free to
>>>> optimize, or not optimize, or mangle your code in any way you want when
>>>> making the transition from CIL to native code.
>>>>
>>>> When you are dealing with assembly language in general, you have
>>>> complete control of what is going on, memory allocation, deallocation,
>>>> execution, etc, etc. With the CLR, this is taken out of your hands to
>>>> a degree.
>>>
>>> I don't care about these things they are not effecting my performance.
>>> What is effecting my performance are things such as the compiler failing
>>> to inline my functions code, and unnecessary overhead in the translation
>>> of a switch statement. My function will be always executed several
>>> million times every second. It must run concurrently with other
>>> applications.
>>>
>>>>
>>>> For example, have you considered, what happens when a Garbage
>>>> Collection (GC) occurs while your function is running? If it is in
>>>> complete managed code, then there is nothing that you can do about it,
>>>> and your function will resume running when the GC is complete.
>>>> Depending on what is happening on the machine at the time, combined
>>>> with what your program is doing, etc, etc, it is very feasible that
>>>> your code will take more than 1/10th of a second.
>>> My code knows exactly how much memory it needs at load time. It needs
>>> all of this memory the whole time that it executes. It would make no
>>> sense to have any garbage collection of my code's memory in this case. I
>>> want my code to be implemented as a .ET component.
>>>
>>>>
>>>> Just because it looks like assembly language, don't assume that CIL
>>>> is assembly language. There are some very different things going on
>>>> under the hood.
>>>>
>>>> --
>>>> - Nicholas Paldino [.NET/C# MVP]
>>>> - mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx
>>>>
>>>> "Peter Olcott" <olcott@xxxxxxx> wrote in message
>>>> news:xj2sf.37906$QW2.34052@xxxxxxxxxxxxx
>>>>>I want to be able to stick with purely managed code, if possible. I
>>>>>just need this 100 line function to run as fast as if it was hand
>>>>>tweaked assembly language. I have examined CIL, for the most part it is
>>>>>essentially assembly language. From what I understand any optimizations
>>>>>take place before the CIL is generated. When I designed this system (in
>>>>>1998) I had hand tweaked assembly language in mind for this crucial
>>>>>function all along.
>>>>>
>>>>> "Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx>
>>>>> wrote in message news:%23RjK3$oCGHA.2040@xxxxxxxxxxxxxxxxxxxxxxx
>>>>>> Peter,
>>>>>>
>>>>>> Not at all. When the CLR gets a hold of the JIT, it is free to
>>>>>> perform any optimizations it deems necessary, and that might not
>>>>>> necessarily be in line with what you are expecting.
>>>>>>
>>>>>> My recommendation would be to use Managed C++ to create a wrapper
>>>>>> to your unmanaged code which uses It Just Works (IJW, seriously).
>>>>>> You should get a managed interface, and the best possible performance
>>>>>> (for this specific situation, not all situations) between managed an
>>>>>> unmanaged code.
>>>>>>
>>>>>>
>>>>>> --
>>>>>> - Nicholas Paldino [.NET/C# MVP]
>>>>>> - mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx
>>>>>>
>>>>>> "Peter Olcott" <olcott@xxxxxxx> wrote in message
>>>>>> news:_51sf.37898$QW2.37853@xxxxxxxxxxxxx
>>>>>>>I need the best possible execution speed. I have found that there is
>>>>>>>a large difference in the quality of the code generated by the
>>>>>>>various compilers. I have 16,000 hours of development time in my
>>>>>>>current project. There is a 100 line function that must take no
>>>>>>>longer than 1/10 second to execute. I can just barely achieve this
>>>>>>>with MSVC++ 6.0. MSVC++ 7.0 has had some of its optimizations
>>>>>>>disabled. I eventually will need to port this to C# .NET. This is a
>>>>>>>case where hand tweaked assembly language would be appropriate. I
>>>>>>>figured that hand tweaked CIL would be the .NET equivalent of hand
>>>>>>>tweaked assembly language.
>>>>>>>
>>>>>>> "Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx>
>>>>>>> wrote in message news:OCvd7unCGHA.2644@xxxxxxxxxxxxxxxxxxxxxxx
>>>>>>>> Peter,
>>>>>>>>
>>>>>>>> You can write it, but you would have to create a module with IL,
>>>>>>>> and then compile that into your assembly (or just write the whole
>>>>>>>> assembly).
>>>>>>>>
>>>>>>>> Also, what optimizations do you think you can make? Ultimately,
>>>>>>>> you suffer from the fact that Windows is not a real-time OS, and
>>>>>>>> nothing you can do will change that. On top of that, the JIT is
>>>>>>>> what's going to optimize your code again after you try to, so you
>>>>>>>> might actually end up hurting yourself more than helping yourself.
>>>>>>>>
>>>>>>>> If you post the code you are trying to optimize, we can try and
>>>>>>>> tell you where you might make some improvements, but dipping down
>>>>>>>> to the IL level is most likely not going to help you much.
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> - Nicholas Paldino [.NET/C# MVP]
>>>>>>>> - mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx
>>>>>>>>
>>>>>>>>
>>>>>>>> "Peter Olcott" <olcott@xxxxxxx> wrote in message
>>>>>>>> news:7t%rf.37887$QW2.9998@xxxxxxxxxxxxx
>>>>>>>>> Cab you write code directly in the Common Intermediate language? I
>>>>>>>>> need to optimize a critical real-time function.
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>
.
- Follow-Ups:
- Re: Can you write code directly in CIL ???
- From: Peter Olcott
- Re: Can you write code directly in CIL ???
- References:
- Can you write code directly in CIL ???
- From: Peter Olcott
- Re: Can you write code directly in CIL ???
- From: Nicholas Paldino [.NET/C# MVP]
- Re: Can you write code directly in CIL ???
- From: Peter Olcott
- Re: Can you write code directly in CIL ???
- From: Nicholas Paldino [.NET/C# MVP]
- Re: Can you write code directly in CIL ???
- From: Peter Olcott
- Re: Can you write code directly in CIL ???
- From: Nicholas Paldino [.NET/C# MVP]
- Re: Can you write code directly in CIL ???
- From: Peter Olcott
- Re: Can you write code directly in CIL ???
- From: Nicholas Paldino [.NET/C# MVP]
- Re: Can you write code directly in CIL ???
- From: Peter Olcott
- Can you write code directly in CIL ???
- Prev by Date: Re: Can you write code directly in CIL ???
- Next by Date: Re: Can you write code directly in CIL ???
- Previous by thread: Re: Can you write code directly in CIL ???
- Next by thread: Re: Can you write code directly in CIL ???
- Index(es):
Relevant Pages
|