Tag: 性能

用户可以“阅读”的范围记录的常用方法是什么?

我正在使用Ruby on Rails 3.2.2并且我想知道当必须检查用户是否具有“读取”记录“列表”中存在的记录的适当授权时,什么是常用方法。 也就是说,此时我有以下内容: class Article < ActiveRecord::Base def readable_by_user?(user) # Implementation of multiple authorization checks that are not easy to # translate into an SQL query (at database level, it executes a bunch of # "separate" / "different" SQL queries). … # return 'true' or 'false' end end 通过使用上面的代码,我可以对单个文章对象执行授权检查: @article.readable_by_user?(@current_user) 但是,当我想通过检索恰好10个对象来制作(通常在我的控制器index操作中)类似下面的内容 Article.readable_by_user(@current_user).search(…).paginate(…, :per_page […]

Rails 3 Cli执行命令真的很慢?

有人知道为什么我的rails 3.0.7 cli这么慢? 当我运行rails s或rails g它需要5秒才能实际执行命令… 任何建议? 谢谢

慢铁栈

当我跑 rails服务器 要么 耙-T 或者其他一些rails脚本,需要花费很多时间,大约1分钟。 确定这么慢的最佳方法是什么? 如何提高速度? Rails v是3.0.3运行ruby 1.9.2(RVM) – Linux

ActiveRecord包含

我使用以下模型制作了锻炼应用程序: 用户 常规 升降机 演习 相关信息 例程属于用户 例行程序有许多升降机(这是运动和常规之间的联接) 电梯属于运动 信息(套)属于电梯 我正在深入研究ActiveRecord查询,并特别包括处理我遇到的n + 1问题。 当我展示整个例程时,显示: 例程名称 用户名 每个电梯的练习名称 每个电梯的设置 如果我想减少查询,我可以简单地加载如下所示的所有内容: a = Routine.includes(:user,:lift,:exercise,:infos)并循环遍历所有这些以找到我想要的东西? 或者我必须打破它更多说: a = Routine.includes(:user,:lift) b = Lift.includes(:exercise,:infos) 为了缩小我的查询量。 如果这个问题不够明确,请告诉我。

为什么array.index比array.include更快?

我正在处理一些大型数据集,并试图提高性能。 我需要确定对象是否包含在数组中。 我正在考虑使用index或include? 所以我对两者进行了基准测试。 require ‘benchmark’ a = (1..1_000_000).to_a num = 100_000 reps = 100 Benchmark.bmbm do |bm| bm.report(‘include?’) do reps.times { a.include? num } end bm.report(‘index’) do reps.times { a.index num } end end 令人惊讶的是(对我来说), index要快得多。 user system total real include? 0.330000 0.000000 0.330000 ( 0.334328) index 0.040000 0.000000 0.040000 ( 0.039812) 由于index提供的信息多于include? ,如果有的话,我原本预计它会稍慢一些,尽管事实并非如此。 […]

如何查找MASSIVE数组中的哪些项目不止一次出现?

这是一个非常简单的问题; 哪些项目不止一次出现在列表中? array = [“mike”, “mike”, “mike”, “john”, “john”, “peter”, “clark”] 正确答案是[“mike”, “john”] 。 好像我们可以这样做: array.select{ |e| ary.count(e) > 1 }.uniq 问题解决了。 可是等等! 如果arrays非常大,该怎么办: 1_000_000.times { array.concat(“1234567890abcdefghijklmnopqrstuvwxyz”.split(”)) } 碰巧我需要弄清楚如何在合理的时间内完成这项工作。 我们正在谈论数以百万计的记录。 对于它的价值,这个庞大的arrays实际上是10-20个较小arrays的总和。 如果比较那些比较容易,请告诉我 – 我很难过。 我们正在谈论每个文件10,000到10,000,000行,数百个文件。

Ruby-on-rails 4性能下降

升级到Rails后,我看到了很多性能问题。 我最近将我的项目从Rails 2和Ruby 1.8升级到Rails 4和Ruby 2.0。 在互联网上阅读,我了解升级应该提供优秀的性能改进(高达30%)开箱即用。 不幸的是,我发现在某些情况下性能要差很多,例如以前需要大约20秒的一些报告,现在需要40秒。 我看过一些post表明垃圾收集可能是个问题。 在使用了一些推荐的设置之后,我发现一些较长的报告实际上更短,但是简短的报告仍然更糟糕。 作为升级的一部分,我已经转移到视图渲染的不显眼的javascript,但这似乎没有导致性能问题 – 大部分时间都花在模型中。 有人知道我是否缺少一些配置’陷阱’? 升级后是否有其他人遇到性能问题? 提前致谢。

function编程风格与Ruby中的性能

我喜欢函数式编程,我也喜欢Ruby。 如果我能够以function样式而不是命令式样式编写算法,我会这样做。 我倾向于不尽可能地更新或重用变量,避免使用“爆炸!” 方法和使用“map”,“reduce”和类似的函数而不是“each”或危险循环等。基本上我尝试遵循本文的规则。 问题是通常function性解决方案比命令式解决方案慢得多 。 在这篇文章中有一些清晰而可怕的例子,在某些情况下要慢15-20倍。 阅读它并做一些基准后,我害怕继续使用function样式,至少在Ruby中。 另一方面,我觉得在函数风格中编写代码更舒服,因为它是智能和干净的,它往往更少的错误,我认为更“正确”,特别是现在我们可以使用并发和并行来获得更好的性能。 所以我对Ruby中使用哪种样式感到很困惑。 任何明智的建议将不胜感激。

为什么Ruby的循环命令比true更慢?

Ruby有一个内置的loop命令,可以永久地执行它后面的块(或直到中断为止)。 但是,当它与function上相似while true ,它会明显变慢: require “benchmark/ips” NUMBER = 100_000_000 def fast index = 0 while true break if index > NUMBER index += 1 end end def slow index = 0 loop do break if index > NUMBER index += 1 end end Benchmark.ips do |x| x.report(“While Loop”) { fast } x.report(“Kernel loop”) { slow […]

我可以更快地制作这个Ruby代码和/或使用更少的内存吗?

我在Ruby中有一个String对象Array ,它们由下面的单词组成: animals = [“cat horse”, “dog”, “cat dog bird”, “dog sheep”, “chicken cow”] 我想将其转换为另一个String对象Array ,但每个元素只有一个动物,只有唯一的元素。 我找到了一种方法,如下所示: class Array def process() self.join(” “).split().uniq end end 但是,如果输入数组是巨大的,让我们说数百万个条目然后执行这将是非常糟糕的因为我将创建一个巨大的字符串,然后一个巨大的数组然后uniq必须处理该巨大的数组以删除重复的元素。 我考虑加快速度的一种方法是为每个单词创建一个带有条目的Hash ,这样我只会在第一遍中处理每个单词一次。 有没有更好的办法?