图形API与FQL的速度更快?

时间:2011-10-03 23:50:02

标签: facebook facebook-graph-api facebook-fql

只是想知道什么时候只需要基本的GET / POST。 (即获取用户个人资料的简单内容,而不是像从每张专辑中获取图片那样复杂的事情)

哪个更快? 图表或FQL。

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

2 个答案:

答案 0 :(得分:17)

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

如果使用新的JS SDK,则调用FQL查询是一个Graph API调用本身......

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

  • 图谱API在数据过滤条件和数据聚合
  • 时仍然很糟糕
  • FQL无法为您提供当今应用程序所需的太多功能(如Real-Time updates
  • Graph API具有batch次调用功能,这可能会加速很多事情,这也可以用来调用fql.query和fql.multiquery(有点麻烦)。
  • 图形API在使用Field Expansion
  • 进行数据过滤时失败

请考虑以下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比Graph早得多,我们把它放在FBML(rip)和FBJS(rip)之外

<强>更新

Graph APIBatch Requests提供方式并指定请求中的操作之间的依赖关系。例如,可以通过一次调用Graph 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日,Graph API还支持Field Expansion作为额外(非常强大的)数据检索机制(包括嵌套数据)

答案 1 :(得分: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/>';
}

结果:

  

graph api:1.28320002556

     

图表api与FQL:0.744100093842

     

FQL via rest api:0.544199943542

基本的FQL要快得多,通过图形api的FQL是可以的,但是图形api太慢了......你会得到一堆无用的图形api