Tkrzw-RPCã®ã¯ã©ã¤ã¢ã³ããC++ãPythonãRubyãGoã§åºæã£ãã®ã§ãç°¡åãªæ§è½ãã¹ãããã¦ã¿ãã以ä¸ã¯1ã¹ã¬ããã®ã¹ã«ã¼ããããã°ã©ãã«ãããã®ã ãåä½ã¯QPSã
ãµã¼ãå´ã¯ãgRPCã®C++ã³ã¢ã©ã¤ãã©ãªã使ã£ã¦å®è£ ããã¦ãããåä½ç°å¢ã¯ i7-8550U 1.80GHzï¼4ã³ã¢ï¼ã®Linuxæ©ï¼ãã¼ãPCï¼ã ãæãã¹ã«ã¼ããããåºãã¨ãããè¨å®ã¨ãã¦ãéåæAPIã¢ã¼ãã使ããã³ã¢æ°ã«åããã¦4ã¤ã®ãã¥ã¼ã使ãããã«ãããã¯ã©ã¤ã¢ã³ãã¨ãµã¼ããåä¸ãã·ã³ã§åä½ãããã«ãããã»ã¹ã®ã¦ã¼ã¹ã±ã¼ã¹ãæ³å®ãããããã¯ã¼ã¯ã¤ã³ã¿ã¼ãã§ã¤ã¹ã«ã¯UNIXãã¡ã¤ã³ã½ã±ãããç¨ããã
$ tkrzw_server --address "unix:$HOME/sock" --async --threads 4
ã¯ã©ã¤ã¢ã³ãå´ã§ã¯ãåè¨èªã§åãä»æ§ã§å®è£ ããããã©ã¼ãã³ã¹æ¸¬å®ç¨ã®ã³ãã³ããç¨ãããã½ã¼ã¹ã¯ãã¡ãï¼C++ãPythonãRubyãGoï¼ãã覧ããã ããããåã«ã¡ãã»ã¼ã¸ãã¨ã³ã¼ããã¯ããEchoã¡ã½ããã¨ããã¼ã¿ãã¼ã¹ã«ã¬ã³ã¼ããè¨å®ããSetã¡ã½ããã¨ããã¼ã¿ãã¼ã¹ã®ã¬ã³ã¼ããæ¤ç´¢ããGetã¡ã½ãããããããã10ä¸åå®è¡ãã¦ããã®æéã測ããéç®ãã¦ã¹ã«ã¼ããããå°ããã¹ã¬ããæ°ã¯1ã2ã4ã¨å¤ãã¦å®è¡ãããã¯ã©ã¤ã¢ã³ãå´ã¯åæAPIãç¨ãã¦ããã
C++ : $ tkrzw_dbm_remote_perf sequence --address unix:$HOME/sock --iter 100000 --threads 1 Python : $ perf.py --address unix:$HOME/sock --iter 100000 --threads 1 Ruby : $ perf.rb --address unix:$HOME/sock --iter 100000 --threads 1 Go : $ perf --address unix:$HOME/sock --iter 100000 --threads 1
1ã¹ã¬ããã®ã¹ã«ã¼ãããã¯ä»¥ä¸ã
Echo | Get | Set | |
C++ | 26776 | 26269 | 24523 |
Python | 10258 | 9680 | 10181 |
Ruby | 11343 | 10802 | 10881 |
Go | 18394 | 17769 | 17926 |
2ã¹ã¬ããã®ã¹ã«ã¼ãããã¯ä»¥ä¸ã
Echo | Get | Set | |
C++ | 31165 | 30527 | 29906 |
Python | 14828 | 13672 | 13933 |
Ruby | 16597 | 15827 | 15594 |
Go | 27271 | 26609 | 25160 |
4ã¹ã¬ããã®ã¹ã«ã¼ãããã¯ä»¥ä¸ã
Echo | Get | Set | |
C++ | 35600 | 33070 | 32481 |
Python | 10705 | 9648 | 9360 |
Ruby | 15146 | 14420 | 14152 |
Go | 31963 | 30426 | 30734 |
ã¾ããEchoã¨Getã¨Setã®ã¹ã«ã¼ãããã¯ã»ã¨ãã©å¤ãããªããã¨ã確èªã§ãããã¤ã¾ãããµã¼ãå ã®ãã¼ã¿ãã¼ã¹å¨ãã®å¦çã¯ååã«é«éã§ãã»ã¨ãã©è² è·ãããã£ã¦ããªããã¤ã¾ãããµã¼ãå´ã®gRPC層ããããã¯ã¼ã¯å±¤ãã¯ã©ã¤ã¢ã³ãå´ã®gRPC層ãã¯ã©ã¤ã¢ã³ãã®ãã¸ãã¹ãã¸ãã¯ãè² è·ã®ã»ã¨ãã©ãå ããããã£ã¦ã以å¾ã®èå¯ã¯Echoã®çµæã ããè¦ãã°ãããã¨ã«ãªãã
1ã¹ã¬ããã®çµæãåè¨èªã§æ¯è¼ãããäºæ³éããC++ãæéã§ã次ç¹ãGoã ãRubyã¨Pythonã¯ã»ã¼åãã ãæãé ãPythonã§ã1ä¸QPSã¯åºãã®ã§ãã»ã¨ãã©ã®ã¦ã¼ã¹ã±ã¼ã¹ã§ã¯ããã«ããã¯ã«ãªããªãã ãããåæå¼ã³åºãã®ã¬ã¤ãã³ã·ã«æç®ããã°0.1ããªç§ã§ããã100åå¼ã³åºãã¦ã10ããªç§ããããããªãããªããçæéã«100åãå¼ã³ã ããªãããããバッチ呼び出しãããã ããã100ã¯ã¨ãªãããããããªããã¹ã«ã¼ãããã¯Echoã§70åãSetãGetã§ã20å以ä¸ã«ãªãã
4ã³ã¢ã®ãã·ã³ãªã®ã§ã並ååã«ããæ§è½åä¸ã¯2ã¹ã¬ãããããã§é æã¡ã«ãªããã¯ã©ã¤ã¢ã³ãå´ã¨ãµã¼ãå´ã®è² è·ãåããããã¨ä»®å®ããã¨ãã¯ã©ã¤ã¢ã³ãå´ã§2ã³ã¢ããµã¼ãå´ã§2ã³ã¢ã使ãåãã¨æ大å¹çã«ãªããPythonã¨Rubyã¯ã°ãã¼ãã«ã¤ã³ã¿ããªã¿ããã¯ï¼GILï¼ãåãã¦ããã®ã§ãPythonãRubyã§æ¸ãããå®è£ ã¯ä¸¦ååããªãããgRPCã®ã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªã®C++ã³ã¢å®è£ ã¯GILã®å¤ã§å¼ã°ããã®ã§ã並ååã®æ©æµãå¾ããã¦ãããGoã¯ä¸é¦¬è©éã並ååã®æ©æµãå¼·ãå¾ããã¦ãã¦ã4ã¹ã¬ããã§C++ã¨éè²ãªãæ§è½ã«ãªãã
çµè«ã¨ãã¦ã¯ãã©ã®è¨èªã§ã®å®è£ ãæ§è½ã«åé¡ã¯ãªãããã ããããããã«ãããã»ã¹ããã«ããã·ã³ã§ä¸¦åå¦çãåæ£å¦çããããªãããã®å¦çå 容èªä½ãããããéãã®ãæ®éã ããã®å ¥åãåºåããã¼ã¿ãã¼ã¹ãµã¼ãã§æ±ãã¨ãã¦ããã®ã¹ã«ã¼ãããã1ä¸QPSã§ããã°ãã¯ã©ã¤ã¢ã³ãå´ã§RPC層ãããã«ããã¯ã«ãªããã¨ã¯ãã¾ããªãã ããã
ããã§çæããããã®ã¯ããã®å®é¨ã¯ãåä¸ãã·ã³ã«ã¯ã©ã¤ã¢ã³ãã¨ãµã¼ããåå± ããã¦åããããã«ãããã»ã¹ãã¦ã¼ã¹ã±ã¼ã¹ã®å ¨ä½ã®ã¹ã«ã¼ãããã測ããã®ã§ãããå ¸åçãªã¯ã©ã¤ã¢ã³ãã»ãµã¼ãæ§æã«ããããµã¼ãå´ã®ã¹ã«ã¼ãããã測ããã®ã§ã¯ãªãã¨ãããã¨ã ãã¯ã©ã¤ã¢ã³ããåæ£ãã¦ããå ´åãã¯ã©ã¤ã¢ã³ãå´ã®RPCã®æ§è½ã¯åé¡ã«ãªããããµã¼ãå´ã®æ§è½ã®ã¿ãåé¡ã«ãªãããµã¼ãå´ã¯C++ã§æåã¨æãããå®è£ ããã¦ãããããã®éçæ§è½ãã©ãããããã¯ãå¥é測å®ããã°ãªããªãã