我很想知道我是否可以创建StringBuilder
的优化版本(以便加速一点,,因为它目前是我的某个应用程序的瓶颈)。对我来说不幸的是,它似乎利用了我无法使用的“神奇”系统调用(或者看起来如此)。
在反编译System.Text.StringBuilder
的源代码后,我注意到它使用了以下内部(因此也是不可调用的)系统调用:
[SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
internal static string FastAllocateString(int length);
这个未记录的属性也被大量使用:
[ForceTokenStabilization]
我能够用FastAllocateString(n)
替换所有对String.Empty
的来电,并注释掉所有[ForceTokenStabilization]
属性。执行此操作后,从其他类复制粘贴一些方法,我实际上能够编译它。 (complete code)。
我真的不想做出这两个权衡,因为我认为他们是有原因的。
FastAllocateString
? ForceTokenStabilization
真正做了什么(可能还有另一种方法来实现它?)答案 0 :(得分:10)
你可以叫它:
var fastAllocate =
typeof (string).GetMethods(BindingFlags.NonPublic | BindingFlags.Static)
.First(x => x.Name == "FastAllocateString");
var newString = (string)fastAllocate.Invoke(null, new object[] {20});
Console.WriteLine(newString.Length); // 20
请注意,FastAllocateString
是string
..
Rotor SSCLI发行版在内部为运行代码的平台发出本机ASM,以分配缓冲区并返回地址。我只能假设正式的CLR大致相同。
根据this link,ForceTokenStabilization
适用于:
//===========================================================================================================
// [ForceTokenStabilization] - Using this CA forces ILCA.EXE to stabilize the attached type, method or field.
// We use this to identify private helper methods invoked by IL stubs.
//
// NOTE: Attaching this to a type is NOT equivalent to attaching it to all of its methods!
//===========================================================================================================