如何实现StringBuilder和/或调用String.FastAllocateString?

时间:2013-11-15 01:58:19

标签: c# .net stringbuilder cil

我很想知道我是否可以创建StringBuilder的优化版本(以便加速一点,,因为它目前是我的某个应用程序的瓶颈)。对我来说不幸的是,它似乎利用了我无法使用的“神奇”系统调用(或者看起来如此)。

在反编译System.Text.StringBuilder的源代码后,我注意到它使用了以下内部(因此也是不可调用的)系统调用:

[SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
internal static string FastAllocateString(int length);

这个未记录的属性也被大量使用:

[ForceTokenStabilization]

我能够用FastAllocateString(n)替换所有对String.Empty的来电,并注释掉所有[ForceTokenStabilization]属性。执行此操作后,从其他类复制粘贴一些方法,我实际上能够编译它。 (complete code)。

我真的不想做出这两个权衡,因为我认为他们是有原因的。

  • 任何人都知道一个秘密的忍者替代方式来致电FastAllocateString
  • 任何人都知道ForceTokenStabilization真正做了什么(可能还有另一种方法来实现它?)

1 个答案:

答案 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

请注意,FastAllocateStringstring ..

的成员

Rotor SSCLI发行版在内部为运行代码的平台发出本机ASM,以分配缓冲区并返回地址。我只能假设正式的CLR大致相同。

根据this linkForceTokenStabilization适用于:

//===========================================================================================================
// [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!
//===========================================================================================================