我的rails应用程序运行速度太慢。为什么?请帮我

时间:2012-07-24 09:24:35

标签: ruby-on-rails facebook algorithm koala

这是代码。有谁能找到原因? 这个节目是为了显示一位朋友的专辑中的照片。

我认为这个程序使用facebook api 3次,所以可能有重点。 但我对事物没有任何想法,而不是这段代码。

  graph = Koala::Facebook::API.new(session[:access_token])
  freegraph = Koala::Facebook::API.new

  friends = graph.get_object("me/friends")
  friendsIds = Array.new
  friends.each do |f| friendsIds << f["id"] end
  fsinfo = freegraph.get_objects(friendsIds)

  @realFriends = Array.new
  fsinfo.each do |f|
    if f[1]["gender"].present? && (f[1]["gender"] != "male")
      @realFriends << f[1]
    end
  end

  rFids = @realFriends.map do |rF| rF["id"] end

  albums = graph.get_object("albums?ids="+rFids.join(","))
  album_ids = Array.new
  albums.each do |user|
     album_ids += user[1]["data"].map do |a| a["id"] end
  end

  randAlbumIds = Array.new
  20.times do
    randAlbumIds << album_ids.at(rand(album_ids.count))
  end

  imgList = graph.get_object("photos?ids="+randAlbumIds.join(","))
  imgObjs = Array.new
  imgList.each do |img|
    imgObjs += img[1]["data"]
  end
  if params[:tags].present?
    @photos = imgObjs.select do |i| i["tags"].present? end
  else
    @photos = imgObjs
  end

1 个答案:

答案 0 :(得分:3)

Facebook的拉动速度将变慢,这是一个给定的。您不希望在Rails HTTP请求中进行HTTP调用 - 也是给定的。因此,您需要将其移至后台进程或线程。

但是我更关心你的代码......你写了

 @realFriends = Array.new
  fsinfo.each do |f|
    if f[1]["gender"].present? && (f[1]["gender"] != "male")
      @realFriends << f[1]
    end
  end

  rFids = @realFriends.map do |rF| rF["id"] end

你正在寻找一系列女性朋友的想法。所以我会这样做:

@female_friend_ids = fsinfo.map {|friend| friend["id"] if friend.first["gender"] != "male"}.compact

这将返回一系列不是男性的朋友ID。地图将返回[nil,3435,656],并摆脱我们称之为紧凑的nils。

它可读,并且执行速度更快,并减少垃圾收集时间。

无法自拔。更!

randAlbumIds = Array.new
20.times do
  randAlbumIds << album_ids.at(rand(album_ids.count))
end

应该只是

random_album_ids = album_ids.shuffle.take(20)

(这一切只是Ruby非常棒)