【发布时间】:2014-05-01 21:33:23
【问题描述】:
在 C# 控制台应用程序中,我有一个循环遍历集合中的大约 8000 个项目,设置大约八个字符串等于项目的各种属性,然后使用这些字符串执行各种其他操作。为了使我的代码井井有条,我提前声明了所有字符串并将它们保留为空,直到读取一个项目并且循环将适当的字符串设置为适当的值。我的问题是,在循环外部和内部声明这些字符串之间会有明显的性能差异吗?我知道它会在技术上消耗一些额外的时钟周期,每次循环迭代时声明它们,并且在 8000 次迭代之后可能会开始加起来,但我不知道有多少或者它是否重要?这个应用程序已经花费了一个半小时来完成它的整个周期,所以几秒钟的差异是微不足道的,但如果我们说的是几分钟,那显然是一件坏事。
请记住,这主要是一个好奇的问题,我可以诚实地在任何地方声明这些变量而不会影响应用程序。我确信最佳实践表明它们应该始终处于循环之外,但我一直想知道它在这种低影响操作中真正产生了多大的影响。
【问题讨论】:
-
对其进行分析并查看。如果设置这两个选项并不难,然后运行它,看看你是否注意到差异
-
“我知道它会在技术上消耗一些额外的时钟周期,每次循环迭代时声明它们”——你怎么知道的? “我确信最佳实践表明它们应该始终在循环之外 [...]”——我很确定最好的做法是使它们的范围尽可能小,即,将它们声明为 inside 循环。
-
@delnan 你是对的,实际上是 编译器 的工作来执行将声明移出循环的优化。优化编译器有时可以并且确实会执行精确的优化,但我已经看到了它无法执行此操作的情况,并且自己执行此操作会对性能产生重大影响。但是当然optimization should only be done when necessary 然后只有在分析确定它会产生显着影响之后。
标签: c# string performance memory-management