我正在重构我的应用程序以使其更快。我正在寻找这样做的技巧,并找到了这个声明:
“ForEach 可以简化 For 循环中的代码,但它是一个重对象并且比使用 For 编写的循环慢。”
这是真的吗?如果它在编写时是正确的,那么今天是否仍然正确,或者 foreach 本身是否已被重构以提高性能?
我对同一来源的提示有同样的问题:
“尽可能使用数组而不是集合。数组通常更有效,尤其是对于值类型。此外,尽可能将集合初始化为所需的大小。”
更新
我一直在寻找性能提示,因为我有一个需要几秒钟的数据库操作。
我发现“using”语句很浪费时间。
我通过反转 for 循环和“使用”完全解决了我的性能问题(当然,重构是必要的)。
比糖蜜慢的代码是:
for (int i = 1; i <= googlePlex; i++) {
. . .
using (OracleCommand ocmd = new OracleCommand(insert, oc)) {
. . .
InsertRecord();
. . .
比子弹还快的代码是:
using (OracleCommand ocmd = new OracleCommand(insert, oc)) {
for (int i = 1; i <= googlePlex; i++) {
. . .
InsertRecord();
. . .
最佳答案
简答:
难以阅读的代码最终会导致软件行为和性能不佳。
长答案:
早期的 .NET 中存在微优化建议文化。部分原因是一些 Microsoft 的内部工具(例如 FxCop)在公众中广受欢迎。部分原因是因为 C# 曾经并且一直渴望成为汇编、C 和 C++ 的继承者,因为它可以在性能关键型应用程序的几个 HitTest 门代码路径中不受阻碍地访问原始硬件性能。当然,这确实需要比典型应用程序更多的知识和纪律。框架代码和应用程序代码中性能相关决策的结果也大不相同。
当然,这对 C# 编码文化的净影响是积极的;但是停止使用 foreach
或 is
或 ""
只是为了保存一些你最近的抖动可能会出现的 CIL 指令是荒谬的如果需要,可以完全优化。
您的应用程序中可能有很多循环,并且可能至多其中一个可能是当前的性能瓶颈。以牺牲可读性为代价来“优化”非瓶颈的性能是非常糟糕的交易。
关于c# - foreach 和集合的使用速度慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10689140/