2011-10-03 31 views
6

chỉ cần tự hỏi khi nói đến GET/POST cơ bản. (ví dụ: đơn giản như nhận hồ sơ người dùng và không phải thứ gì đó phức tạp như chụp ảnh từ mọi album)API đồ thị so với FQL nhanh hơn?

nhanh hơn? Đồ thị hoặc FQL.

tôi biết FQL mới hơn đồ thị, nhưng không chắc liệu nó có hiệu quả hơn không.

+0

không thực sự là một câu trả lời, nhưng tôi nghĩ rằng độ trễ của netwo rk là mối quan tâm nhiều hơn, so với độ trễ của xử lý CPU. Facebook phải có chính sách bộ nhớ cache tốt để tăng tốc mọi thứ. –

Trả lời

17

Không thể so sánh được như thế này. Trong khi bạn có thể nhận được cùng một dữ liệu (trong một số trường hợp) từ cả hai ý định của chúng hoàn toàn khác nhau: FQL là ngôn ngữ truy vấn, Biểu đồ là một API.

Gọi để FQL truy vấn nếu sử dụng mới JS SDK là một API Graph gọi chính nó ...

Bạn có thể (và có lẽ nên, nếu bạn lo lắng về việc so sánh thực tế và suy đoán không lý thuyết) so sánh tốc độ của các cuộc gọi trở về cùng dữ liệu nhưng bạn nên đưa vào tài khoản một số điều:

  • Graph API vẫn hút tại điều kiện lọc dữ liệu và tập hợp dữ liệu
  • FQL chỉ không thể cung cấp cho bạn quá nhiều các chức năng cần thiết trong các ứng dụng hiện nay (như Real-Time updates)
  • API đồ thị có khả năng gọi là batch, có thể tăng tốc độ nhiều thứ, điều này cũng có thể được sử dụng để gọi fql.query và fql.multiquery (theo cách hơi cồng kềnh).
  • đá Graph API tại lọc dữ liệu với Field Expansion

xem xét sau đây ví dụ từ FQL documentation, subquery đó lấy về tất cả các thông tin người dùng cho người dùng tích cực và bạn bè:

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

này chỉ đơn giản là không thể đạt được với một lệnh gọi API Graph. (xem Cập nhật)

Khi bạn xác định tập con dữ liệu mong muốn để bạn có thể chọn phương thức truy xuất phù hợp dựa trên yêu cầu của bạn.

BTW, FQL là nhiều tuổi hơn Graph, chúng tôi đã có nó sang một bên để FBML (rip) và FBJS (rip)

Cập nhật:

Graph API cung cấp đường cho Batch Requests và xác định sự phụ thuộc giữa các hoạt động trong yêu cầu.Ví dụ cùng một mẫu như trên có thể đạt được trong một cuộc gọi duy nhất để lập biểu đồ 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" 
    } 
] 

Cập nhật 2:
Tính đến ngày 30 tháng 8 năm 2012 Graph API cũng được hỗ trợ Field Expansion như bổ sung (rất mạnh) cơ chế của dữ liệu thu hồi (bao gồm cả dữ liệu lồng nhau)

+0

Ví dụ đó là xấu bởi vì bạn có thể làm điều đó với một cuộc gọi đồ thị. Nhưng vẫn còn hàng hóa. Điều duy nhất còn thiếu là bạn có thể thực hiện các yêu cầu hàng loạt với api đồ thị có thể giúp với tốc độ trong một số trường hợp. – bkaid

+0

Bạn có thể thực hiện điều đó với ** hai ** cuộc gọi đồ thị, một để nhận danh sách id bạn bè và thứ hai để trả về tập dữ liệu mong muốn. Tôi đồng ý rằng ví dụ này gần như không có ý nghĩa trong cuộc sống thực (tên và id của người dùng hiện tại có lẽ là một cái gì đó bạn đã có, a) pic_square thứ hai có thể được bắt chước với http://graph.facebook.com/USER_ID/picture?type= square) –

+0

Bạn có thể thực hiện các cuộc gọi đồ thị theo lô (tối đa 50 cuộc gọi đồ thị được đóng gói thành một), thậm chí có thể tham chiếu đến kết quả của mỗi người khác. Khá gần với nhiều thứ, huh. Trong thực tế, các cuộc gọi lô đồ thị có thể bao gồm các truy vấn FQL. https://developers.facebook.com/docs/reference/api/batch/ – nisc

3

tôi chạy một thử nghiệm đơn giản (nhận được id bìa ảnh) bằng cách sử dụng PHP SDK:

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/>'; 
} 

Kết quả:

graph api: 1,28320002556

graph api với FQL: 0,744100093842

FQL qua phần còn lại api: 0,544199943542

Các FQL cơ bản được nhanh hơn nhiều, FQL qua graph api là ok , nhưng đồ thị api là waaay quá chậm ... Và bạn sẽ nhận được một loạt các công cụ vô dụng với các đồ thị api

Các vấn đề liên quan