使我的程序更加模块化使它变得更慢

时间:2015-01-08 05:15:24

标签: c#

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

在查看该程序时,我认为我将庞大的Main()方法分解为更小的块。基本上,我只是重构了代码区域并将它们提取到方法中。

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

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

1 个答案:

答案 0 :(得分:4)

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

您必须问自己的问题是:收益是否超过成本?

模块化代码几乎肯定会使维护变得更容易,除非它是一些Mickey-Mouse Hello-World类型的程序。

你要问的其他问题是,如果它只运行一次,你为什么还要努力改进呢?如果五分钟是可以接受的,那么你花在改进上的努力对我来说似乎是沉重的代价。如果它将被大量使用,或者被许多其他人使用,那就是一件事。但是,如果你每个月只运行一次(例如),为什么要这么麻烦呢?

如果你真的想知道瓶颈在哪里,微软花了一些时间making it easy for you


虽然不是一个巨大的样本,但请考虑以下C程序(因为那是我的专业领域):

#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;
}

编译时(没有任何优化,因为我不希望编译器再次猜测我,并使用技巧来减少编译器在运行代码之前编织任何魔法的机会),我使用和不使用函数调用得到的数字(每个使用sys+user命令使用time次的五次单独运行):

   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

那么我们可以从中得知,除了我是一个糟糕的统计学家这个事实? : - )

看来,基于总数,没有函数调用的那个快约6%。它还告诉我,使用函数调用的最快运行速度仍然比没有函数调用的最慢运行慢。