C# 使我的程序更模块化会使它变慢

C# 使我的程序更模块化会使它变慢,c#,C#,我编写了一个run-once程序,从一个表中读取数据,并将读取的数据迁移到其他几个表中(使用LINQ)。这是一个Main()方法,它提取数据,在需要时进行转换,转换一些字段,等等,并将数据插入适当的表中。基本上,只是将数据从一种格式迁移到另一种格式。程序运行大约需要5分钟,但它满足了我的需要 在查看程序时,我想我应该将巨大的Main()方法分解成更小的块。基本上,我只是重构了代码的各个部分,并将它们提取到方法中 该程序仍然执行它应该执行的任务,即迁移数据,但它现在需要两倍的时间,如果不是更长的话

我编写了一个run-once程序,从一个表中读取数据,并将读取的数据迁移到其他几个表中(使用LINQ)。这是一个Main()方法,它提取数据,在需要时进行转换,转换一些字段,等等,并将数据插入适当的表中。基本上,只是将数据从一种格式迁移到另一种格式。程序运行大约需要5分钟,但它满足了我的需要

在查看程序时,我想我应该将巨大的Main()方法分解成更小的块。基本上,我只是重构了代码的各个部分,并将它们提取到方法中

该程序仍然执行它应该执行的任务,即迁移数据,但它现在需要两倍的时间,如果不是更长的话


所以,我的问题是:方法调用是否会减慢处理速度?除了放在自己的方法中之外,代码本身没有任何变化。

是的,函数调用通常会有成本,但成本通常不会很高,除非您的代码被重构到每个函数只有一行,或者您调用了数十亿次:-)

你必须问自己的问题是:收益大于成本吗

对代码进行模块化几乎肯定会使其更易于维护,除非它是某种米老鼠Hello World类型的程序

你必须问的另一个问题是,如果它只运行一次,为什么还要费心去改进它?如果五分钟是可以接受的,那么你花在改进上的努力对我来说似乎是一笔沉没成本。如果它将被大量使用,或者被许多其他人使用,那是一回事。但是,如果你一个月只运行一次,为什么还要麻烦呢

如果你真的想知道瓶颈在哪里,微软已经花了一些时间


虽然不是一个巨大的样本,但是考虑下面的C程序(因为这是我的专长):

那么,除了我是一个差劲的统计学家之外,我们还能从中看出什么呢?:-)


从总数来看,似乎没有函数调用的要快6%左右。它还告诉我们,使用函数调用的最快运行速度仍然比不使用函数调用的最慢运行速度慢。

是的,函数调用通常会有成本,但成本通常不会很高,除非您的代码被重构到每个函数只有一行,或者您要调用它们数十亿次:-)

你必须问自己的问题是:收益大于成本吗

对代码进行模块化几乎肯定会使其更易于维护,除非它是某种米老鼠Hello World类型的程序

你必须问的另一个问题是,如果它只运行一次,为什么还要费心去改进它?如果五分钟是可以接受的,那么你花在改进上的努力对我来说似乎是一笔沉没成本。如果它将被大量使用,或者被许多其他人使用,那是一回事。但是,如果你一个月只运行一次,为什么还要麻烦呢

如果你真的想知道瓶颈在哪里,微软已经花了一些时间


虽然不是一个巨大的样本,但是考虑下面的C程序(因为这是我的专长):

那么,除了我是一个差劲的统计学家之外,我们还能从中看出什么呢?:-)


从总数来看,似乎没有函数调用的要快6%左右。它还告诉我们,使用函数调用的最快运行速度仍然比不使用函数调用的最慢运行速度慢。

您是否执行过任何实际的基准测试?这可能是程序之外的东西。性能的第一条规则是“我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源”,佩尔克努斯说。第二条规则是,只有对实际程序的实际测量才与实际程序的性能特征有很大关系,所以请测量所有内容!另一个想法。。。你提到了数据。如何在方法之间存储/传递数据?我不确定您的结构是什么,但可能是因为必须在方法之间复制大型集合而造成了开销?然后还有GC需要担心,这取决于您处理的“大数据”的数量。如果它涉及大量数据转换,是否可以将其移到数据所在的位置,例如存储过程中的转换?重新排列本身不太可能导致运行时增加3倍。更有可能的是,您无意中在Linq(实体框架)级别将某种低效引入了代码中。尝试在上添加SQL探查器。我怀疑您是在延迟加载,或者引入了
IEnumerable
/
IQueryable
的多次迭代,从而导致倒带/多次查询。如果是前者,请使用
.Include
以快速加载。如果是后者,在迭代查询之前,请使用
.ToList()
将查询具体化。您是否执行过任何实际的基准测试?这可能是程序之外的东西。性能的第一条规则是“我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源”,佩尔克努斯说。第二条规则是,只有对实际程序的实际测量才与实际程序的性能特征有很大关系,所以请测量所有内容!另一个想法。。。你提到了数据。如何在方法之间存储/传递数据?我不确定您的结构是什么,但可能是因为必须在方法之间复制大型集合而造成了开销?然后还有GC需要担心,这取决于您处理的“大数据”的数量。如果它涉及大量数据转换,是否可以将其移到数据所在的位置,例如存储过程中的转换?重新排列本身不太可能导致运行时增加3倍。更有可能的是,您无意中介绍了
#include <stdio.h>

void xyzzy(int argc, char *argv[]) {}
int main (void) {
    int x = argc;
    for (int i = 0; i < 1000; i++) {
        for (int j = 0; j < 1000000; j++) {
            x = x + 1;
            //xyzzy();
        }
    }
    printf ("%d\n", x);
    return 0;
}
   with  without
-------  -------
  2.452    2.264
  2.451    2.358
  2.468    2.342
  2.390    2.233
  2.374    2.249
-------  -------
 12.135   11.446 total
  2.468    2.358 max
  2.374    2.233 min