PSM1模块中函数调用的性能影响

时间:2018-01-09 19:33:28

标签: performance powershell module

我有一个在文本文件上执行查找/替换的函数,并且它已经运行了一段时间。直到我需要处理1200万行文件。 我的初始代码使用了Get-Content和Write-Content,而使用大量文件需要花费数小时来处理,更不用说将1200万行加载到RAM中的内存含义。 所以,我写了一个小测试脚本来比较这种方法与Stream Reader / Writer。而Streaming看起来似乎是一次巨大的性能提升,将处理时间降低到30秒。然后我在每一行添加了.Replace(),总处理时间只有一分钟。都好。然后我开始在我的真实代码中实现它,性能再次陷入困境。该代码是PS1,可以加载许多PSM1文件。执行查找替换的函数位于其中一个PSM1文件中,该代码调用另一个PSM1中的函数。测试脚本是一个小PS1中的所有东西。 鉴于我的测试脚本根本没有使用函数调用,我首先对其进行了测试,因此PS1中的一个函数在相同的PS1中从循环调用了1200万次。没有真正的性能影响。

所以,我的想法是,在一个PSM1中调用一个函数,然后在另一个PSM1中调用一个函数(1200万次)可能是个问题。所以我在与循环相同的PSM1中创建了一个虚函数(它只返回传递的字符串,好像不需要替换)。而且这个数字要慢一些。

我还没有对PS1中的所有内容进行测试,主要是因为这些函数需要三个不同的脚本,并且参数要求非常不同,因此使用模块实现它确实在逻辑上很有意义,并且改变它将是一个巨大的的任务。

那就是说,在调用模块中的函数时是否存在已知的性能损失?我的印象是,一旦模块被加载,它基本上就像它在一个PS1中一样,但也许不是? FWIW,我没有使用NameSpaces。我的所有函数都只在名词一侧有函数名前缀,以避免冲突。

我也无法非常轻松地发布最低限度的功能代码,因为它不会出现在单个文件中,并且不会显示该行为。如果对某人没有明显的答案,我想我的下一步是用一些模块来实现测试脚本,但这也不是苹果到苹果,因为我的真实模块相当大。

添加一个小上下文:当函数(在PSM1中)不调用函数并且只设置$writeLine = $originalLine时,总时间为15秒。 在进行实际查找和替换内联(不调用函数)时,如此$writeLine = $originalLine.Replace($replace, $with)总处理时间为16秒。 在同一PSM1中调用函数时,只返回原始字符串,总时间为17分钟。 但同样,当它在没有模块的PS1文件中时,调用函数的影响最小。因此,即使从同一PSM1中的函数调用PSM1中的函数,也会产生巨大的性能开销。

更多背景信息: 我将测试脚本中的replace函数移动到了一个Module中。没有明显的变化。所以我将主代码(包括循环)移动到该模块中的函数中,并从主脚本中调用它。再次,没有真正的变化。两人花了大约15秒。 所以,它不是模块中天生的东西。那就引出了一个问题,我可以在其他模块中做些什么来触发这种行为?这个模块有3000-10,000行代码,因此有很多内容。希望有人对模块的最佳实践有一些了解,以减轻这种影响。并且希望它不是"不要使用大模块"。 ;)

最终更新: 它似乎是模块有多大的函数。我删除了包含循环的模块中的所有其他函数,性能很好,17秒。所以,基本上就像PS5.0一样,模块的实现对于任何大的东西都是无用的。相当令人不安。我想知道如果单个文件中的所有函数以及具有大量函数的大文件的PowerShell性能都不好,那么同样如此吗?任何人都有这方面的经验吗?

0 个答案:

没有答案