【问题标题】:c# toString() performancec# toString() 性能
【发布时间】:2011-05-07 09:27:01
【问题描述】:

我很好奇 C# 中的 ToString() 方法。举个例子:

object height = 10;

string heightStr = height.ToString();

当我在height 上调用ToString() 时,我得到一个字符串类型。运行时是否为这个字符串分配内存?

【问题讨论】:

  • ToString() 适用于人类,性能不是问题,因为他们的阅读速度不快。无论如何应该是。

标签: c# .net tostring


【解决方案1】:

是的,运行时将为您创建或请求的任何字符串对象分配内存,包括从方法调用返回的对象。

但不,这绝对不是您需要担心的。它不会对您的应用程序的性能产生任何明显的影响,而且您永远不应该屈服于过早优化代码的诱惑。

Int32.ToString 方法非常快。它调用在 CLR 级别编写的本机代码,这不太可能成为任何应用程序的性能瓶颈。


实际上,这里真正的性能问题将是boxing,这是将值类型转换为类型object 并再次返回的过程。这是因为您将height 变量声明为object 类型,然后为其分配了一个整数值。

height 明确声明为int 类型是一个更好的主意,如下所示:

int height = 10;
string heightStr = height.ToString();

【讨论】:

  • 一组装箱/拆箱并不比分配字符串效率低。
  • @Matti:不,一组可能不是。我必须查看性能数据才能确定,但​​这在这里无关紧要。我试图做出的区别是拳击是值得普遍避免的东西。在编写 .NET 代码时,这被认为是一种“不好的做法”,这当然是每个人都应该注意的事情。字符串分配不是问题,也不是要避免的事情。重复装箱/拆箱操作更有可能导致应用出现性能问题。
  • 作为一个小提示:如果您在 doesn' 的值类型变量/表达式上调用虚拟方法(例如 ToString()),则会发生装箱 t 显式覆盖它。在int 的情况下,一个显式 int.ToString(),但并非总是如此。
  • Re“对于您创建或请求的任何字符串对象”当然还有实习的问题 - 在这里不适用,但“任何”是一个重要的声明
  • 我不同意开场白。在某些情况下,这将是一个性能问题。如果这在紧密循环中多次发生,分配的累积效应可能会导致昂贵的垃圾收集。在游戏中,垃圾收集非常明显。在像紧凑框架中的单代收集器中,您也会面临碎片化的风险,从而为收集器带来更多工作。
【解决方案2】:

是的。创建一个类的新实例(就像在本例中使用字符串类所做的那样)将为该实例分配内存。

【讨论】:

  • 我不太确定字符串不可变这一事实与这里有什么关系。他没有修改String 类的现有实例,而是将ToString 函数的结果分配给类型为string 的变量。这将创建该类的一个新实例,即使它不是不可变的。
  • @Cody 我提到它是为了强调所有字符串实例都分配了一个新的内存地址这一事实。你是对的,它的相关性并不高,但我认为它可能会带来一些额外的清晰度。无论如何,为了避免混淆,我已经删除了对不变性的提及。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多