- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用criterion对我的 Haskell 代码进行基准测试。我正在进行一些繁重的计算,需要随机数据。我已经编写了这样的主要基准文件:
main :: IO ()
main = newStdGen >>= defaultMain . benchmarks
benchmarks :: RandomGen g => g -> [Benchmark]
benchmarks gen =
[
bgroup "Group"
[
bench "MyFun" $ nf benchFun (dataFun gen)
]
]
我在不同的模块中为它们保留基准测试和数据生成器:
benchFun :: ([Double], [Double]) -> [Double]
benchFun (ls, sig) = fun ls sig
dataFun :: RandomGen g => g -> ([Double], [Double])
dataFun gen = (take 5 $ randoms gen, take 1024 $ randoms gen)
这可行,但我有两个问题。首先,生成随机数据所需的时间是否包含在基准测试中?我发现a question that touches on that subject但老实说我无法将其应用到我的代码中。为了检查是否会发生这种情况,我编写了包含在 IO monad 中的数据生成器的替代版本。我将基准列表放在 main 中,称为生成器,用 <- 提取结果,然后将其传递给基准测试函数。我发现性能没有任何差异。
我的第二个问题与生成随机数据有关。现在,生成器一旦创建就不会更新,这导致在单次运行中生成相同的数据。这不是一个大问题,但无论如何,正确地解决它会很好。有没有一种巧妙的方法可以在每个 data* 函数中生成不同的随机数据? “Neat”是指“不让数据函数在 IO 内获取 StdGen”?
编辑:正如下面的评论所述,我并不真正关心数据随机性。对我来说重要的是生成数据所需的时间不包含在基准测试中。
最佳答案
This works, but I have two concerns. First, is the time needed to generate random data included in the benchmark?
是的,会的。所有随机生成都应该延迟发生。
To check whether this happens I wrote an alternative version of my data generator enclosed within IO monad. I placed benchmarks list with main, called the generator, extracted the result with <- and then passed it to the benchmarked function. I saw no difference in performance.
这是预期的(如果我明白你的意思的话); randoms gen
中的随机值只有在需要时才会生成(即在基准循环内)。
Is there a neat way to generate different random data within each data* function? "Neat" means "without making data functions acquiring StdGen within IO"?
您需要处于 IO
中,或者使用您提供的整数种子(使用 mkStdGen
)创建一个 StdGen
。
回复。您的主要问题是如何从基准中获取 pRNG 内容,您应该能够在 defaultMain(基准 g)
内容之前完全评估随机输入, 评估
和强制
如下:
import Control.DeepSeq(force)
import Control.Exception(evaluate)
myBench g = do randInputEvaled <- evaluate $ force $ dataFun g
defaultMain [
bench "MyFun" $ nf benchFun randInputEvaled
...
其中 force
将其参数计算为正常形式,但这仍然会延迟发生。因此,为了让它在 bench
之外进行评估,我们使用 evaluate
来利用单子(monad)排序。如果您想避免导入,您还可以执行诸如在元组中每个列表的尾部调用 seq
等操作。
这种事情应该可以正常工作,除非您需要在内存中保存大量的测试数据。
编辑:如果您想从 IO 获取数据(例如从磁盘读取),并且不希望将其混合到基准测试中,则此方法也是一个好主意。
关于haskell - 如何为 Criterion 基准创建数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12896235/
我正在尝试计算与引用单元格颜色相同的范围内的单元格数量,如果另一个范围内的相应单元格具有正确的值标准。例如: 如果 (A1 < 350) 和 (B1 与引用单元具有相同的颜色),则计数 1。 循环第
我在 eclipse Juno、Spring 3.1.1、hibernate 4.1、tomcat 7 和 mySQL 中使用 STS。 我创建了一个简单的 MVC 模板项目。我的目的是用户将一些数据
Criterion Rust 的基准库记录为 generating plots描述基准测试结果: Criterion.rs can generate a number of useful charts
以下代码(由 Reid Barton 在 Criterion causing memory consumption to explode, no CAFs in sight 处建议)有一个基准时间,与
在 Criterion 中对函数进行基准测试之前,如何强制评估函数的输入?我正在尝试对某些函数进行基准测试,但希望排除评估输入 thunk 的时间。有问题的代码使用 unboxed vectors对于
我正在使用criterion对我的 Haskell 代码进行基准测试。我正在进行一些繁重的计算,需要随机数据。我已经编写了这样的主要基准文件: main :: IO () main = newStdG
目前,我必须创建一个临时 Criteria 并使用 Criteria.list() 获取匹配的实体列表,然后将该列表传递给 HibernateTemplate .deleteAll(): void d
我遇到了这种情况的问题(我会尽量简化)- 我的数据库中有用户具有角色列表和状态列表。 public class User implements Serializable { @ManyToM
我正在使用标准 (cargo bench) 为 crate 开发一些基准测试。在完成代码之前,我想暂时限制迭代次数。 我知道测量值可能不准确,但这只是暂时的。这可能吗? 最佳答案 这是可能的。 查看C
我正在使用 sklearn.tree.DecisionTreeClassifier here是它的链接。我想使用关键字 criterion 并将其设置为 "entropy" 我做了以下事情: mode
我想用 3 个 OR Criterions 进行标准查询,但我不知道什么是最好的方法。 目前我只有 2 个或限制。 Criteria crit = session.createCriteria(Rea
我正在使用 NHibernate 版本 2.0.0.4000。 在我的一个查询中,我想使用 sql 函数 dateadd 来添加天数。这没有注册,所以我创建了自己的方言并注册了如下函数: Regist
我使用 Hibernate 而不是 mySQL。在 mySQL 中,您甚至可以在查询中对数字(如 double )参数和日期添加 LIKE,例如您可以编写: select * from sillyta
我有一个以下查询,我必须从子查询创建的临时表中选择行。 select x, y, x from (select x, y, z from some_table where x between x1 a
我正在尝试使用 Criterion 框架来衡量一个简单的 Haar DWT 程序的性能。 (这是错误的慢,但我会把它留给另一个问题)。不幸的是,我在网上找不到任何好的文档。我的两个主要问题是 如何将数
我正在尝试对 annotate 进行基准测试例程使用 Criterion 基准测试库。例程检查 &[&str]参数(二维方串)并返回 Vec我怀疑它的执行时间可能取决于参数的内容。因此,我想随机化单个
我想知道我的程序将 12.9MB 的 .wav 文件读入内存需要多长时间。将文件读入内存的函数如下所示: import qualified Data.ByteString as BS g
如果我要根据特定条件选择一些行,我可以在 NHibernate.Criterion 中使用 ICriterion 对象,例如: public List GetByCriteria() {
我刚刚升级到 Hibernate 4.1.10.Final(在第一次升级到 4.1.8.Final 之后),但现在无法编译: Restrictions.eq("loginName", loginNam
你好,我有一个大型的 oracle hibernate web 应用程序,它似乎给出了这个错误 ORA-01795:列表中表达式的最大数量为 1000 我需要一个 java 代码作为 hibernat
我是一名优秀的程序员,十分优秀!