API Graph против FQL, который быстрее? - PullRequest
6 голосов
/ 04 октября 2011

просто интересно, когда дело доходит до базового GET / POST. (т.е. что-то простое, например, получение профиля пользователя, а не что-то сложное, например, получение фотографий из каждого альбома)

что быстрее? График или FQL.

я знаю, что FQL новее графа, но не уверен, что он более эффективен.

Ответы [ 2 ]

17 голосов
/ 04 октября 2011

Это никоим образом не сравнимо. Хотя вы можете получить те же данные (в некоторых случаях) из обоих их цели совершенно разные: FQL - это язык запросов, Graph - это API.

Вызов FQL-запроса, если используется новый JS SDK, сам по себе вызов API Graph ...

Вы можете (и, вероятно, должны, если вы беспокоитесь о реальном сравнении, а не о теоретических предположениях), сравнивать скорость вызовов, возвращающих одни и те же данные, но вы должны принять во внимание некоторые вещи:

  • API Graph по-прежнему отстой при условиях фильтрации данных и агрегировании данных
  • FQL просто не может предоставить вам слишком много функциональности, необходимой в современных приложениях (например, Обновления в реальном времени )
  • Graph API имеет возможность пакетных вызовов, что может значительно ускорить процесс, это также может быть использовано для вызова fql.query и fql.multiquery (немного громоздким способом).
  • График API порождает при фильтрации данных с Field Expansion

Рассмотрим следующий пример из документации по FQL , подзапрос, извлекающий всю пользовательскую информацию для активного пользователя и друзей:

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

Этого просто невозможно достичь с помощью одного вызова API Graph. (см. Обновление)

Как только вы определите желаемое подмножество данных для получения, вы можете выбрать подходящий метод поиска в зависимости от ваших требований.

Кстати, FQL намного старше, чем Graph, мы оставили его в стороне от FBML (rip) и FBJS (rip)

Обновление:

График API , предоставляющий путь для Пакетных запросов и определяющий зависимости между операциями в запросе. Например, тот же пример, что и выше, можно получить за один вызов 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:
По состоянию на 30 августа 2012 года Graph API также поддерживает Расширение поля в качестве дополнительного (очень мощного) механизма поиска данных (включая вложенные данные)

3 голосов
/ 19 марта 2012

Я провел простой тест (получение идентификатора обложки) с использованием 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/>';
}

Результаты:

График API: 1.28320002556

график API с FQL: 0,744100093842

FQL через остальные API: 0,544199943542

Базовый FQL намного быстрее, FQL с помощью API api в порядке, но API apiaa слишком медленный ... А с графиком API вы получите кучу бесполезных вещей

...