ruby – ActiveRecords select(:id).collect与pluck(:id)方法:为什么纯AR“采摘”更慢?

ruby – ActiveRecords select(:id).collect与pluck(:id)方法:为什么纯AR“采摘”更慢?,第1张

概述我试图从我的文章模型中获取所有ID.我可以用两种方式做到: Article.select(:id).collect{|a| a.id} Article Load (2.6ms) SELECT "articles"."id" FROM "articles" 要么 2.2.1 :006 > Article.pluck(:id) (4.3ms) SELECT "articles"."id" 我试图从我的文章模型中获取所有ID.我可以用两种方式做到:

Article.select(:ID).collect{|a| a.ID}  Article Load (2.6ms)  SELECT "articles"."ID" FROM "articles"

要么

2.2.1 :006 > Article.pluck(:ID)   (4.3ms)  SELECT "articles"."ID" FROM "articles"

是什么赋予了?为什么AR比Ruby版本慢?

即使我对Ruby方法进行基准测试,它似乎更快:

Benchmark.measure{Article.select(:ID).collect{|a| a.ID}}  Article Load (1.9ms)  SELECT "articles"."ID" FROM "articles" => #<Benchmark::Tms:0x007feb12060658 @label="",@real=0.026455502957105637,@cstime=0.0,@cutime=0.0,@stime=0.0,@utime=0.020000000000000018,@total=0.020000000000000018>
解决方法 您的基准测试不准确.首先,正如您所看到的,数据库端的两个执行都会触发相同的查询

SELECT "articles"."ID" FROM "articles"

因此,数据库时间应该被视为无关紧要.显然,这两个查询具有不同的执行时间,如控制台所示,但这是正常的,就好像您运行相同的查询100次执行时间每次都可能不同,因为它取决于各种变量,如机器负载,数据库状态等

由于数据库执行时间可以被认为是等效的,因此它与基准测试无关.

因此,您需要比较的是Ruby执行时间和分配.与收集它不分配ActiveRecord对象相比,Pluck应该更快,更轻量,而只返回选定的值.

如果你真的想要对这些方法进行基准测试,你应该模拟数据库时间(这显然是变量但与此基准测试无关),只有基准分配和两种不同的Ruby方法.

长话短说,采摘通常更有效率.

总结

以上是内存溢出为你收集整理的ruby – ActiveRecords select(:id).collect与pluck(:id)方法:为什么纯AR“采摘”更慢?全部内容,希望文章能够帮你解决ruby – ActiveRecords select(:id).collect与pluck(:id)方法:为什么纯AR“采摘”更慢?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1287197.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存