12

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

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

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

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

[ForceTokenStabilization]

我能够FastAllocateString(n)用 just替换所有调用String.Empty并注释掉所有[ForceTokenStabilization]属性。在这样做之后,并从其他类中复制粘贴一些方法,我实际上能够让它编译。(完整代码)。

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

  • 任何人都知道一个秘密的忍者替代方式打电话FastAllocateString
  • 任何人都知道ForceTokenStabilization真正的作用(以及可能实现它的另一种方法?)
4

1 回答 1

12

你可以这样称呼它:

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 大致相同。

根据此链接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!
//===========================================================================================================
于 2013-11-15T02:23:29.447 回答