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

本文关键字:我的 程序 模块化 | 更新日期: 2023-09-27 18:36:52

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

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

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

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

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

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

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

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

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

如果你真的想知道瓶颈在哪里,Microsoft花了一些时间让你变得容易。


虽然不是一个很大的样本,但请考虑以下 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;
}

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

   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%。这也说明,使用函数调用的最快运行仍然比没有函数调用的最慢运行慢。