2011-10-03 20 views
6

solo me pregunto cuando se trata solo del GET/POST básico. (es decir, algo tan simple como obtener el perfil de los usuarios y no algo complicado como obtener imágenes de cada álbum)Graph API vs FQL que es más rápido?

¿cuál es más rápido? Gráfico o FQL.

sé que FQL es más reciente que el gráfico, pero no está seguro si es más eficiente.

+0

no es realmente una respuesta, pero creo que la latencia de netwo rk es más importante, en comparación con la latencia del procesamiento de la CPU. Facebook debe tener una buena política de caché para acelerar las cosas. –

Respuesta

17

No es comparable de esta manera. Si bien puede obtener los mismos datos (en algunos casos) de ambos , sus intentos son completamente diferentes: FQL es un lenguaje de consulta, Graph es una API.

Llamando a consulta FQL si se utiliza JS nuevo SDK es un Graph API llama a sí mismo ...

Usted puede (y probablemente debería, si usted se preocupa comparación real y no la especulación teórica) comparar la velocidad de las llamadas que regresan misma datos, sino que debe tener en cuenta algunas cosas:

  • Graph API aún se chupa en condiciones de filtrado de datos y agregación de datos
  • FQL simplemente no puede proporcionar muchos de funcionalidad requerida en las aplicaciones de hoy en día (como Real-Time updates)
  • Graph API tiene una capacidad de batch llamadas, lo que puede acelerar mucho las cosas, esto también se puede utilizar para llamar a fql.query y fql.multiquery (de una manera algo engorrosa).
  • rocas Graph API de datos de filtrado con Field Expansion

Considere siguiente ejemplo de FQL documentation, sub consulta que obtiene toda la información de usuario para el usuario activo y amigos:

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

Esto simplemente no es posible lograr con una sola llamada Graph API. (ver la actualización)

Una vez que haya definido el subconjunto de datos deseado para obtener, puede elegir el método de recuperación apropiado en función de sus requisitos.

Por cierto, FQL es mucho mayor que el gráfico, tuvimos a un lado para FBML (RIP) y FBJS (RIP)

Actualización:

Graph API proporcionando camino para Batch Requests y especificando las dependencias entre las operaciones de la solicitud.Por ejemplo misma muestra como anteriormente se puede lograr en una sola llamada a 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" 
    } 
] 

Actualización 2:
Como de 30 de agosto API 2012 gráfico también se admite Field Expansion (muy potente) mecanismo como adicional de datos la recuperación (incluyendo datos anidados)

+0

Ese ejemplo es malo porque puede hacer eso con una llamada de gráfico. Pero aún bienes. Lo único que falta es que puede hacer solicitudes por lotes con API gráfica que puede ayudar con la velocidad en algunos casos. – bkaid

+0

Puede hacer eso con ** dos ** llamadas de gráficos, una para obtener la lista de id. De amigos y la segunda para devolver el conjunto de datos deseado. Estoy de acuerdo en que este ejemplo casi no tiene sentido en la vida real (el nombre y el ID del usuario actual es probablemente algo que ya tienes, a) nd pic_square se puede imitar con http://graph.facebook.com/USER_ID/picture?type= square) –

+0

Puede hacer llamadas de gráficos por lotes (hasta 50 llamadas de gráficos empacadas en una) que incluso pueden hacer referencia a los resultados de los demás. Muy cerca de multiquery, eh. De hecho, las llamadas de gráficos por lotes pueden incluir consultas FQL. https://developers.facebook.com/docs/reference/api/batch/ – nisc

3

me pasó una prueba simple (obtener el identificador de foto de portada) utilizando el SDK de PHP:

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

resultados:

gráfico API: 1,28320002556

API gráfica con FQL: 0,744100093842

FQL a través de la API REST: 0,544199943542

El FQL básica es mucho más rápido, el FQL través de la API gráfica está bien , pero la API api es demasiado lenta ... Y obtendrás un montón de cosas inútiles con el gráfico api

Cuestiones relacionadas