2009-04-18 38 views
0

我目前正在阅读Jon Skeet的深度C#文章,并且已经阅读了关于值和引用类型的内容。在参数中传递大量值类型的性能

这让我想到了使用值类型作为方法参数的成本,因为该值在传递时被复制。虽然在考虑整数时这个代价并不是很大,但如果这些值参数是经过无数次传递的字符串呢?

使用说一个StringBuilder类并传递它而不是字符串类型会有好处吗?

如果你认为字符串很长,比如1024个字符,并且在方法之间传递了几次,那么用一个StringBuilder进行对比,该StringBuilder具有相同的值,最终将引用的值传递为4或者每次8个字节,你可以获得相当的性能。

这个问题也可能突出显示我可能缺少的有关字符串类型的重要理解,请随时在需要的地方指出。

另外,这对垃圾收集有什么影响,在每个实例中的字符串?

编辑:显然我没有忘记一个有关字符串的信息,使问题无效。谢谢格罗弗。

回答

8

字符串不是一个值类型,它们只是不可变的对象。

传递一个字符串会导致与其他对象相同的成本:它的引用的大小,在Win32上是4个字节。

附加说明:值类型语义(通过值传递)可以由编译器以优化方式实现。我没有看过MS JIT是怎么做的,但它仍然只能发送一个指向它的指针,并要求目标在写入时进行拷贝。

这就是我们要做的Managed Operating System Alliance JIT/AOT编译器。