ãã¼ã¿ãã¼ã¹ã©ã¤ãã©ãªTkrzwã®gRPCãµã¼ãã¹ã«Javaã§æ¥ç¶ãã¦æä½ããããã®ã©ã¤ãã©ãªãå®è£
ãããããã«ã¦ãå½åäºå®ãã¦ããC++ãJavaãPythonãRubyãGoã®å
¨ã¦ã網ç¾
ããã®ã§ãgRPCã®ã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªãæ¸ãã¾ããæ
ã¯çµäºã ããã®è¨äºã§ã¯ãç°¡åãªä½¿ãæ¹ã¨æ§è½è©ä¾¡ãç´¹ä»ãããEchoæä½ã®çµæã1ã2ã4ã¹ã¬ããã§å¤ãã¦ã¹ã«ã¼ãããã測å®ããå ´åã®çµæã¯ä»¥ä¸ã®ããã«ãªãã
前回の記事ã«ã¦ãgRPCã®Javaã¢ããªã±ã¼ã·ã§ã³ãæåã§ãã«ãããæé ã確ç«ããããã¨ã¯ãããMakefileã§èªååããã°ããã±ã¼ã¸ãä½ãããgRPCã®ä¾åããã±ã¼ã¸ã¯ãã¤ããªããã±ã¼ã¸ããã¤ã³ã¹ãã¼ã«ããã®ã楽ã ãUbuntuã®å ´åãaptã§ä»¥ä¸ã®ããã±ã¼ã¸ãå ¥ããã°ããã
- libprotobuf-java
- libgrpc-java
- protobuf-compiler-grpc-java-plugin
- libgoogle-common-protos-java
- libguava-java
- libnetty-java
- libperfmark-java
ãµã¼ããåããã·ã¹ãã ã«ã¯ãTkrzwã¨Tkrzw-RPCãã¤ã³ã¹ãã¼ã«ããå¿ è¦ããããã¯ã©ã¤ã¢ã³ãå´ã®ã·ã¹ãã ã«ã¯å¿ ãããTkrzwã¨Tkrzw-RPCãã¤ã³ã¹ãã¼ã«ããå¿ è¦ã¯ãªããã¨ã¯ããä»åã¯ãµã¼ãã¨çµã¿åããã¦ãã¹ãããã®ã§ãTkrzwã¨Tkrzw-RPCã¯ã¤ã³ã¹ãã¼ã«ãã¦ãããã®ã¨ãããããããã½ã¼ã¹ããã±ã¼ã¸ãè½ã¨ãã¦ãmake && make install ããã°å ¥ãã¯ãã ãã¯ã©ã¤ã¢ã³ãã§å´ã¯ãä¸è¿°ã®ä¾åããã±ã¼ã¸ãå ¥ããä¸ã§ãTkrzw-RPCã®Javaããã±ã¼ã¸ã make && make install ããã°ããã
Tkrzw-RPCã®ãµã¼ãã¯ä»¥ä¸ã®ã³ãã³ãã§èµ·åã§ãããããã©ã«ãã§ã¯ããªã³ã¡ã¢ãªã®ãã¼ã¿ãã¼ã¹ãèµ·åããããããã°ãã°ã表示ããããã«ãããã
$ tkrzr_server --log_level debug
Javaã®æãç°¡åãªã¯ã©ã¤ã¢ã³ãã¢ããªã±ã¼ã·ã§ã³ã¯ã以ä¸ã®ãããªã³ã¼ãã«ãªãããã¼ã«ã«ã®Tkrzwã§ã¯DBMã¯ã©ã¹ã使ã£ã¦ãããããã®ä»£ããã«RemoteDBMã¯ã©ã¹ãç¨ãããã¾ãããã¡ã¤ã«ãéãããéãããããopen/closeã¡ã½ããã®ä»£ããã«ãããã¯ã¼ã¯ã³ãã¯ã·ã§ã³ãéãããéãããããconnect/disconnectã¡ã½ãããç¨ããããã以å¤ã®APIã¯ã»ã¨ãã©ãã¼ã«ã«ã¨åãã§ããã
// Tkrzw-RPCã®ã·ã³ãã«ãã¤ã³ãã¼ããã import tkrzw_rpc.*; public class Example1 { // ã¡ã¤ã³é¢æ° public static void main(String[] args) { // ãã¼ã¿ãã¼ã¹ãµã¼ãã¸ã®æ¥ç¶ãæºåãã RemoteDBM dbm = new RemoteDBM(); dbm.connect("localhost:1978", -1); // ã¬ã³ã¼ããæ ¼ç´ãã // ãã¼ã¨å¤ã¯æååã§æå®ã§ãããããã¤ãåã¨ãã¦æ ¼ç´ãããã dbm.set("first", "hop"); dbm.set("second", "step"); dbm.set("third", "jump"); // ã¬ã³ã¼ããæ¤ç´¢ãã // æ¤ç´¢ã«å¤±æããå ´åãnullãè¿ããã System.out.println(dbm.get("first")); System.out.println(dbm.get("second")); System.out.println(dbm.get("third")); System.out.println(dbm.get("fourth")); // ãã¼ã¿ãã¼ã¹å ã®åã¬ã³ã¼ãã«æ¨ªæçã«ã¢ã¯ã»ã¹ãã // ä½ã£ãã¤ãã¬ã¼ã¿ã¯destructã§ç ´æ£ããã㨠Iterator iter = dbm.makeIterator(); iter.first(); while (true) { String[] record = iter.getString(); if (record == null) { break; } System.out.println(record[0] + ": " + record[1]); iter.next(); } iter.destruct(); // ãã¼ã¿ãã¼ã¹æ¥ç¶ãç ´æ£ãã dbm.disconnect(); dbm.destruct(); } }
ç´°ãããã¨ã¯Java版のAPI文書ãã覧ããã ãããã以前の記事ãåèã«ããã°ãã¡ãã»ã¼ã¸ãã¥ã¼ã¨ãã¦ã使ããã
以前やったベンチマークテストã«Javaçã®çµæãå ããããEchoãSetãGetã®åæä½ã10ä¸åè¡ãããã®ã¹ã«ã¼ãããã測ããJavaçã¯UNIXãã¡ã¤ã³ã½ã±ããããµãã¼ããã¦ããªãã®ã§ãå ¨è¨èªã§IPv4ã使ã£ã¦æ¸¬å®ããªãããã
1ã¹ã¬ããã®ã¹ã«ã¼ãããã¯ä»¥ä¸ã
Echo | Get | Set | |
C++ | 20389 | 21111 | 20936 |
Java | 17512 | 16786 | 16504 |
Python | 9748 | 9300 | 9341 |
Ruby | 11556 | 11476 | 11266 |
Go | 14262 | 14148 | 14200 |
2ã¹ã¬ããã®ã¹ã«ã¼ãããã¯ä»¥ä¸ã
Echo | Get | Set | |
C++ | 28025 | 27861 | 27800 |
Java | 24830 | 23752 | 23969 |
Python | 13160 | 12643 | 12319 |
Ruby | 16752 | 16249 | 16128 |
Go | 22670 | 22375 | 22420 |
4ã¹ã¬ããã®ã¹ã«ã¼ãããã¯ä»¥ä¸ã
Echo | Get | Set | |
C++ | 34542 | 34399 | 34859 |
Java | 34806 | 33169 | 33259 |
Python | 10689 | 10307 | 10115 |
Ruby | 15623 | 15287 | 14954 |
Go | 32366 | 32250 | 32284 |
Echoã®çµæã«çç®ããã°ãããã¯Tkrzw-RPCã®ãã³ããã¼ã¯ã¨ãããããç´ ã®gRPCã®ãã³ããã¼ã¯ã¨ã¿ãªããã¨ãã§ãããã¨ãããã¨ã§ãgRPCã®ã¯ã©ã¤ã¢ã³ãã§C++ã«æ¬¡ãã§é«éãªã®ã¯Javaã¨ãããã¨ã«ãªã£ãã4ã¹ã¬ãã並åã«ããã¨æ§è½ã¯C++ã¨ã»ã¼åãã«ãªããã¨ã¯ãããä½åº¦ãè¿°ã¹ã¦ãããã¨ã ããã¯ã©ã¤ã¢ã³ãå´ã¯ãã·ã³ã®å°æ°ãå¢ããã¦ã¹ã«ã¼ããããä¸ãããããã¨ãå¤ãã®ã§ããã®çµæãæ°ã«ããå¿ è¦ã¯ãã¾ããªãããµã¼ãå´ã¯C++ã§å®è£ ãã¦ã¹ã«ã¼ããããæ大åãã¤ã¤ãã¯ã©ã¤ã¢ã³ãå´ã§ã¯å¤ãã®è¨èªããµãã¼ããã¦ã¤ã³ã¿ã¼ãªãã©ããªãã£ãåä¸ããããã¨ãéè¦ã ã