开发区

先进的软件开发与MATLAB

继续游泳

还记得多莉吗?

图片来源:Silvio Tanaka[抄送2.0],通过维基媒体共享

面对困难时坚持不懈的榜样,浩瀚无垠大海中欢快而自由的鱼,我们可爱的尼莫的养母,多莉?

她走在时代的前面。谁知道她明智的建议,就继续游泳吧。

有时候在我们进行性能测试时,我们需要一点这种能力。具体来说,当我们测量太快的代码时,我们需要保持游动(可以这么说)。例如,让我们从最后一篇文章(CQ的矩阵库)。我们在这里写的性能测试是这样的:

classdeftMatrixLibrary 性质(TestParameter)TestMatrix=struct(“中型”,魔术(600),......“慷慨”,magic(1000));终止方法(测试)作用testSum(testCase,TestMatrix)矩阵_sum(TestMatrix);终止作用testMean(testCase,TestMatrix)矩阵_-mean(TestMatrix);终止作用testEig(testCase,TestMatrix)testCase.assertReturnsTrue(@()大小(TestMatrix,1)=大小(TestMatrix,2),......“Eig仅适用于方形矩阵”);testCase.startMeasuring;matrix_eig(TestMatrix);testCase.stopMeasuring;终止终止终止

在这里,你可以看到,我们测试对一个“中等规模”的问题和“大尺寸”的问题。(UN)方便丢失,但是,是一个“小规模”的问题。为什么是这样?那么,我们为什么不添加一个...

classdeft矩阵库_v2性质(TestParameter)TestMatrix=struct(“小尺寸”,魔术(100),“中型”,魔术(600),......“慷慨”,magic(1000));终止方法(测试)作用testSum(testCase,TestMatrix)矩阵_sum(TestMatrix);终止作用testMean(testCase,TestMatrix)矩阵_-mean(TestMatrix);终止作用testEig(testCase,TestMatrix)testCase.assertReturnsTrue(@()大小(TestMatrix,1)=大小(TestMatrix,2),......“Eig仅适用于方形矩阵”);testCase.startMeasuring;matrix_eig(TestMatrix);testCase.stopMeasuring;终止终止终止

…以及检查结果有效性的快速功能,我们将发现:

作用检查结果(结果)显示(换行)显示帧如果〜所有([results.Valid])DISP(“哦,不,多莉,有些测量是无效的!”其他的disp(“谢谢多莉,对特殊照顾最好的!我们所有的测试都不错“。终止dispFrame终止作用dispFrame DISP(':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::');终止
结果= runperf(“tMatrix图书馆2”); 检查结果(结果)
运行tMatrixLibrary_v2 ........ ================================================================================ tMatrixLibrary_v2 / testSum(TestMatrix =小型多)过滤。测试诊断:该MeasuredTime不应该太靠近框架的精度。================================================================================ ... .......... .......... .......... ....... ================================================================================ tMatrixLibrary_v2/ testMean(TestMatrix =小型多)过滤。测试诊断:该MeasuredTime不应该太靠近框架的精度。================================================================================ ... .......... ...................。。..... .......... .Warning: Target Relative Margin of Error not met after running the MaxSamples for tMatrixLibrary_v2/testMean(TestMatrix=largeSize). ......... .......... ..... Done tMatrixLibrary_v2 __________ Failure Summary: Name Failed Incomplete Reason(s) =============================================================================================== tMatrixLibrary_v2/testSum(TestMatrix=smallSize) X Filtered by assumption. ----------------------------------------------------------------------------------------------- tMatrixLibrary_v2/testMean(TestMatrix=smallSize) X Filtered by assumption. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Oh no Dory, some measurements were invalid! :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

哦,这看起来不太理想。看起来我们的一些小规模度量是无效的。它们是无效的,因为框架认识到代码执行时间太接近框架的可测量精度。框架能够确定它是一个垃圾度量,而不是风险度量ng坏数据结果是,它主动筛选了速度过快的测试,并将结果标记为无效。好吧,我仍然想度量这种速度过快的情况,那么我们该怎么办?通常,我们看到的情况是人们用静态对于循环,就像这样:

classdeftMatrixLibrary_v3 性质(TestParameter)TestMatrix=struct(“小尺寸”,魔术(100),“中型”,魔术(600),......“慷慨”,magic(1000));终止方法(测试)作用testSum(测试用例,TestMatrix)对于IDX = 1:1000 matrix_sum(TestMatrix);终止终止作用testMean(测试用例、测试矩阵)对于idx=1:1000矩阵平均值(TestMatrix);终止终止作用testEig(testCase,TestMatrix)testCase.assertReturnsTrue(@()大小(TestMatrix,1)=大小(TestMatrix,2),......“Eig仅适用于方形矩阵”);testCase.startMeasuring;matrix_eig(TestMatrix);testCase.stopMeasuring;终止终止终止
结果= runperf(“tMatrix Library_v3”); 检查结果(结果)
将其作为一个三级图书馆,并将其作为一个三级图书馆,并将其作为作为一个三级图书馆,并将其作为作为一个三级图书馆,并将其作为一个3 3 3 3 3 3 3 3的运营运营。………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………将将作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为一一一:::::::::::::

好吧,至少结果看起来不错。试想一下,就像你在用厨房磅秤测量羽毛的重量一样。测量一根羽毛会给你一个床铺的尺寸,所以你可以收集1000根或更多的羽毛,放在一个盒子里,然后测量整根羽毛的平均重量。

问题解决了?这不是真的。有一些大的缺点,以这种方式。让我们历数:

  1. 我不得不选择一些迭代来测试。更重要的是,这个选择是任意的。我怎么知道我不在框架精度的边缘?如果是这样的话,我可能会经历一些测试,这些测试有时太快而无法测量!此外,框架精度取决于机器,因此不同的机器将有不同的p精度阈值。没有一个好的数字可供参考,所以这是任何人的猜测。这并不令人宽慰。
  2. #欧姆性是这样的慢!为什么会慢?因为我有运行1000次迭代的一切,包括更大的矩阵大小。不需要这些如果尺寸较大,在一个循环中运行,但为了维持他们需要如果较小尺寸的苹果/桔子比较。
  3. 当比较其他算法时,这种方法没有效果。如果一个算法需要1000次迭代,而另一个只需要750次,那么我们很快就会开始比较苹果和橙子,从而失去对真实性能的了解。
  4. 比方说,随着时间的推移,我们孜孜不倦地跟踪我们的代码性能,而且我们在优化关键代码方面做了大量的工作,并在代码性能方面取得了巨大的改进。这个改进可能需要我们“增加”迭代次数,因为由于代码优化,1000次迭代可能突然变得太快而无法测量,现在我们需要测量10000次迭代。然而,一旦我们这样做了,所有未来的测量都与我们的历史数据不同。瘸的
  5. 最后,也许是由于一些以上所讨论的这些苹果/桔子麻烦的根本原因,这是根本没的代码的执行时间的真实测量。

所以外卖,一旦你的代码打的我们怎么快速测量的东西的限制,我们可以添加一个静态对于回路也许架着一起,但它真的不是最好的体验。

进来R2018b

在R2018b性能测试框架,现在有一个新的keepMeasuring在方法matlab.perftest.TestCase类,以支持更快速的万博1manbetx代码测量的工作流程。这是如何使用的?把它放在一个while循环,让框架确定迭代的权数:

classdeft矩阵库_final性质(TestParameter)TestMatrix=struct(“小尺寸”,魔术(100),“中型”,魔术(600),......“慷慨”,magic(1000));终止方法(测试)作用testSum(测试用例,TestMatrix)虽然testCase.keepMeasuring matrix_sum(TestMatrix);终止终止作用testMean(测试用例、测试矩阵)虽然testCase.keepMeasuring矩阵_均值(TestMatrix);终止终止作用testEig(testCase,TestMatrix)testCase.assertReturnsTrue(@()大小(TestMatrix,1)=大小(TestMatrix,2),......“Eig仅适用于方形矩阵”);虽然testCase.keepMeasuring矩阵(TestMatrix);终止终止终止终止
结果= runperf(“tMatrixLibrary_决赛”); 检查结果(结果)
运行的TM3图书馆是一个最终的,这是一次运行的猫作为作为一个最终的实验室,这是最终的,………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为::::::::::::::::::

啊!是不是很可爱?我也没必要硬编码任何静态对于环价值观,我们能够准确地显著更快的测量代码,将其值实际返回的拍摄,而不是价值观的真实倍任意缩放因子偏移。此外,代码需要更多的迭代是快速的代码,所以我甚至没有注意到测试时间的任何差异,而较慢的测试并不需要在所有的任何更多的迭代的精确测量。太赞了。先看样品总结,你可以看到拍摄的实时:

样本摘要(结果)
8.8 X 7.9 X 7.表名,8.7 X 7.表名,表名,表名,表名,表名,表表名,表名,表表名,表名,表示表示,平均,平均,平均,平均,标准,平均,标准,平均,标准偏差,平均,平均,平均,平均,标准,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,标准,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,平均,标准,标准,平均,标准,标准,标准,标准,标准Uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(TestMatrix=Middise)40.00060309 1.4084e-05 0.00058393 0.00060658 0.00061526 tMatrix_final/testSum(TestMatrix=largeSize)40.003275 6.2535e-05 0.0031897 0.0032854 0.0033395 tMatrix_final/testMean(TestMatrix=Smallize)41.5534e-05 3.4959e-07 1.5221e-05 1.5535e-05 1.5847e-05 tMatrix_final/testMean(TestMatrix=Middise)4 0.00059933 9.2749e-06 0.00058845 0.00060012 0.00060865 t矩阵库最终/测试平均值(测试矩阵=大尺寸)4 0.0032668 4.8834e-05 0.0031958 0.0032859 0.0032997 t矩阵库最终/测试(测试矩阵=小尺寸)4 0.003086.1447e-05 0.00304 0.0030639 0.0031762 t矩阵库最终/测试(测试矩阵=中型)4 0.16333 0.001356 0.16232 0.16287 0.16527 t矩阵库最终版/测试版(测试矩阵=largeSize)4 0.39709 0.00096197 0.39613 0.39704 0.39813

值得注意的是,这不是一个银弹。keepMeasuring方法中仍然存在一些框架开销,这使得我们无法测量一些真正快速的代码。把它想象成测量一组羽毛,但是如果每根羽毛都单独包裹在一个小包中,那么我们测量的是包的开销,而不是实际的羽毛。因此,尽管仍有一些代码的测量速度太快(请不要期望有效的测量值为1+1),但使用keepMeasuring如在我们的实验打开了2个数量级的允许精度的方法。

玩得开心,像多莉,只是不停地测量你们!




与MATLAB®R2018b一起发布

|
  • 打印
  • 发电子邮件

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。