Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 查询执行解释上的巨大差异_Ruby_Arrays - Fatal编程技术网

Ruby 查询执行解释上的巨大差异

Ruby 查询执行解释上的巨大差异,ruby,arrays,Ruby,Arrays,为什么运行这两个查询所需的时间有如此巨大的差异?我使用Capybara迭代页面报告部分上的所有锚定标记,然后将每个值放入一个数组中,以便检查值 @links = page.all('table.report > tbody > tr > .col_7 > a') @links.map(&:text) # This takes approx 20 seconds to go through 239 results @links.map { |l| l['title'

为什么运行这两个查询所需的时间有如此巨大的差异?我使用Capybara迭代页面报告部分上的所有锚定标记,然后将每个值放入一个数组中,以便检查值

@links = page.all('table.report > tbody > tr > .col_7 > a')
@links.map(&:text) # This takes approx 20 seconds to go through 239 results
@links.map { |l| l['title'] } # This takes about 3 seconds
为什么会有这么大的差异?我希望了解map函数的每个变体之间的主要差异

@links.map(&:text)
在ActiveRecord::Relation上调用map时,会命中db并返回所有@link(但未处理)

但是,通过调用(&:text),必须构造每个对象,随后,text()方法会对每个对象进行调用

@links.map { |l| l['title'] }

虽然我不确定,但我相信查询优化器可以很容易地将其修改为:@links.pulk(:title),这将导致一次db命中,从而返回所有链接标题(显然比构造每个查询更快),即使不是这样,我们只是从对象中提取属性:title,而不需要构造它

这应该是关于您必须为每个对象执行的DOM扫描类型,而不是关于不同的“映射函数变体”。 据推测,标题只是一个标记属性,当您尝试使用
#[]()
检索它时,它已经存储在
链接的
对象实例中,而
#text
很可能是一种递归扫描每个链接的子节点并从每个链接提取文本的方法

#map(&:text)
#map{| item | item.text}
实际上并不是映射函数的两个“变体”。它们是完全相同的版本。一元
&
对非块的非过程对象所做的是:

  • 它调用
    #到_proc
    ,在symbol
    的情况下:symbol
    将产生一个等价于
    proc.new{| item | item.symbol}
  • 它将在步骤1中获取的proc转换为一个块,在symbol
    :symbol
    的情况下,该块将产生一个等价于
    {item | item.symbol}
  • (请参见中的一元数部分)


    #map
    而言,当您执行
    @links.map(&:text)
    时,它是通过
    @links.map{item}item.text}
    调用的。map(&:text)

    您是否尝试将其与
    @links.map{l | l.text}
    进行比较?我认为这更多的是关于你必须为每一个做的不同类型的DOM扫描,而不是关于不同的“映射函数的变体”。我的意思是,标题只是一个标记属性——它应该已经在链接对象实例中存储了它
    #text
    可能是一种递归扫描所有子节点的方法,提取它们的文本内容。谢谢,我想我现在更明白一点谢谢你的回答,我在这个例子中不使用db,但我知道你是什么saying@link不是ActiveRecord::Base