问题标签 [criterion]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 使用标准输入错误
我阅读了有关该软件包的文档和一些文章,但是我是 Haskell 的新手并且不太了解,但我尝试了....
以下是我所做的:
因为它发生了以下错误:
haskell - 如何使用 Criterion 来衡量 Haskell 程序的性能?
我正在尝试使用 Criterion 框架来衡量一个简单的 Haar DWT 程序的性能。(这是错误的慢,但我会把它留给另一个问题)。不幸的是,我在网上找不到任何好的文档。我的两个主要问题是
- 如何将数据从一个基准传递到另一个基准?我想为程序的每个阶段计时。
- 采样如何工作,并避免重复使用之前的计算的惰性评估?
这个来源相对减少;第一个函数getRandList
生成一个随机数列表;haarStep
将输入信号转换为差值和和,并haarDWT
调用前者并对和进行递归。我正在尝试将 传递getRandList
给haarDWT
通过惰性评估,但也许我的用法不正确/不受支持。时间安排似乎没有意义。
最后,当我尝试使用-s 1
;调用它时出现错误。也许这只是一个标准错误。
提前致谢!
optimization - Haskell 基准测试/非严格归约的 nf/whnf 优化
我正在尝试优化一个库,该库旨在获取大型数据集,然后对其应用不同的操作。现在该库正在运行,我想对其进行优化。
我的印象是,非严格评估允许 GHC 组合操作,以便在编写所有函数时仅迭代一次数据,以便对参数进行排序以促进 whnf 减少。(并可能减少对每个数据执行的操作数量)
为了测试这一点,我编写了以下代码:
使用 Criterion 库进行基准测试,我得到以下结果:
GHC是否优化了“双重”功能,使得列表只被(* 6)操作一次?nf 结果表明情况确实如此,否则“double”的平均计算时间将是“single”的两倍
是什么让 whnf 版本运行得如此之快?我只能假设实际上没有执行任何操作(或者只是减少的第一次迭代)
我什至使用了正确的术语吗?
haskell - 在标准中进行基准测试之前强制评估函数输入
在Criterion中对函数进行基准测试之前,如何强制评估函数的输入?我正在尝试对某些功能进行基准测试,但希望排除评估输入 thunk 的时间。有问题的代码使用未装箱的向量作为输入,对于Int向量不能进行 deepseq'd 。下面的示例代码片段:
标准基准包括构建shortv的时间,以及在对上述函数进行基准测试时的intv输入。标准测量值如下 - 它为每个函数测量约 400ns,这似乎也包括输入的构建时间:
现在,如果将基准代码的主要部分修改为以下(通过删除第二个基准功能):
似乎在对 encodeInt16V 函数进行基准测试之前评估了shortv输入。这确实是我想要的输出,因为这个基准测试了函数执行的时间,不包括构建输入的时间。下面的标准输出:
同样,如果我只对“encode IntV”基准进行基准测试,我也会得到大约 150ns 的时间。
我从 Criterion 文档中知道,它试图避免惰性评估以进行更准确的基准测试。这是有道理的,在这里并不是真正的问题。我的问题是如何构建 shortv 和 intv 输入,以便在将它们传递给 bench 函数之前已经对其进行了评估。现在,我可以通过将 defaultMain 限制为一次只对一个函数进行基准测试来实现这一点(正如我刚刚在上面展示的那样),但这不是一个理想的解决方案。
编辑1
Criterion 基准测试还发生了其他事情,它似乎只发生在向量数组上,而不是列表上。如果我通过打印 shortv 和 intv 来强制进行全面评估,则基准测试仍将时间测量为 ~400ns,而不是 ~150ns。代码更新如下:
标准输出(也有 158.4% 的异常值,这似乎不正确):
haskell - 标准库选择的命令行选项
我使用了库标准和 cmdargs。
当我在没有 cmdargs 的情况下完全编译程序并运行它时,例如 ./prog --help 然后我从标准中得到一些关于可能选项和运行次数等的不需要的响应。
当我如下编译并运行它时,命令行选项首先由我的代码拾取,然后按标准读取。然后,Criterion 报告并错误告诉我选项 --byte 是未知的。我在标准文档中没有看到如何关闭或解决此问题。有没有办法清除我读过的命令行选项?否则,我将需要使用例如 CPUTime 而不是标准,这对我来说是可以的,因为我确实需要标准提供的额外功能和数据的负载。
haskell - 标准能力
我在这里找到了一些使用标准的旧示例。看起来好像早在 2009 年它就支持用于绘制图形的命令行选项。
现在,当我导入标准 0.6 时,将其包装在一个基本应用程序中(以对其进行测试)并说 ./application --help 它只提供很少的可用选项,并且与绘图无关。在我看来,就输出格式和功能而言,2009 年的功能比 2012 年的要多?
似乎有一个criteria-to-html可以创建基本的html 报告,但没有任何东西接近例如上述网站上或标准源数据包的示例目录中显示的png 输出。
我在哪里可以找到准确和最新的信息?
haskell - 如何获得一致的标准基准,或跨运行解释结果?
我正在尝试优化一些代码,使用标准来尝试比较,例如,将INLINE
pragma 添加到函数的效果。但我发现重新编译/运行之间的结果不一致。
我需要知道如何使结果在运行中保持一致以便我可以比较它们,或者如何评估基准是否可靠,即(我猜)如何解释有关方差的细节,“成本时钟呼叫”等。
我的具体案例的详细信息
这与我上面的主要问题正交,但在我的特定情况下,有几件事可能会导致不一致:
我正在尝试对
IO
操作进行基准测试,whnfIO
因为本示例whnf
中使用的方法不起作用。我的代码使用并发
我有很多标签和废话打开
示例输出
这两个都来自相同的代码,以完全相同的方式编译。我直接在下面进行了第一次运行,进行了更改并进行了另一个基准测试,然后恢复并再次运行了第一个代码,编译:
首轮:
第二次运行,慢约 3 倍:
我注意到,如果我按“时钟呼叫的估计成本”进行缩放,这两个基准相当接近。这是我应该做的以获得一个实数进行比较吗?
haskell - 如何为 Criterion 基准创建数据?
我正在使用标准来对我的 Haskell 代码进行基准测试。我正在做一些需要随机数据的繁重计算。我已经像这样编写了我的主要基准文件:
我将基准和数据生成器保存在不同的模块中:
这行得通,但我有两个担忧。首先,生成随机数据所需的时间是否包含在基准测试中?我发现了一个涉及该主题的问题,但老实说,我无法将其应用于我的代码。为了检查这是否发生,我编写了一个包含在 IO monad 中的数据生成器的替代版本。我将基准列表放在 main 中,称为生成器,用 <- 提取结果,然后将其传递给基准函数。我没有看到性能上的差异。
我的第二个问题与生成随机数据有关。现在生成器一旦创建就不会更新,这会导致在一次运行中生成相同的数据。这不是一个主要问题,但是如果能正确地完成它会很好。是否有一种巧妙的方法可以在每个 data* 函数中生成不同的随机数据?“整洁”的意思是“不让数据函数在 IO 内获取 StdGen”?
编辑:正如下面评论中所述,我并不真正关心数据随机性。对我来说重要的是生成数据所需的时间不包含在基准测试中。