karino2 ã 並åããã°ã©ã ããè¦ãFuture ã¨ãããããªãä½ã£ã¦å ¬éãã¦ããã®ã§ãå¼ã£è¶ãã®è·é ããããªããçºããã
é·ãã®ã§ããã«ãã£ããã¨ãã主張ãã¾ã¨ããã¨:
- Future/Promise (ããã³ãã®å¾éã® async/await) ã¯éåæããã°ã©ãã³ã°ã§ callback hell ã«ãªããªãçºæã¨ããè¦æ¹ãããã¦ãããã ãããããªã callback hell ãå¿ è¦ã ã£ããã®æä»£èæ¯ãååã«çè§£ããã¦ããªãã
- èæ¯ã®ä¸ã¤ã¯ãã©ã¦ã¶ JavaScript ã®ããã°ã©ãã³ã°ã¢ãã«ã«ã·ã³ã°ã«ã¹ã¬ããã»ãã³ããããã³ã°(ã¤ãã³ãã«ã¼ã)ã¨ããå¶éããã£ãããã ããã¯(ç¹ã«ããã³ãã¨ã³ãéçºè ã®éã§ã¯)ããçè§£ããã¦ããã
- ããä¸ã¤ã®è¦ç¹ã¯ SEDA ã¿ãããªãã«ãã¹ã¬ããã»ãã³ããããã³ã°ç°å¢ã®å¿ è¦æ§ã§ã ãã£ã¡ã¯ãã¾ãã¡åºãçè§£ããã¦ããªãããã«æããã
- çµæã¨ãã¦ãµã¼ãããã¹ã¯ããããªã©ã§ C++ (ãªãã§?) ãæ¸ãã¦ããããã°ã©ãã« Future/Promise ã®éè¦æ§ã説æããè¯ãè³æããªãã ãªã Twitter ã Finable ãã Facebook ã Folly Future ãã Netflix ã ReactiveX ãã Apple ã Dispatch ãã Google ã ListenableFuture ã (ä¸åã ãããµãã®ãæ··ãã£ã¦ãã!) æã£ã¦ããã®ããä¼ãããªãã
ã®ã§ä¿ºã説æãã¦ããããã¨ããå 容ã
ãããããã¨ã«å¤§ããªç°è«ã¯ãªãã®ã ããã©ã å ã®ãããªã¯æºåä¸è¶³ãªã®ãè²ã ãããã«ããé¨åããã£ã¦è°è«ãç¶ããã®ãé£ããã ããã§ã¾ãã¯è©±ãæ´çãããã®ãã¨ä»äºã®ã³ã¼ãã¨ãã ã¨å®éã©ããªãã§ããã¨äººã ã«èãã¦ã¿ãåã§ãã
20 å¹´åã®ãã¹ã¯ããã: ã¹ã¬ããã¯éã«ä½ããUI ã¹ã¬ããã¯ãããã¯ããã
ã¨ããããã§ãã£ããã®æè©±ããå§ã¾ãã®ã ãã»ã»ã»ã
ã¹ã¬ããã®ä½¿ãæ¹ã¨ããç¹ã§ãã¡ã°ããããããªãä¾ãè¦ãã«ã¯ã15-25 å¹´ãããåã®ãã¹ã¯ãããã¢ããªãè¦ãã¨è¯ãã ãã®ä¸çã§ã¯ã¿ããªåºæ¬çã«ã·ã³ã°ã«ã¹ã¬ããã§ã³ã¼ããæ¸ãã¦ããã ã®ã¿ãªãããUI ã¹ã¬ããããããã¯ããªãã¨ããç¾ä»£ã®å¸¸èãããã¾ãå®ããã¦ããªãã 容赦ãªããã¤ã¢ãã°ããã¯ã¹ã¨ãã表示ã㦠UI ã¹ã¬ãããæ¢ããã å³å¯ã«ãã㨠UI ã¹ã¬ãã (ã¤ãã³ãã«ã¼ã) ã¯æ¢ã¾ã£ã¦ãããããããã«ãã¹ããã¦ããã ãã ç´°ãããã¨ãªã®ã§ãããã¯ãã¦ããã¨æã£ã¦ããã°ã ããããã£ã¦ãã
éåæãªã¯ãã® JavaScript ã®ä¸çã§ alert() ã¨ãããããã¯ããã®ã¯ã
ããããããã°ã©ãã³ã°ã¢ãã«ãåæã¨ãããã¹ã¯ããã OS ã® API ã使ã£ã¦å®è£
ããã¦ããããã
(éã«ããããåæãæ¨ã¦ãã¢ãã³ãã©ã¦ã¶ã®å®è£
ãã¿ã㨠alert() ãã¯ããã¨ãã blocking call å¨è¾ºã¯ããªãã® mess ã«ãªã£ã¦ããã)
20 å¹´ãããã® PC ãé«ããã¤ã 㨠CPU 㯠2-4 ã³ã¢ããããã£ãã®ã§ã ãããæéã®ãããè¨ç®ã¯ã¹ã¬ãããä½ã£ã¦ä¸¦ååããã¦ããã ãã ã¹ã¬ããã®ä½¿ãæ¹ã¯ã¢ãããã¯ãå¿ è¦ãªã¨ãã«æ°ããã¹ã¬ãããæ¬²ããã ãä½ã£ã¦ãã¿ã¹ã¯ãåããã¦ãããã¾ãã
åæä»£ã®ãµã¼ããµã¤ã: 1 ãªã¯ã¨ã¹ã 1 ã¹ã¬ãã
åãæä»£ãWeb ãµã¼ãã®ãããªãµã¼ããµã¤ãã®ã½ããã¦ã§ã¢ãåãããã«ç´ æ´ã ã£ãã
ã¯ã©ã¤ã¢ã³ãã®ãªã¯ã¨ã¹ãã accept() ããã¹ã¬ããããã¦ããã®ã¹ã¬ããããªã¯ã¨ã¹ããåãåããã³ã«æ°ããã¹ã¬ãããä½ãã
ã½ã±ãããæ¸¡ãã¦å¦çãä»»ããã
ã½ã±ããå
¥éã¿ãããªè¨äºã¯ä»ã§ããããã説æããããã¨ãå¤ãã¨æãã
æ¦å¿µçã«ãããããããããã
ãã ç¾å®ã®ãµã¼ãã¼ã§ãªã¯ã¨ã¹ãåä½ã«æ°ããã¹ã¬ãããä½ãã¨ãªã¼ãã¼ããããã§ãããªã©è²ã ã¨é½åãæªãã®ã§ã ä¸åº¦ä½ã£ãã¹ã¬ããã¯ä½¿ãã¾ããã®ãæ®éã ã¹ã¬ãããã¼ã«ã¨ãããã¤ã ãã®ãé½åã®æªãããããªã¼ãã¼ãããã㯠karino2 ã®è°è«ã§éè¦ãªãããã¯ãªã®ã ããã©ã ä»ã¯ã¹ã«ã¼ãã¦å ã«é²ããã
ãã³ããããã³ã°ãµã¼ã: ã·ã³ã°ã«ã¹ã¬ãã
ãªã¯ã¨ã¹ãåä½ã§ã¹ã¬ãããã¤ããã¢ããã¼ãã®å¯¾æ¥µã«ãä¸ã¤ã®ã¹ã¬ããã§å
¨ã¦ã®ãªã¯ã¨ã¹ãããã°ãã¢ããã¼ããããã
ãããããµã¼ãã¯ãã³ããããã³ã° I/O ã® API, å¤ãã¨ããã 㨠select() ã¨ããã使ã£ã¦æ¸ããã¦ããã
ããã ã¨ã¹ã¬ãããä¸åãããªãã®ã§ãã¹ã¬ãããæ²¢å±±ã¤ããããªã¼ãã¼ããããããªãã
ãã®ããªã¼ãã¼ããããããªããªã®ãã¯ãã¯ãè°è«ã®ä½å°ããããã ã·ã³ã°ã«ã¹ã¬ããã»ãã³ããããã³ã°ãªãµã¼ãã§ã¯ããããã¹ã¬ãããä¸ã¤ãããªãã®ã§æ°ã«ããªãã¦ããã ãªã¼ãã¼ãããã®å°ãªãã並åããã°ã©ãã³ã°ã®é£ããï¼ããã¯ã¨ãï¼ãé¿ãããããã種ã®åç´ãããã£ã¦ã ç¹ã«ã³ãã¯ã·ã§ã³ã®å¯¿å½ãé·ããã£ããã¿ãããªã¢ããªã®ãµã¼ãã¨ãã¦ä¼çµ±çã«å²ã¨äººæ°ã
䏿¹ã§ãã«ãã³ã¢ã® CPU ã§ã¯ï¼ã¤ç®ä»¥éã®ã³ã¢ã使ãåããªãæ¬ ç¹ãããããã®ã¸ãã¯å·¥å¤«ãè¦ããã
ããã°ããµã¼ã: SEDA
ãªã¯ã¨ã¹ãåä½ã§ã¹ã¬ãããä½ããã·ã³ã°ã«ã¹ã¬ãããã ä¸ã§è°è«ãããã®ãã¬ã¼ããªãã¯ã©ãèãã¦ãéããã§ã å®éã¯ãã³ããããã³ã°ã ãã©ãã«ãã¹ã¬ããã«ã§ããã®ãæã¾ããã ããããå®è£ ã¯è²ã ããããä¸ã§ã SEDA ã¨ãã 2001 å¹´ã®ç ç©¶ãæåã ã¨æãã SEDA 㯠I/O ãå¾ ã¤ã¡ã¤ã³ã¹ã¬ãããã¯ã¼ã«ã¼ãå ¨é¨ãã³ããããã³ã°ã«ãã¦ã¡ãã»ã¼ã¸ãã¥ã¼ã§ããåãããã å ·ä½çã«ã¯ã¿ã¹ã¯ (“Stage”) æ¯ã«ã¹ã¬ãããã¼ã«ãä½ãããã®ã¹ã¬ãããã¼ã«å士ãã¡ãã»ã¼ã¸ãã¥ã¼ã§ç¹ãã ãã³ããããã³ã°ã«ã§ããªãå¦ç(Linux ã ã¨ãã¡ã¤ã«ã®èªã¿æ¸ãã¨ã)ã¯ãããããã³ã°å°ç¨ã®ã¹ã¬ãããã¼ã«ãã¤ãã£ã¦éãè¾¼ããã
ã¹ãã¼ã¸éã®éä¿¡ã«ä½¿ããã¥ã¼ã«å°ç´°å·¥ãããã¨ã§ã徿¥ãªã OS ã®ã¹ã±ã¸ã¥ã¼ã©ãããã£ã¦ããä»äºã®ä¸é¨ã ã¢ããªã±ã¼ã·ã§ã³ã§å®è£ ã§ããããã«ãªãããããã§ OS ã®å¶éãããªãã¡ãªã¼ãã¼ããããé¿ãããããã ã¹ã±ã¸ã¥ã¼ãªã³ã°ã«ã¢ããªã®é½åãå å³ã§ãããã ããè¯ãã ããã SEDA ã®ä¸»å¼µ (ãããªãéã«è§£éãããã®) ã§ããã
ã¹ã¬ããæ° = ã³ã¢æ°
SEDA ã®ãã¶ã¤ã³ã¯ãããæå³ã§ã¯ç¾å¨ã§ãå²ã¨çãå»¶ã³ã¦ããã ã¤ã¾ããç¨éã«å¿ããã¹ã¬ãããã¼ã«ãäºåã«ç¨æããã¢ããªã±ã¼ã·ã§ã³ã®ã³ã¼ãã¯ã¿ãªã§ããã使ãã ããããã³ã°ã³ã¼ã«ã¯é æ ®ããã
SEDA ã§ã¯è¤æ°ã®ã¹ã¬ãããã¼ã«ãã¤ããã¹ã«ã¼ãããã調æ´ãã¦ããããããã¾ã§ããã°ãã±ã¼ã¹ã¯å°ãªãã CPU ã®ã³ã¢æ°ã¶ãã ãã¹ã¬ãããããããã©ã«ãã®ã¹ã¬ãããã¼ã«ãã²ã¨ã¤ã ãç¨æããã»ããæ®éã ãã¾ãã§ãã¡ã¤ã«æä½ã®ãããªããããã³ã° IO ç¨ã®ã¹ã¬ãããã¼ã«ãã¤ãã¦ããå ´åãããã Kotlin ã® Dispatchers, RxJava ã® Schedulers, Tokio, GOMAXPROCS, ãªã©ãªã©ã
ããã°ããã¹ã¯ãããã¢ããª
karino2 ã®ãããªã§ã¯ãäºåã¼ã年代ä¸ç¤ã®å·¨å¤§ãª Windows ã¢ããªã®éçºãåæ§ã®åé¡ï¼OS ã¹ã¬ããã®ã¹ã±ã¼ã©ããªãã£ä¸è¶³ï¼ã«ã¶ã¤ããã åæ§ã®è§£æ±ºã«è³ã£ãçµç·¯ãç´¹ä»ãã¦ãããããªãã¡ã³ã¢æ°ã«ããããã¹ã¬ãããã¼ã«ãã¤ãã£ã¦ãã³ããããã³ã°ã«ããã°ãã
ã¼ã年代ã®ä¸ã®ä¸ã¯å²ã¨ã¦ã§ãå ¨çã§ãã¯ã©ã¤ã¢ã³ããµã¤ãã¨ãããããã³ãã¨ã³ãã®äººã 㯠å¤ããã·ã³ã°ã«ã¹ã¬ãããªãã©ã¦ã¶ã® JS ã§æ®ããã¦ãããããã©ãã¹ã¯ããããã¤ãã£ãå¢ã¯ããã°ã£ã¦ãããããã è¨ããã¦ã¿ã㨠C# 㯠async/await ãã¡ã¤ã³ã¹ããªã¼ã ã«ãã£ã¦ããæåã®è¨èªã ãã RX(Reactive Extension) ã Microsoft çã¾ãã Windows ã¯è²ã ãã£ã¦ããã®ã ããã
ãã³ããããã³ã°ã»ã¹ã¬ãããã¼ã«ã¨ããåæ
ãããã¦ãã«ãã³ã¢ç°å¢ã§ã®é«æ§è½ãé«ä¸¦åã¢ããªã±ã¼ã·ã§ã³ã®å®è¡ã¢ãã«ã¯ã ãããåæãã§ãã: OS ã®ã¹ã¬ããã¯ã³ã¢æ°ã¶ãã ãããã¤ããããã¹ã±ã¸ã¥ã¼ãªã³ã°ã¨ãã¯ã¦ã¼ã¶ç©ºéã§ããã°ããã§ã¯ãªããã
ãã¡ãã OS èªä½ãé²åãã¦ãããæã®ããªã¼ãã¼ããããã®å¸¸èã¯å½ã¦ã¯ã¾ããªãã ãã¨ãã° SEDA ã®æ¸ããã 2001 å¹´ã« Linux CFS ã¯ãªãã£ãã (Wikipedia ã«ããã° 2010 å¹´ãããã«æå¹åããããããã) ãããªã¢ãã³å®è£ OS ã®ã¹ã¬ããã«é ¼ã£ã¦ã°ãã°ãããããã³ã°ã³ã¼ã«ãããä½ã人ã ãããã ãã¨ã Hadoop ã®ãããªããã忣ã³ã³ãã¥ã¼ãã£ã³ã°ã¯ã¹ã¬ãããããããããã¤ããå°è±¡ã ä¼çµ±çãªãã¼ã¿ãã¼ã¹ã®å®è£ ãå²ã¨ OS ã®ã¹ã¬ããã ã®ã¿ãªæ°ãããã ãã¡ã¤ã« I/O ããããã¯ããã¨ãã«éåæã¨ãè¨ããã¦ãããããããªãããã ãããã
ãããªããã§ããã³ããããã³ã°ã»ã¹ã¬ãããã¼ã«ããå¯ä¸ã®æ£è§£ã¨ããããã§ã¯ãªãã ã¨ã¯ããã¡ã¤ã³ã¹ããªã¼ã ã®ä¸ã¤ã«ãªã£ãã®ã¯ééããªãã ããã°ã©ãã³ã°ã»ãããã«ã«ãã£ã¼ã§ã¯ “Reactive” ã¨ããå¼ã³åãç²å¾ããã å³å¯ã« Reactive ããªããªã®ãã«ã¯è²ã è°è«ã®ä½å°ãããããã©ãè¿ä¼¼ã¨ãã¦ã¯ãã£ã¦ãã¨æãã
ããããæ½è±¡ãæ±ãã¦
ãã³ããããã³ã°ã®ã³ã¼ãã髿§è½ãªã®ã¯ããããã©æ¸ãã®ãã ãã¶ãã£ãããåé¡ããã£ãã ãã£ãããã®ä»£è¡¨ä¾ã¨ãã¦ã¯ JS ã® calback hell ãããç¥ããã¦ããã ã§ã JS ã®ããã« first class function ãããè¨èªã¯ã¾ã ãã·ã§ãlambda ãå ¥ãåã® Java ã C++ ã¨ããã¸ã ããã£ãã
ä»ã§ãç¸å¤ãããã·ã³ã°ã«ã¹ã¬ãã㪠JS ã ããã© (Web Workers ã¨ãä»ã®è¨èªããã¿ããåè«ã¿ãããªããã§ã) ãã³ããããã³ã°ãéåæããã°ã©ãã³ã°ã®ããããããã°ã©ãã³ã°ã¢ãã«ãå¹ åºãããã°ã©ãã«å±ããã®ã JS ã ã£ãã ã¤ã¾ã Promise 㨠async/await ã§ããã ã©ã¡ãã JS 以åãããã£ãã¨ããã°ãã£ãã¨ã¯ããããã»ã©ã¡ã¸ã£ã¼ã§ãªãã£ãã 䏿¹ JS (ã¨ããã ES6) 以éã®ä¸ä»£ã®è¨èªã¯ãã ãããä¼¼ããããªä»çµã¿ããã£ã¦ããã
ããã… ã¨ karino2 ã¯è¨ããããããç´ æµãªæ½è±¡ã®æ©æµãåããã³ãã¦ããããã°ã©ããããã ããã¯ãæ¬æ¥ããããç´ æµæ½è±¡ã®æ©æµãä¸çªããã¦ãããã¹ã髿§è½ã·ã¹ãã /ã¢ããªãæ¸ãç¶ãã¦ããè¦é£ã® C++ ããã°ã©ããã¡ã§ããã
C++ ã«éããä»ã®è¨èªããã¨ãã° Java ã¨ãã§ãéåæã®ä¸çã«è¡ããã³ãã¦ãã¾ã£ã人ã¯ãããªãã«ããã ã¨ã¯ãã C++ ã¯ããããæ¨æºã«ã¹ã¬ãããã¼ã«ãããªãã®ã§ãåºã使ãããæ½è±¡ãä½ãããããªãã 䏿¹ã§ Facebook ã®ããã«ä½åã®ããä¼ç¤¾ã¯ç¬èªã« Future ãå®è£ ãã¦ããããªãããæ ¼å·®ç¤¾ä¼ã ããããããããããªä¸é¨ããã°ã©ããåèãã¹ã karino2 ã¯åé ã®ãããªãä½ã£ãã
Where Is The Free Lunch
ã¨ããã§ããã¾ã§ã®è°è«ã¯åé¡é åã intrinsic ãªå¹³è¡æ§ããã£ã¦ããåæã ã£ãã ãµã¼ããªãå¤§è¦æ¨¡ãã¹ã¯ããããªããå½¼ãã¯å¹³è¡ãã¦å¦çããã¿ã¹ã¯(ãªã¯ã¨ã¹ãã¨ã)ãå¤ããã¦å°ã£ã¦ããã
ã¼ã年代ã®åãé ããã¾ãå¹³è¡ã§ãªãä¸ã®ä¸ã®å¥ã®å ´æã§ã人ã ãå¥ã®åé¡ã«é ãæ©ã¾ãã¦ãã: æè¿ã® CPU ã¯ã³ã¢ã°ããå¢ãã¦ã·ã³ã°ã«ã¹ã¬ããæ§è½ãä¸ãããªãï¼ãªãã¨ãã³ã¼ãã並ååãã¦ææ° CPU ãæ´»ç¨ããªããã°ï¼ ãããã声ã®ãªãã§ãã¶ãä¸çªæåãªã®ã 2005 å¹´ã«æ¸ããã “The Free Lunch Is Over” ã¨ããè¨äºã彿ã¯ã¾ã å²ã¨å æ°ã ã£ã C++ ã®æå人ãä¸éãç ½ã£ã¦ããã
ãã®é ãããªãã¨ãæå ã®ã³ã¼ãã並ååããã人ã ã®åªåãå§ã¾ãã ãã¨ãã° … ä¾ããããã¨ããªããªããã©è²ã ãªã©ã¤ãã©ãªããã¬ã¼ã ã¯ã¼ã¯ããã¼ã«ãè¨èªãªã©ãªã©ãã§ã¦ããã ããããããã¨ããã 㨠Scala ã® Parallel Collection ã¨ãããErlang ããã¦ã¯ãããã¯ãããã®ãåãé ã ã£ãè¨æ¶ã
æ´ã«åãé å¥ã®å ´æã§ãæå ã«ãããããéãããã… ã¤ã¾ã GPU …ãæã¦ä½ãã¦ãã人ãã¡ã GPGPU ã¨ããã®ãã¯ãããã GPU ããã¾ãã¤ããã®ã¯ CPU 以ä¸ã«é£ãããã䏿ã使ã㨠CPU ãè¶³å ã«ãããã°ãªãéãã§è¨ç®ã§ããã ãããªããã§ CUDA ãç»å ´ããã®ã¯ 2007 å¹´ããã (Wikipedia 調ã¹)ã
ã§ãæè¿ã©ããã¦ã?
ã¨ãããããã§ 10 å¹´ãããåã«ä¸¦åã並åã£ã¦ãããæ´»çºã«è°è«ããã¦ãã®ãã karino2 ã®ãããªãã¿ããã£ããã§ããæ£®ç°ã¯æãåºããã®ã ã£ãã
ä»ã®è¨ç®æ©ããããã«ã¾ãã¾ããã«ãã³ã¢ã«ãªã£ã¦ãã ã©ãããããã 4-16 è«çã³ã¢/HT ãããããããã¹ãã㯠8 ã³ã¢ã ã¯ã©ã¦ãã®ãµã¼ãã¨ãä»®æ³åããã¦ã¦è¦ããªããã© bare-metal ãªãé«ããã¤ã 㨠96 vCPU ã¨ãããã AI 人æã¯æå·é貨人æã¨ GPU ã奪ãåã£ã¦ããã
ãããªã³ã¢ä½ãã£ã½ãæ¨ä»ãã¿ãªããã¡ããã¨ã³ã¢ä½¿ã£ã¦ãï¼ä½ã£ã¦ãï¼è¶³ããªãï¼