什么是截载时间?
在讲这个之前,先讲一下代码的行号以及源文件的路径怎么获取,因为截载时间涉及到这两个信息。 一般来说,通过源代码管理器(比如git、github)都可以很方便的得到源码的版本历史,以git为例,可以在命令行输入 git log --oneline -200,就可以看到提交记录的行号及路径了。
当然有的时候,我们可能仅仅需要某几次提交的记录,那么可以输入上面的命令,然后通过行号来查询一次具体的提交内容,具体做法是找到第一次出现要查看的那次提交的行号,然后在命令行输入 git show ,就可以看到那一次提交的详细信息了。 当然还有一些其他的方式,这里只是给出一种方便的方法。
现在来说明什么叫做截载时间,前面介绍了如何获取代码的行号以及源文件的路径,接下来就要看这些因素是如何影响运行时间的。 假设有一个项目包含了100个源文件,每个源文件中包含了100个函数,每个函数又被调用了100次,总共有50000个函数调用。那么,最坏的情况,也就是所有的函数都要重新执行一遍,这样时间复杂度就是 O(50000);然而这样的情况其实是很少出现的,一个原因是程序不会这么冗长,再一个是即便这么冗长了,大多数的操作都是重复的,不需要逐一行进,因此有很多可以优化的地方。
上面说了这么多,其实是想说明,对于一个大的编程任务,我们可以把其分解成很多小任务,然后分别实现,这样可以减少整体的执行时间。 比如说,对于上面的例子,可以把整个项目分成 N 块,每块包含同样的代码量,然后分别执行。这样的好处是,只要 N 很小,那么总的时间消耗就很小,而且随着线程数增加,效率也会大幅度提高。
不过这里也有一个问题,那就是如何确定要把项目分几块呢?一般情况下,我们划分的时候,是以功能为单位,尽可能把有相同功能的代码放在一块,这样的话,当一块代码执行时,其他块不需要执行,因为它们的功能并不包含在这部分代码中。 但这里还有一个问题,就是要判断哪些代码是相同的,哪些代码是不同的并不是那么的容易。不过,虽然很难准确的判定,但我们可以做一些近似的处理。
假设我们把整个项目分成了 N 块,且每块都有相同的开头和结尾(包括头文件和末尾的代码),那么,即便中间有一些代码不同,由于这些不同的代码块是被隔离开的,所以每次执行只会浪费一点时间,整体的影响并不大。这样,我们就大大减少了代码的执行时间。