éå»6ãæéãããªãã¿ã®Yandex Search Engine Result PageïŒSERPïŒ ã€ã³ã¿ãŒãã§ãŒã¹ã¯æ°ããã¢ãŒããã¯ãã£ã«ç§»è¡ããŠãã ãéç¹å®æ©èœã®éçºã¯éåžžã«é«éã«ãªããç¹å®æ©èœã®éçºã¯äºæž¬å¯èœã«ãªããŸããã 40ã®ããã³ããšã³ããããã€ããŒã®å€§èŠæš¡ãªåæ£ããŒã ã«ãšã£ãŠãããã¯å€§ããªæåã§ãã ãã¹ãŠã®æºåãã»ãŒå®äºããå®çšŒåå®éšã§æ°ããã³ãŒãã®å®è¡ãéå§ããããšãæ°ããã¢ãŒããã¯ãã£ã§ã®ãµãŒããŒåŽã®JSæšæºåã倧å¹
ã«é
ããªãããšãå€æããŸããã

æ°ããã³ãŒãã¯ããã·ã³ãã«ã§è«ççã«æŽçãããŠãããããã¹ããŒããŠã³ã¯æãŸãããªãã ãã§ãªããäºæããªããã®ã§ããã æ°ããã¢ãŒããã¯ãã£ã®ãéä¿¡å·ããåŸãã«ã¯ãå°ãªããšãå€ããã®ããé
ããªããªãããã«ã³ãŒããé«éåããå¿
èŠããããŸããã
åçŽãªããã¢ãªã³ã°ãã§ã¯åé¡ã解決ã§ããŸããã§ãããç解ããå¿
èŠãããããããã¡ã€ã«ããå¿
èŠããããŸããã ãããã©ã®ããã«è¡ããããã調ã¹ãããã«èªãã§ãã ããã
ç§ãã¡ã®ãããã³
SERPã¯BEMã§èšè¿°ãããŠããŸãã ãµãŒããŒåŽãã³ãã¬ãŒãã¯JSã§èšè¿°ããã2ã€ã®éšåã§æ§æãããŸãã
- ããã¯ãšã³ãããŒã¿ãBEMJSONããŒãžïŒãããã¯ãèŠçŽ ãããã³ä¿®é£Ÿåã®ããªãŒïŒã«å€æããã³ãŒãã¯PRIVãã³ãã¬ãŒãã§ãã
- BEMJSONãHTMLã«å€æããã³ãŒãã¯BEMHTMLãã³ãã¬ãŒãã§ãã
2çªç®ã®éšåã«ã€ããŠã¯è§ŠããŸããã§ãããæåã®éšåã§ã¯ã¢ãŒããã¯ãã£ã眮ãæããããŸããã
çŸåšãPRIVãã³ãã¬ãŒãã§ã¯ããã¹ã¯ããããã¿ãã¬ãããé»è©±ã®3ã€ã®ãã©ãããã©ãŒã çšã«BEMJSONãçæãããŠããŸãã æžéã¯æåã®2ã€ã®ãã©ãããã©ãŒã ã«ã®ã¿åœ±é¿ããŸããã
PRIVã³ãŒãã¯ãã°ããŒãã«ã¹ã³ãŒãå
ã®å€æ°ã®é¢æ°ã§ãã é¢æ°ã¯BEMã«ãã£ãŠåœåãããç°ãªããã¡ã€ã«ã«ãããã¢ã»ã³ããªããã»ã¹äžã«1ã€ã®ãã¡ã€ã«ã«ã¢ã»ã³ãã«ãããŸãã
äŸïŒ
// - blocks['my-block'] = function(arg1, arg2) { /* ... */ } // - â // - blocks['my-block__elem'] = function(arg1, arg2) { /* ... */ }
以åã¯ããããã¯é¢æ°ã¯åçã§ãããã©ã®éå±€ã«ãå«ãŸããŠããŸããã§ããã ããã€ãã®ãããã¯ã¯äœã¬ãã«ã§å®éã«BEMJSONãçæããŸããããä»ã®ãããã¯ã¯é«ã¬ãã«ã§ãã-ãããã¯ãããã¯ãã¬ãã«ãäœããšåŒã³ãŸããã
æ°ããã¢ãŒããã¯ãã£ã§ã¯ããããã¯ã«ã¯åºå®ã€ã³ã¿ãŒãã§ã€ã¹ãæã€åœ¹å²ããããŸãã ãããã¯ã¯æœè±¡ã¬ãã«ã«çµ±åããå§ããçããŒã¿ãåŠçããŠæçµçãªBEMJSONãçæããããã®ãã€ãã©ã€ã³ã圢æãããŸããã
å§ããåã«
ã¯ã€ãã¯æ€çŽ¢ã®çµæããŠãããŒãµã«JSã³ãŒããããã¡ã€ã©ãŒã¯ååšããããããã¯èªäœã¯ããŸãã«ããŒãããŠããŸããã§ããã å€åºå
ã§æ¹æ³ãç解ããå¿
èŠããããåæã«ãããã«ã€ããŠèªåã®æèŠã圢æããå¿
èŠããããŸããã
ãµãŒããŒåŽã®JSã³ãŒãã®ãããã¡ã€ãªã³ã°ãåçŽãªã¡ãœããããè€éãªã¡ãœãããžã®ãœãŒãã«ã€ããŠèª¬æããŸãã 泚ïŒNode.JS 4.2.2ã§ã®ã¿äœæ¥ããŸããã
GUIã¢ãããŒãã ã¯ãã
æãåçŽã§äžèŠæãããªããŒã«ã¯ãChromiumãã©ãŠã¶ãŒã«çµã¿èŸŒãŸãããããã¡ã€ã©ãŒã§ã ããŒãã€ã³ã¹ãã¯ã¿ãŒã¢ãžã¥ãŒã«ã䜿çšããŠäœ¿çšã§ããŸã ã
ãããã¡ã€ã©ãŒã®çµæãšããŠãåéãããçµæã®3ã€ã®ãã¥ãŒãååŸããŸãã
- ãããããŠã³
- ããã ã¢ãã;
- ãã£ãŒãã
3ã€ãã¹ãŠã¯ãå®è¡ãããã³ãŒãã®å®å
šãªåŒã³åºãããªãŒã衚瀺ããããŸããŸãªæ¹æ³ã§ãã åè
ã®å ŽåãããªãŒã¯äžããäžã2çªç®ã®å Žå-äžããäžã3çªç®ã®å Žå-äŸãèŠãŠã¿ãŸãããã

â ãããããŠã³ã§ã¯ãã³ãŒã«ã¹ã¿ãã¯ã®æµ
ãæ·±ãã«ããé¢æ°åŒã³åºãã®ã¿ã®å®è¡æéã远跡ã§ããŸãã åé¡ã¯ãæ°Žå¹³ã¹ã¯ããŒã«ã®æ¬ åŠã§ãã ãã®äŸã§ã¯ãããªãŒã®é«ãã182ã§ãæ·±ã37ã®ã³ãŒã«ã«å°éã§ããŸããããæ®ãã¯ç»é¢ã®å³ç«¯ã®åŸãã«é ãããŸãŸã§ããã

âãã©ãããã§ããããªãŒã®è¡šç€ºãéå§ã§ããããã ããã ã¢ããã§ã¯æ°Žå¹³ã¹ã¯ããŒã«ã¯äžèŠã§ãã é¢æ°FãåŒã³åºããŠéå§ããå ŽåãããªãŒãç»ã£ãŠé¢æ°GãåŒã³åºããç»é¢ã®ç«¯ã§äŒæ©ããŸããGãå¥ã«åŒã³åºããã移åãç¶ããŸãã 幞ããªããšã«ãé¢æ°åã«ããæ€çŽ¢ããããŸãã ããããããã§ã¯ãåèšå®è¡æéãç¹å®ã®å®æ°ãããçãããšãå€æããé¢æ°ã¯è¡šç€ºãããŸããã
ããã ã¢ããã§é¢æ°ãèŠã€ããããšãã§ããªãã£ãå Žåãå®è¡æéã¯éåžžã«çãããã³ã³ãã€ã«äžã«ã€ã³ã©ã€ã³åãããŸããã

â ãã£ãŒãã¯ãæé軞ã«é¢é£ä»ããããã³ãŒã«ããªãŒãæç»ããŸããã¹ã±ãŒã«ãšæ°Žå¹³ã¹ã¯ããŒã«ã®ã¿ãå€æŽã§ããŸãã ããã§ã¯ãæ·±ã32ã§åŒã³åºãã衚瀺ãããæ®ãã¯ç»é¢ã®äžç«¯ãè¶
ããŠããŸãã
GUIã¢ãããŒãã ãŠã§ãã¹ããŒã
GUIãããã¡ã€ã©ãŒã®ãªãã·ã§ã³ã¯ChromiumãšããŒãã€ã³ã¹ãã¯ã¿ãŒã ãã§ã¯ãããŸãããããšãã°ãWebStormã¯åæ§ã®æ©èœãæäŸããŸãã
å®è¡->æ§æã®ç·šé...-> Node.jsæ§æ-> V8ãããã¡ã€ãªã³ã°ã¿ã
åŒã³åºãããªãŒã衚瀺ããã«ã¯ã4ã€ã®æ¹æ³ããããŸãã
- ãããã³ãŒã«
- ãã¬ãŒã ãã£ãŒã;
- ããã ã¢ãã;
- ãããããŠã³ã
ããã§ãå®è¡æéã«ãã£ãŠãã£ã«ã¿ãªã³ã°æ©èœã®ãããå€ãå¶åŸ¡ã§ããããšã«æ³šæããŠãã ããïŒãŸã£ãããã£ã«ã¿ãªã³ã°ã§ããŸããïŒã
ãã®ã±ãŒã¹ã®ãããã³ãŒã«ã¯ãå
±æã©ã€ãã©ãªïŒbin / nodeãlibsystem_kernelãlibsystem_mallocãlibsystem_cãlibstdc ++ïŒã®ã©ã³ã¿ã€ã ã®ã¿ã瀺ããŸããã
ãã¬ãŒã ãã£ãŒãã¯Chromiumã®ãã£ãŒãã«äŒŒãŠããŸãããç解ã§ããªãã ãã§åœ¹ã«ç«ããªãããã§ãã å°ãªããšãããã€ãã®èª²é¡ãšãã®ãã¹ããèå¥ããããã«ãåçãæ¡å€§ããããšã¯ã§ããŸããã§ããã

â ããã ã¢ããã¯Chromiumã®åæ§ã®ã¢ãŒãã«äŒŒãŠããŸãããããã§ã¯æ€çŽ¢ãè¡ããããæ§é ããããã«ç°ãªããŸãã é¢æ°åã§æ€çŽ¢ããã«ããã䜿çšããããšã¯äžå¯èœã§ãã

â ãããããŠã³ã§ã¯ãåæ§ã®ç¶æ³ã§Chromiumãšåæ§ã«æ°Žå¹³ã¹ã¯ããŒã«ãè¡ãããŸããã ãã¹ãã®37çªç®ã®ã¬ãã«ããäžã§å®è¡ãããæ©èœã確èªããããšã¯ã§ããŸããã ããã§ã¹ã¿ãã¯ã¯ãã詳现ã§ãããJSåŒã³åºãã ãã§ãªããèšèªã®å
èïŒArrayForEachãInnerArrayForEachãModule._compileãModule._loadãªã©ïŒãå«ãŸããŠããŸãã
GUIåºå
èæ
®ãããŠããGUIãããã¡ã€ãªã³ã°ã®æ¹æ³ã®äžã§ãæã䟿å©ãªã®ã¯ãããŒãã€ã³ã¹ãã¯ã¿ãšChromiumãä»ããŠããŒã¿ãåéããåŒã³åºãã®å®å
šãªæ€çŽ¢ããªãŒã®ããã ã¢ããè¡šçŸã®åœ¢åŒã§ããŒã¿ãåæããããšã§ãã
ã³ãŒã«ããªãŒã®é«ãã30以äžã®å Žåãä»ã®æ¹æ³ãšãœãªã¥ãŒã·ã§ã³ã䟿å©ã«äœ¿çšã§ããŸãã
ãã ãããããã®ã¡ãœããã¯ãã¹ãŠããµãŒããŒã³ãŒãã®ãããã¡ã€ãªã³ã°ã«ã¯é©ããŠããŸããã ããŒãã€ã³ã¹ãã¯ã¿ãŒãèµ·åããCPUãããã¡ã€ã«ã®èšé²ãæå¹ã«ããããã€ãã®èŠæ±ãè¡ããããŒã¿ã®åæãéå§ããã ãã§ã¯äžååã§ãã ç¹åŸŽçãªã¯ãšãªã®ä»£è¡šçãªãµã³ãã«ãšãæ©èœãå®äºããã®ã«ããã£ãåèšæéã ãã§ãªããä»ã®ææšïŒå¹³åæéãäžå€®å€ãããŸããŸãªçŸåäœæ°ïŒãå¿
èŠã§ãã å¶åŸ¡ãããå®éšãå¿
èŠã§ãã
ãããã¡ã€ãªã³ã°çè«
ãããã¡ã€ãªã³ã°ã«ã¯ãèšè£
ãšãµã³ããªã³ã°ãããã¡ã€ãªã³ã°ã®2ã€ã®åºæ¬çãªã¢ãããŒãããããŸãã
ã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ãããã¡ã€ãªã³ã°äžã«ããããã¡ã€ã«ãããã³ãŒããå€æŽãããã¹ãŠã®é¢æ°åŒã³åºãã®ãã°èšé²ãè¿œå ããŸãã ãã®ã¡ãœããã¯ã詳现ã§ã¯ããããããã«æªãã æ
å ±ãåéããŸããããã¯ãæçµçã«ãããã¡ã€ã«ãããã®ã¯ãœãŒã¹ã³ãŒãã§ã¯ãªãããã®ã³ã°ãããä¿®æ£ããããœãŒã¹ã³ãŒãã§ããããã§ãã
ãµã³ããªã³ã°ãããã¡ã€ãªã³ã°äžããããã¡ã€ã«ãããã³ãŒãã¯å€æŽãããŸããããå®è¡äžã®ã·ã¹ãã ã¯å®æçã«å®è¡ãäžæåæ¢ããã³ãŒã«ã¹ã¿ãã¯ã®çŸåšã®ã¹ãããã·ã§ãããèšé²ããŸãã ãã®æ¹æ³ã®æ¬è³ªã¯ãäŸã䜿çšããŠåŸã§æ€èšããŸãã
ã¬ã€ãä»ãå®éš1
èšè£
ã¢ãããŒã
ãã¹ãŠã®ã³ãŒããé¢æ°ã®ã»ããã§ããå Žåããã®ã¢ãããŒãã¯éåžžã«ææ©çã«å®è£
ãããŠããŸãã ãã¹ãŠã2ã€ã®ã¹ãããã§è¡ãããŸãã
process.hrtimeã䜿çšããŠããç§åäœã§æéãèšé²ãããã«ããŒïŒããªç§ã®æ¥ä»ã§ã¯äžååã§ãïŒïŒ
function nano() { var time = process.hrtime(); return time[0] * 1e9 + time[1]; }
å
ã®é¢æ°ãèµ·åããå®è¡æéãèšé²ããã©ãããŒïŒ
function __profileWrap__(name, callback, args) { var startTime = nano(), result = callback.apply(ctx, args), time = nano() - startTime; logStream.write(name + ',' + time + '\n'); return result; }
å®éã«ã©ããã³ã°ã³ãŒãïŒ
Object.keys(blocks).forEach(function(funcName) { var base = blocks[funcName]; if (typeof base === 'function') { blocks[funcName] = function() { return __profileWrap__(funcName, base, arguments); }; } });
ãã¹ãŠãã·ã³ãã«ã§ãã
ãããããã®ãããªå®è£
ã§ã¯ãååž°åŒã³åºãã¯æ£ããåŠçãããŸããã§ããã ããšãã°ããã®éæ¥ååž°ã®å ŽåïŒ

é¢æ°Xã®åèšå®è¡æéã«ã¯ãå
éšåŒã³åºãã2åå«ãŸããŠããŸãã1åã¯å€éšåŒã³åºãã®æéã®äžéšãšããŠã2åç®ã¯åå¥ã«å®è¡ãããŸãã
ååž°åŒã³åºããæ£ããåŠçããã«ã¯ãç·šéãå¿
èŠã§ãã
function __profileWrap__(name, callback, args) { if (called[name]) return callback.apply(ctx, args); called[name] = true; // var startTime = nano(), result = callback.apply(ctx, args), time = nano() - startTime; delete called[name]; logStream.write(name + ',' + time + '\n'); return result; }
ããã«ãããŒã«ãŒã®ãã°ã«ãšã³ããªããããã¡ã€ã«ã³ãŒãã«è¿œå ããŸãããããã¯ã1ã€ã®ãªã¯ãšã¹ãã®åŠçã®çµäºãæå³ããŸãã ããŒã«ãŒã¯ããã°ãšã³ããªãšç¹å®ã®ã¯ãšãªãæ¯èŒããŠãé¢å¿ã®ããããŸããŸãªã¡ããªãã¯ãèªã¿åãã®ã«åœ¹ç«ã¡ãŸãã
ããšãã°ãé¢æ°ã®ã©ã³ã¿ã€ã ã®äžå€®å€ãèšç®ããããã«ãã°ãåŠçããã«ã¯ã次ã®ã³ãŒããå¿
èŠã§ãã
var requests = [], currentRequest = {}; function getMedians() { var funcTime = {}; requests.forEach(function(request) { Object.keys(request).forEach(function(funcName) { // (funcTime[funcName] = funcTime[funcName] || []).push(request[funcName]); }); }); Object.keys(funcTime).forEach(function(funcName) { var arr = funcTime[funcName], value; // while (arr.length < requests.length) arr.push(0); // value = median(arr); if (value > 0) { // funcTime[funcName] = value; } else { // delete funcTime[funcName]; } }); return funcTime; } function writeResults() { var funcMedians = getMedians(); // // : < > <> < > console.log( Object .keys(funcMedians) .sort(function(funcNameA, funcNameB) { return funcMedians[funcNameB] - funcMedians[funcNameA]; }) .map(function(funcName) { return funcName + '\t' + nano2milli(funcMedians[funcName]); }) .join('\n'); ); } function processLine(parsedLine, isItLast) { if (parsedLine.isMarker) { requests.push(currentRequest); currentRequest = {}; } else { // GET- currentRequest[parsedLine.funcName] = (currentRequest[parsedLine.funcName] || 0) + parsedLine.time; } if (isItLast) writeResults(); } // processLine(...)
æ°åã®ãªã¯ãšã¹ãã§ãµãŒããŒãèµ·åãããšããããã¯ãç¹å®ãããããããã¹ãŠãé
ããªããŸããã ããããç§ã¯ããã§ãããããããŸããã§ãã-çµæã¯å¥ã®ã¢ãããŒãã§ç¢ºèªããå¿
èŠããããŸããã
ã¬ã€ãä»ãå®éšNo. 2ãžã®éäžã
ç®±ããåºããŠãµã³ããªã³ã°
Node.JSã¯ããã®çš®ã®ãããã¡ã€ãªã³ã°ãããã«ãµããŒãããããšãç¥ãããŠããŸãã å¿
èŠãªãã©ã¡ãŒã¿ãŒã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããã ãã§ååã§ãããããŒã¿ã¯æå®ããããã¡ã€ã«ã«åéãããŸãã
node --prof âlogfile=v8.log my_app.js
man node
-ããå€ãã®èå³æ·±ããªãã·ã§ã³ãå«ãŸããŠããŸãã
ãã°ã¯æ¬¡ã®ããã«ãªããŸãã

ãã«ãã¹ã¬ããã³ãŒãããããã¡ã€ãªã³ã°ãããšãã«ããã¹ã¿ãã¯ãè¡ãåãåã£ãããããã®ã³ã°ã¯åæãããªãããšã«ããã«æ³šæããŠãã ããã ãããçºèŠããããããããžã§ã¯ãã®ãã¹ãæéäžãPRIVã³ãŒãã®ãã«ãã¹ã¬ããäœæ¥ãæŽçããã¬ã€ã€ãŒãç¡å¹ã«ããŸããã
ãã°ã®èªã¿æ¹ã®è³ªåã«å¯ŸããçããèŠã€ããéçšã§ã node-tick-processorã¢ãžã¥ãŒã«ãèŠã€ããããšãã§ããŸããã ãã®ã¢ãžã¥ãŒã«ã¯ãã°ã解æããå®è¡æžã¿ããã°ã©ã ã®åŒã³åºãã®æ¢ã«ããç¥ãããŠããå®å
šãªããªãŒãããã ã¢ãããšãããããŠã³ã® 2ã€ã®åœ¢åŒã§ã³ã³ãœãŒã«ã«åºåããŸããåé¢æ°ã®å®è¡æéã®ã¿ãããªç§ã§ã¯ãªããã£ãã¯ã§èæ
®ãããŸãã
tick-processorã¢ã«ãŽãªãºã ã®è©³çŽ°ãç¥ãã質åã«çããããšæããŸããã
- åŒã³åºãããªãŒã¯ã©ã®ããã«æ§ç¯ãããŸããïŒ
- ticksã¯ã©ãããæå³ã§ããïŒ
- ããªç§ã§ã¯ãªããã£ãã¯ããã®ã¯ãªãã§ããïŒ
ãã£ãã¯ããã»ããµã®ãœãŒã¹ãã¡ã€ã«ã¯v8 / toolsã®ãã¡ã€ã«ã§ããããšãããã«ããããŸããã
ãã°è§£æã¯æ¬¡ã®ããã«è¡ãããŸãã
ãã°ã¯csvãã¡ã€ã«ã§ãåè¡ã¯ãã©ã¡ãŒã¿ãŒä»ãã®ã³ãã³ãã§ãã äž»ãªããŒã ã¯æ¬¡ã®ãšããã§ãã
- ã³ãŒããã©ã°ã¡ã³ããã¢ãã¬ã¹ã«ãã€ã³ãããã³ãã³ãïŒå
±æã©ã€ãã©ãªãã³ãŒãäœæãã³ãŒã移åïŒã
- ã¹ã¿ãã¯ã¹ãããã·ã§ããã«å¯Ÿå¿ããtickã³ãã³ãïŒãã£ãã¯é »åºŠã¯ãããŒããªãã·ã§ã³âcpu_profiler_sampling_intervalãããã©ã«ãã§èšå®ãããŸã
1ããªç§ 100ããªç§ïŒã
ã³ãŒããã©ã°ã¡ã³ãã¯ãCã³ãŒãã®ãã©ã°ã¡ã³ãïŒéçãŸãã¯å
±æïŒããŸãã¯JSã³ãŒãã®ãã©ã°ã¡ã³ãïŒåçïŒã®ããããã§ãã ãã¹ãŠã®ãã©ã°ã¡ã³ãã¯ããããã3ã€ã®splaytreeæ§é ã«æ ŒçŽãããŸãã
ç®çãã¯æ¬¡ã®ããã«é
眮ãããŸãã

ã¿ã€ã ã¹ã¿ã³ãã¯ãã£ãã¯æéã«å¯Ÿå¿ãã vmState-ä»®æ³ãã·ã³ã®ç¶æ
ïŒ0-JSå®è¡ïŒã次ã«ã¢ãã¬ã¹ã®ã¹ã¿ãã¯ã splaytreeæ§é ã䜿çšããŠãã¹ã¿ãã¯äžã®é¢æ°åã埩å
ãããŸãã
ãã®ããã«ããŠåŸããããã¹ãŠã®ã¹ã¿ãã¯ã¯ãå®å
šãªåŒã³åºãããªãŒãæ§æããããã«äžç·ã«æ¥çãããŸãã

åã³ãŒã«ã·ãŒãã«ã¯ãããã®æ¹æ³ã§é¢æ°ãåŒã³åºãããåæ°ããšããæå³ã®hitCountå€ãå²ãåœãŠãããŸãã ãããã¡ã€ãªã³ã°ãå®äºãããšããã¹ãŠã®å
éšããŒãã®ãããã«ãŠã³ããäžããäžã«èšç®ãããŸãã ååŸãããå€ã¯ãtick-processorãåºåã«è¡šç€ºãããã£ãã¯ã§ãã
ç®çããããªç§ã«å€æããæçœã§ãããªããç²éãªæ¹æ³ããããŸãã
hitTime = (maxTimestamp - minTimestamp) / (timestamps.length - 1)
blockTime = hitCount * hitTime
å®éã®ãã£ãã¯éã®æéã¯åãã§ã¯ãªããTã®éãšT + 1ããªç§ã®éã«é¢æ°Fã®å
åŽã«ãããšããäºå®ã¯ãé¢æ°ã2ããªç§å®è¡ããããšãæå³ããŸããã ããããããããã®æéã®éã«å®å
šã«ç°ãªãæ©èœãå®è¡ããããã®ãããªãããã¡ã€ãªã³ã°æ¹æ³ã¯ãæ°ä»ããªããã§ãããã ãã ããChromiumã§ã©ã³ã¿ã€ã ãèæ
®ãããæ¹æ³-https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/devtools/front_end/sdk/CPUProfileDataModel.js&sq=packageïŒã¯ãã ïŒã¿ã€ã= csïŒl = 31
ãããã«ãããèšè£
æ¹æ³ã®çµæã確èªããããã«ãå¥ã®ãããã¡ã€ãªã³ã°æ¹æ³ãå¿
èŠã§ããã
ã¬ã€ãä»ãå®éšçªå·2ã
ãµã³ããªã³ã°ã¢ãããŒã
幞ããªããšã«ã次ã®ããã«æ©èœããv8-profilerã¢ãžã¥ãŒã«ãèŠã€ããã®ã§ãé·ãénode-tick-processorã詳ãã調ã¹ãå¿
èŠã¯ãããŸããã§ããã
var profiler = require('v8-profiler'); profiler.startProfiling('profilingSession'); doSomeWork(); console.log(profiler.stopProfiling('profilingSession'));
åæã«ã次ã®ã¿ã€ãã®ãªããžã§ã¯ããã³ã³ãœãŒã«ã«åºåãããŸãã

v8-profilerã䜿çšããå Žåã®ãããã¡ã€ã«ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
var hitTime; function checkoutTime(node) { var hits = node.hitCount || 0; node.children.forEach(function(childNode) { hits += checkoutTime(childNode); }); logStream.write(node.functionName + ',' + (hits * hitTime) + '\n'); return hits; } function getTime(profile) { var timestamps = profile.timestamps, lastTimestampIndex = timestamps.length - 1;
ã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ãšåæ§ã«ãååž°ãé©åã«åŠçããã«ã¯ç·šéãå¿
èŠã§ãã
function stackAlreadyHas(node, name) { return node && (node.functionName === name || stackAlreadyHas(node.parent, name)); } function checkoutTime(node) { var name = node.functionName, hits = node.hitCount || 0; node.children.forEach(function(childNode) { // childNode.parent = name; hits += checkoutTime(childNode); }); // if (!stackAlreadyHas(node.parent, name)) { logStream.write(name + ',' + (hits * hitTime) + '\n'); } return hits; }
ã¬ã€ãä»ãå®éšã çµæ
serp-itemãããã¯ã®å®è¡æéã®äžå€®å€ã¯ã1ã€ã®æ€çŽ¢çµæã«å¯Ÿå¿ããã¡ã€ã³ãããã¯ã§ãïŒããŒãžã«ã¯10ã®ãã®ãããªçµæãå«ãŸããŠããŸãïŒã
æ¹æ³ | ãã¹ã¯ããã | ã¿ãã¬ãã |
---|
èšè£
| 38.4ããªç§ | 35.9ããªç§ |
ãµã³ããªã³ã° | 25.3ããªç§ | 25.0ããªç§ |
æ¹æ³ã®æ ¹æ¬çãªéãã«ããã絶察å€ã¯ç°ãªããšäºæ³ãããŸããã
次ã®ã¹ãããã§ã¯ãå°ããªæé©åã䜿çšããŠããããã¡ã€ãªã³ã°ããžãã¯ãèšæž¬ã¡ãœããã«äžãã圱é¿ãæå°éã«æããããšãè©Šã¿ãŸããã ãµã³ããªã³ã°æ¹æ³ã§ã¯ããã£ãã¯éã®æéãççž®ããŸããïŒsetSamplingIntervalã¡ãœããïŒã åçã¯å€æŽãããŠããŸããã ããªãŒã®ã«ãŒãã«è¿ãåŒã³åºãã¯åæ§ã®ã€ã³ãžã±ãŒã¿ãŒãååŸããŸããããåŒã³åºããã«ãŒãããé¢ããã»ã©ããããã¯ããç°ãªã£ãŠããŸããã
çµè«
ããæ·±ãåŒã³åºãã¯ãäœåºŠãåŒã³åºãããé¢æ°ã«å¯Ÿå¿ããŸãã ãããã®å Žåã枬å®èª€å·®ã¯ã¡ãœãã誀差ãšåŒã³åºãåæ°ã®ç©ã«çãããããå
šäœåã«å¯Ÿããå°ããªå€åã¯å€åããŸããã
ãµã³ããªã³ã°æ¹æ³ã¯ãã°ãã°ããã©ãŒãã³ã¹ãéå°è©äŸ¡ãããšæ³å®ã§ããŸãã èšè£
æ¹æ³ã¯ã建èšã®æ§èœãé倧è©äŸ¡ããŸãã ãããããäœãåŒã³åºãããªãŒã§ã³ãŒãããããã¡ã€ãªã³ã°ããå Žåãäž¡æ¹ã®ã¡ãœããã¯åæ§ã®çµæã衚瀺ããŸãããäžè¬çãªå Žåãããã¯äºæãããã¹ãã§ã¯ãããŸããã
絶察çãªçµæã®éãã«ãããããããç¹å®ã®ãããã¯ã®çžå¯Ÿå€ã¯è¿ãããšãå€æããŸããã ã©ã¡ãã®æ¹æ³ããåãããã¬ãŒãããããã¯ã®ãªã¹ãã瀺ããŸããã ãã¬ã€ãä»ãå®éšãã¯ãPRIVã³ãŒãããããã¡ã€ãªã³ã°ããããã®ãããŒã«ããšããŠèšèšãããŸããã
äžè¬çãªæé©åãµã€ã¯ã«ã¯æ¬¡ã®ããã«ãªããŸããã
- ããŒã«ãå®è¡ããŸãã
- ã³ãŒãã®ããã©ãŒãã³ã¹ãå¿
èŠãªã¬ãã«ã«éããå ŽåãçµäºããŸãã
- ãã¬ãŒãæ©èœãããã¯ãèŠã€ããŸãã
- æ©èœãããã¯ãæé©åããŸãã
- æåã«ã
ãã®çµæãå€ãã®ãããã¯ãæé©åããæŽæ°ãããã³ãŒãã¯å€ãå®è£
ã«æ¯ã¹ãŠé床ãäœäžããªããªããŸããã
serp-itemã®çŸåšã®æ°å€ã¯æ¬¡ã®ãšããã§ãïŒæãåºããšãæ€çŽ¢çµæã®ããŒãžå
šäœã®ã€ã³ãžã±ãŒã¿ã¯10åããããšã§åŸãããŸãïŒã
æ¹æ³ | ãã¹ã¯ããã | ã¿ãã¬ãã |
---|
èšè£
| 35.1ããªç§ïŒ-3.3ïŒ | 34.8ããªç§ïŒ-1.1ïŒ |
ãµã³ããªã³ã° | 24.9ããªç§ïŒ-0.4ïŒ | 24.8ããªç§ïŒ-0.2ïŒ |
çµè«ã®ä»£ããã«
å³å¯ã«èšãã°ãåçŽãªã±ãŒã¹ããããŸãã-åçŽãªãã©ããé¢æ°ã®ãããã¡ã€ãªã³ã°ã§ãã ãªããžã§ã¯ããšç¶æ¿ãŸãã¯éåæã³ãŒãã䜿çšããŠã³ãŒãããããã¡ã€ãªã³ã°ããå ŽåãäŸåé¢ä¿ãç解ãââãããã°ã©ã ã®åèšå®è¡æéã«å¯Ÿããåã
ã®éšåã®å¯äžã«ã€ããŠçµè«ãåºãããšã¯ã¯ããã«å°é£ã§ãã
ããè€éãªã³ãŒãããããã¡ã€ã«ããã¿ã¹ã¯ãããå Žåã¯ãé©åãªãœãªã¥ãŒã·ã§ã³ããããŸããããã«ã€ããŠã¯ãããã§ééããªã説æããŸãã