代码统计抽样
Statistical sampling of code
这可能是一个非常开放的问题。
我必须快速测量某些代码段的时间。我正在使用 std::chrono::high_resolution_clock
功能。我必须 运行 多次迭代此代码并测量持续时间。
问题来了:我可以测量最小和最大持续时间值,并使用样本数计算平均值。在这种情况下,我只需要存储 4 个值。但我也想知道数据是如何分布的。计算标准偏差或直方图需要存储所有数据点。然而,这将需要一个巨大的初始数据结构或动态增长的数据结构——这两者都会影响我的嵌入式系统上的测量代码。
有没有办法使用前一个样本的标准差来计算这个样本的标准差?
Calculation of the standard deviation or histogram requires that all data points be stored
这完全是错误的。您可以使用 Welford 算法计算 运行 标准偏差,该算法只需要一个额外的变量,除了 运行 平均值和当前元素数。
至于直方图,您不需要保留所有数据 - 您只需要保留每个 bin 的计数,并在每次有新样本时增加正确的 bin。当然,对于这种简单的支付方式,您需要提前知道预期范围和箱数。如果这不可能,您始终可以从小范围内的小分箱开始,并在遇到当前范围之外的元素时缩放分箱大小(合并相邻分箱)。同样,所有这些只需要固定数量的内存(每个 bin 一个整数,范围两个值)。
这可能是一个非常开放的问题。
我必须快速测量某些代码段的时间。我正在使用 std::chrono::high_resolution_clock
功能。我必须 运行 多次迭代此代码并测量持续时间。
问题来了:我可以测量最小和最大持续时间值,并使用样本数计算平均值。在这种情况下,我只需要存储 4 个值。但我也想知道数据是如何分布的。计算标准偏差或直方图需要存储所有数据点。然而,这将需要一个巨大的初始数据结构或动态增长的数据结构——这两者都会影响我的嵌入式系统上的测量代码。 有没有办法使用前一个样本的标准差来计算这个样本的标准差?
Calculation of the standard deviation or histogram requires that all data points be stored
这完全是错误的。您可以使用 Welford 算法计算 运行 标准偏差,该算法只需要一个额外的变量,除了 运行 平均值和当前元素数。
至于直方图,您不需要保留所有数据 - 您只需要保留每个 bin 的计数,并在每次有新样本时增加正确的 bin。当然,对于这种简单的支付方式,您需要提前知道预期范围和箱数。如果这不可能,您始终可以从小范围内的小分箱开始,并在遇到当前范围之外的元素时缩放分箱大小(合并相邻分箱)。同样,所有这些只需要固定数量的内存(每个 bin 一个整数,范围两个值)。