当前位置: 首页 > 网络应用技术

绩效分析不一定需要使用剖面,复杂性分析也可以

时间:2023-03-08 23:05:35 网络应用技术

  如果您提到绩效分析,您如何看待?

  可以用于时间 - 耗费分析和内存职业。您可以使用Chrome Devtools的profiler,包括性能和内存,以获取时间 - 耗费和内存占用数据,并且还可以使用火焰图表进行视觉分析。

  例如,性能,您可以看到每个功能的时间消耗。通过简单的加法和减法方法,您可以计算哪个函数更多的时间耗尽,然后进行优化。

  此外,您可以检查内存以显示堆内存的更改。您可以知道增加了哪个功能,然后优化。

  当然,您还可以分别分析内存的时间表,记录一段时间的内存占用,然后查看此时内存中的对象,这比知道大小更准确。

  简而言之,我们可以看到调试工具的镀膜器的内存和时间消耗,然后与特定功能相关联,然后开始优化。

  但是,这些只能用代码计数,并且与机器和不同的输入数据密切相关。

  如果更改机器,则数据是另一种方法。这是测试时如何用各种机器对其进行测试。

  如果您不需要执行代码,则可以估算特定的时间和内存职业。有什么想法吗?

  这就是复杂性分析技术所做的。

  在本文中,我们将学习如何估算复杂性分析。

  如果有这样的代码线:

  它是多少,记忆是多少?

  您可能会说您可能需要1ms,内存为4个字节,或者可能需要2ms,内存8bytes等。不同的机器和操作环境将有所不同。

  但是我们都将其用作1。这个1不是MS,而不是字节,而是一个消耗时间/内存职业的基本单元,即复杂性为1。

  该代码呢?

  特异性值随着n而增加,复杂性为n。

  当我们分析复杂性时,我们将不会分析特定的时间消耗和记忆占用。取而代之的是,该语句用作复杂性单位,即1,输入数据量表N的复杂性n用作N。

  我们知道1和n,我们可以计算这些复杂性:

  其中有两个陈述,复杂性为1 + 1,一个具有循环n的句子,复杂性为n,因此总复杂性为2 + n。

  当n逐渐变大时,例如n将变为100,000,那么这个2可以忽略它。

  那是

  这是逐渐复杂性的含义,即逐渐增加时的复杂性。

  一些学生说这是2,因此可以省略。如果这里有100,000个?您不能省略吗?

  实际上,它也将被省略,因为无论多大,它的复杂性始终是一个常数,它是固定的并且不会改变,因此您不需要分析它。估计的时间消耗或内存职业以及其固定部分。更改的更改仅需要分析。

  当我们计算逐渐复杂性o时,将省略常数,因为它是固定并且不变的,我们只分析了变化的一部分,即与n相关的部分。

  上面只有一个输入数据。当尺度为n时,复杂性与n有关。

  如果有两个输入数据,则当比例为M和N时,您必须对其进行计算,并且不能忽略它,因为它们都是更改。

  也就是说,o(m + n),o(m * n)。

  我们了解什么是1,什么是n,当它同时计算M和N时,什么是渐进的复杂性,为什么可以省略常数,您可以看到一些实际的复杂性示例。

  实际上,复杂性也是许多类型:o(n),o(n^2),o(logn),o(2^n),o(n!)

  这是O(n),我们在上面分析了。省略了恒定的复杂性。

  这是O(n^2)。同样,o(n^3),o(n^4)等也意味着,即嵌套时,复杂性被乘以。

  您需要多少次计算此代码?这取决于我乘以2次以大于100,即log2n

  然后是log3n,log4n的复杂性。当复杂性逐渐复杂时,未计算常数,因此是o(logn)

  我们都知道,可以使用上面的递归计算斐波那契数列。

  这样,每个人都会添加到1,而fibnacci函数称为两次,也就是说,复杂性乘以2,因此复杂性为O(2^n)。

  以同样的方式,如果每个n添加了n,而3次是递归的,那就是o(3^n)的复杂性。

  换句话说,n添加了一次,复杂性为o(a^n)。

  在上一个中,我们知道每个plus 1添加了n,而且多个递归通常是几次。它是索引类型。如果每次n次加1,则多个递归n次,这是复杂性o(n!)。

  为什么不(n^n)?因为n已更改,它是o(n!)。

  这基本上是一个总的时间复杂性。当然,这仅与n的纬度和一个纬度m相同,也是如此。

  让我们区分这些时间复杂性的优势和缺点。

  我们已经了解了伟大O逐渐时间的复杂性,以估计N与特定执行时间之间的关系。上面分析了许多时间的复杂性。特定执行时间之间有什么关系?您可以绘制更改功能进行分析。

  可以看出,随着n的增加,o(n!)和o(2^n)是最快的时间,也就是说,这样的代码,一旦n即会立即死亡,无需我们可以分析它。

  随着数据规模的增加,o(n),o(nlogn),o(logn)的卡住很容易?

  所以我们说:

  根据这个结论,我们可以判断某些代码写作的质量,即该算法的优势和缺点。

  我需要运行代码真吗?不必要。

  空间复杂性是堆栈内存分布与输入数据的比例N之间的关系。

  这不包括全局变量,为什么?全局变量不更改动态,这等同于常数。可以省略。仅分析变化的堆栈内存的复杂性。

  空间复杂性的分析方法和时间复杂性相似,但不是基于每个语句为1,而是可以将内存分配为1进行分析的语句。

  例如,以下代码的空间复杂性为o(n)。

  通常通过在运行时运行探测器来收集性能的分析,然后分析时间耗尽和内存职业,例如Chrome Devtoos的性能和内存工具。

  但是实际上,无需运行代码,我们还可以通过复杂性来估计:

  我们使用语句作为对1的复杂性,而复杂性n随输入数据的比例n而变化。

  我们估计是分析时间耗费/记忆占用的时间。随着数据量表N的变化,它将使用O(n)来表达这种变化关系,称为逐渐复杂性。

  当逐渐复杂性复杂时,可以省略常数,因为它们是固定的,我们只需要分析变化即可。

  复杂性基本上是o(n)o(logn)o(n^2)o(2^n)o(n!)。

  应该注意的是,o(2^n)是,当n是加1时,多个递归2次,如果为每个添加n,则多个递归n次,则o(n!)的复杂性。

  O(2^n)和O(n!)的复杂性随N急剧增加,即,时间消耗/记忆职业将急剧增加。

  o(logn)o(n)随着n的增加而增加,复杂性的增加很少。这意味着它花费的时间更少,而记忆更少。当然,这样的算法甚至更好。

  因此,我们通过复杂性评估算法的质量,代表时间消耗/记忆占用,但不是直接表达的,而是抽象表示。

  如果您想在不同的机器和环境中获得特定的时间消耗/内存职业,请使用Profiler在运行时收集数据,然后分析和可视化。否则,实际上,可以通过复杂性来估算近似的时间消耗和内存。

  绩效分析不一定使用剖面。复杂性分析是可以的。它可以评估代码编写(算法)的好或坏,然后估算性能。