使我的程序更加模块化会使它变慢
本文关键字:我的 程序 模块化 | 更新日期: 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%。这也说明,使用函数调用的最快运行仍然比没有函数调用的最慢运行慢。