

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將查詢以位元碼形式而非字串形式傳送至伺服器
<a name="best-practices-gremlin-java-bytecode"></a>

在以下情況提交查詢時，使用位元碼來取代字串具有優勢：
+ **早期擷取無效的查詢語法：**使用位元碼變體可讓您在編譯階段偵測無效的查詢語法。如果您使用字串變體，直到查詢送至伺服器之前都無法發現無效的語法，此時會傳回錯誤。
+ **避免字串效能負面影響：**無論使用 WebSocket 或 HTTP，任何字串查詢提交都會產生分離頂點，這表示 Vertex 物件包含 ID、標籤以及與 Vertex 關聯的所有屬性 (請參閱[元素屬性](http://tinkerpop.apache.org/docs/current/reference/#_properties_of_elements))。

  在不需要屬性的情況下，這可能會導致伺服器上不必要的運算。例如，如果客戶想要使用查詢 `g.V("hakuna#1")` 取得 ID 為「hakuna\$11」的頂點。如果查詢以字串提交傳送出去，伺服器需花時間擷取 ID、標籤以及與此頂點關聯的所有屬性。如果查詢以位元碼提交傳送出去，伺服器只需花費擷取頂點 ID 和標籤的時間。

換言之，與其提交這種查詢：

```
  final Cluster cluster = Cluster.build("localhost")
                                 .port(8182)
                                 .maxInProcessPerConnection(32)
                                 .maxSimultaneousUsagePerConnection(32)
                                 .serializer(Serializers.GRAPHBINARY_V1D0)
                                 .create();

  try {
      final Client client = cluster.connect();
      List<Result> results = client.submit("g.V().has('name','pumba').out('friendOf').id()").all().get();
      System.out.println(verticesWithNamePumba);
  } finally {
      cluster.close();
  }
```

不如使用位元碼提交查詢，如下所示：

```
  final Cluster cluster = Cluster.build("localhost")
                                 .port(8182)
                                 .maxInProcessPerConnection(32)
                                 .maxSimultaneousUsagePerConnection(32)
                                 .serializer(Serializers.GRAPHBINARY_V1D0)
                                 .create();

  try {
      final GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using(cluster));
      List<Object> verticesWithNamePumba = g.V().has("name", "pumba").out("friendOf").id().toList();
      System.out.println(verticesWithNamePumba);
  } finally {
      cluster.close();
  }
```