2011-10-03 77 views
6

只是想知道什么时候谈到基本的GET/POST。 (即获得用户个人资料简单而不像从每张专辑中获取图片那样复杂)Graph API vs FQL哪个更快?

哪个更快? 图表或FQL。

我知道FQL比图更新,但不确定它是否更有效。

+0

不是一个真正的答案,但我认为netwo的延迟与CPU处理的延迟相比,rk更受关注。 Facebook必须有良好的缓存策略才能加快速度。 –

回答

17

这绝不是这样的可比性。虽然您可以从 中获得相同的数据(在某些情况下),但它们的意图完全不同:FQL是查询语言,Graph是API。

如果采用新的JS SDK是一套图形API调用本身调用到FQL查询......

可以(并且可能应该,如果你担心真正的比较,而不是理论推测)比较调用返回相同的速度数据,但是,你应该考虑一些事情:

  • 图形API仍然很烂的 数据过滤条件和数据
  • FQL只是不能提供太多的当今应用所需功能的 聚集(如Real-Time updates
  • 图形API有能力调用batch,这可能会加速很多事情,这也可以用来调用fql.query和fql.multiquery(有点麻烦)。在与Field Expansion

数据过滤

  • 图形API岩石考虑下面的例子FQL documentation,子查询获取活动用户和朋友的所有用户信息:

    SELECT uid, name, pic_square FROM user WHERE uid = me() 
    OR uid IN (SELECT uid2 FROM friend WHERE uid1 = me()) 
    

    这根本不可能实现只需一个Graph API调用。 (请参阅更新)

    一旦您定义了所需的数据子集,以便您可以根据您的要求选择合适的检索方法。

    BTW,FQL比图大年纪了,我们必须让它在一边FBML(RIP)和FBJS(RIP)

    更新:

    Graph APIBatch Requests提供方式和操作之间的指定依赖请求。例如相同的样品如以上可在单个呼叫来实现图形API

    POST https://graph.facebook.com/ 
    POST Data: 
    batch=[ 
        { 
        "method": "GET", 
        "name" : "get-friends", 
        "relative_url": "me/friends?fields=id", 
        }, 
        { 
        "method": "GET", 
        "relative_url": "?ids={result=get-friends:$.data.*.id}&fields=id,name,picture" 
        } 
    ] 
    

    更新2:
    截至2012年8月30日图形API也支持Field Expansion作为附加(非常强大的)数据的机制检索(包括嵌套数据)

  • +0

    这个例子不好,因为你可以用图形调用来做到这一点。但仍然是货物。唯一缺少的是您可以使用图形API进行批量请求,这可以在某些情况下提高速度。 – bkaid

    +0

    您可以通过**两个**图表调用,一个获取朋友ID列表,第二个返回所需的数据集。我同意这个例子在现实生活中几乎没有意义(当前用户的名字和ID可能是你已经拥有的东西,a)nd pic_square可以模仿http://graph.facebook.com/USER_ID/picture?type=正方形) –

    +0

    您可以执行批处理图形调用(最多可将50个图形调用合并为一个),甚至可以引用其他每个结果。非常接近multiquery,呵呵。实际上,批处理图形调用可以包括FQL查询。 https://developers.facebook.com/docs/reference/api/batch/ – nisc

    3

    我跑使用PHP SDK一个简单的测试(获得封面照片ID):

    public $microtime_start = 0; 
    
    public function getExecutionTime() { 
        return round(microtime(true) - $this->microtime_start, 4); 
    } 
    
    public function getFQL($request, $filter = true, $multiFilter = true) { 
        if(is_array($request)) { 
         $query = '{'; 
         foreach ($request as $key => $q) { 
          $query .= '"'.urlencode($key).'":"'.urlencode(addslashes($q)).'",'; 
         } 
         $query = substr($query, 0, -1).'}'; 
         $data = $this->callAPI('/fql?q=' . $query); 
         if($filter) { 
          $data = $data['data']; 
          if($multiFilter) { 
           $data = $data[count($data)-1]['fql_result_set']; 
          } 
          return $data; 
         } 
        } else { 
         $data = $this->callAPI('/fql?q=' . urlencode($request)); 
         if($filter) { 
          return $data['data']; 
         } 
        } 
    } 
    
    public function callAPI($path) { 
        $params = array('access_token' => $this->getAccessToken()); 
        return $this->api($path, 'GET', $params); 
    } 
    
    public function getCoverPhotoId($uid) { 
        $time = $this->getExecutionTime(); 
    
        $albums = $this->api("/me/albums"); 
        $album_id = ""; 
        foreach ($albums["data"] as $item) { 
         if ($item["name"] == "Cover Photos") { 
          $album_id = $item["id"]; 
          $profile_picture_id = $item["cover_photo"]; 
          break; 
         } 
        } 
        $time2 = $this->getExecutionTime(); 
        echo 'graph api: '.($time2 - $time).'<br/>'; 
    
        $data = $this->getFQL(array(
         'query1' => 'SELECT cover_object_id FROM album WHERE owner = ' . $uid.' AND name = "Cover Photos"' 
        )); 
        $time3 = $this->getExecutionTime(); 
        echo 'graph api with FQL: '.($time3 - $time2).'<br/>'; 
    
        $data = $this->api(
          array(
           'method' => 'fql.query', 
           'query' => 'SELECT cover_object_id FROM album WHERE owner = ' . $uid.' AND name = "Cover Photos"' 
          ) 
        ); 
    
        $time4 = $this->getExecutionTime(); 
        echo 'FQL via rest api: '.($time4 - $time3).'<br/>'; 
    } 
    

    结果:

    图形API:1.28320002556

    与FQL图形API:0.544199943542

    基本FQL快得多,通过图形API的FQL是确定的:0.744100093842

    通过REST API FQL ,但图api waaay太慢...而你会得到一堆无用的东西与图api