2011-10-03 42 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