我开始认真研究算法和数据结构,并有兴趣学习如何比较我可以实现A a dts的不同方式的性能。
对于简单的测试,我可以在运行之前/之后获得时间,运行10^5次,并平均运行时间。我可以按大小参数化输入,或示例随机输入,并获取运行时间与输入大小的列表。我可以将其作为CSV文件输出,然后将其送入Pandas。
我不确定没有警告。我也不确定如何测量空间复杂性。
我正在学习在C 中编程。是否有人道的工具可以实现我要做的事情?
基准测试代码并不容易。我发现最有用的是Google基准库。即使您不打算使用它,也可以阅读一些示例也可能很好。它具有很大的可能性来参数化测试,输出结果文件,甚至返回算法的符号复杂性(仅命名很少(。如果您熟悉Google测试框架,我建议您使用它。它还可以使编译器的优化进行管理,因此您可以确保未对代码进行优化。
关于CPPCON 2015上的基准代码也有很好的讨论:Chandler Carruth"调整C :基准,CPU和编译器!哦,我的!"。您可能会犯的可能错误有很多见解(它也使用Google基准(
它是操作系统和编译器特定的(因此要实现(。您可以使用分析工具,可以使用正时工具等。
在Linux上,请参见时间(1(,时间(7(,perf(1(,Gprof(1(,PMAP(1(,Mallinfo(3(和Proc(5(以及有关调用GCC。
另请参阅此。实际上,请确保您的运行持续足够长的时间(例如,在一个过程中至少一秒钟(。
请注意,优化编译器可以彻底改变您的程序。参见CPPCON 2017:Matt Godbolt谈话:"我的编译器最近为我做了什么?解开编译器的盖子"
从体系结构的角度谈话,您还可以使用不同的体系结构工具(例如Intel Pin,perf工具(对C 代码进行基准测试。您可以使用这些工具来研究代码的体系结构依赖性。例如,您可以以不同级别的优化来编译代码,并检查IPC/CPI,缓存访问和负载商店访问。您甚至可以检查您的代码是否由于库功能而受到性能。这些工具功能强大,可以为您提供对代码的潜在巨大见解。
您还可以尝试拆卸代码并研究代码在大部分时间花费的位置,并尝试优化它。您可以查看不同的技术,以确保经常访问的数据保留在缓存中,从而确保高命中率。
说,您意识到您的代码在循环中很大程度上主导,可以在不同的循环范围内运行代码,并在两种情况下检查指标。例如,将循环设置为100,000,并找到所需的性能指标" X",然后将循环设置为200,000,并找到性能指标" y"。现在,计算Y-X。这将使您可以更好地了解循环的行为,因为通过减去两个指标,您有效地删除了代码的静态效果。
说,您的代码运行10次,并且使用不同的用户输入大小。您可能可以找到每个用户输入大小的运行时,然后按升序排序此新指标,删除第一个和最后一个值(以删除异常值(,然后取平均值。最后,找到差异系数以了解运行时间的表现。
在旁注上,通常我们最终使用"平均"或"算术平均值"一词' rashly 。查看您计划平均的度量,并查看谐波均值,算术均值和几何均值。例如,找到利率的算术平均值将为您提供错误的答案。简单地找到两个未及时发生的事件的算术手段可能会产生错误的结果。而是使用加权算术手段。