é«ã¬ãã«ã®ããã°ã©ãã³ã°èšèªã«ã¯ãé¢æ°ãæ¡ä»¶ä»ãã¹ããŒãã¡ã³ããã«ãŒããªã©ãå€ãã®æœè±¡çãªããã°ã©ãã³ã°æ§æèŠçŽ ãå«ãŸããŠããŸãããããã¯é©ãã»ã©çç£çã§ãã ãã ããé«æ°Žæºèšèªã§ã³ãŒããèšè¿°ããããšã®æ¬ ç¹ã®1ã€ã¯ãããã°ã©ã ã®é床ã倧å¹
ã«äœäžããå¯èœæ§ãããããšã§ãã ãããã£ãŠãã³ã³ãã€ã©ãŒã¯èªåçã«ã³ãŒããæé©åããäœæ¥ã®é床ãäžããããšããŸãã ä»æ¥ãæé©åããžãã¯ã¯éåžžã«è€éã«ãªã£ãŠããŸããã³ã³ãã€ã©ã¯ã«ãŒããæ¡ä»¶åŒãååž°é¢æ°ãå€æããŸãã ã³ãŒãã®ãããã¯å
šäœãåé€ããŸãã ããã»ããµã¢ãŒããã¯ãã£ã®ã³ãŒããæé©åããŠãæ¬åœã«é«éã§ã³ã³ãã¯ãã«ããŸãã ãããŠãããã¯éåžžã«ã¯ãŒã«ã§ãããªããªããç解ãç¶æãé£ããæåã®æé©åãè¡ãããããèªã¿åãå¯èœãªã³ãŒãã®äœæã«éäžããæ¹ãè¯ãããã§ãã ããã«ãæåã®æé©åã«ãããã³ã³ãã€ã©ãè¿œå ã®ããå¹ççãªèªåæé©åãå®è¡ã§ããªããªãå ŽåããããŸãã æäœæ¥ã§æé©åãèšè¿°ããã®ã§ã¯ãªãã䞊è¡æ§ãã©ã€ãã©ãªæ©èœã®äœ¿çšãªã©ãã¢ãŒããã¯ãã£èšèšãšå¹ççãªã¢ã«ãŽãªãºã ã«çŠç¹ãåãããæ¹ãè¯ãã§ãããã
ãã®èšäºã¯ãVisual C ++ã³ã³ãã€ã©ã®æé©åã«é¢ãããã®ã§ãã ã³ã³ãã€ã©ãŒãããããæ£ããé©çšããããã«é©çšããªããã°ãªããªãæãéèŠãªæé©åææ³ãšãœãªã¥ãŒã·ã§ã³ã«ã€ããŠèª¬æããŸãã ç§ã®ç®æšã¯ãã³ãŒããæåã§æé©åããæ¹æ³ã説æããããšã§ã¯ãªããèªåã§ã³ãŒããæé©åããããã«ã³ã³ãã€ã©ãä¿¡é Œããå¿
èŠãããçç±ã瀺ãããšã§ãã
ãã®èšäºã¯ãVisual C ++ã³ã³ãã€ã©ãè¡ãæé©åã®å®å
šãªã»ããã®èª¬æã§ã¯ãªããç¥ã£ãŠããã¹ãæ¬åœã«éèŠãªãã®ã®ã¿ã瀺ããŸãã ã³ã³ãã€ã©ãå®è¡ã§ããªãä»ã®éèŠãªæé©åããããŸãã ããšãã°ãéå¹ççãªã¢ã«ãŽãªãºã ãå¹æçãªã¢ã«ãŽãªãºã ã«çœ®ãæããããããŒã¿æ§é ã®ã¢ã©ã€ã¡ã³ããå€æŽãããããŸãã ãã®èšäºã§ã¯ããã®ãããªæé©åã«ã€ããŠã¯èª¬æããŸããã
ã³ã³ãã€ã©ãŒã®æé©åã®å®çŸ©
æé©åãšã¯ãã³ãŒãã®é床ãšãµã€ãºãæãéèŠãªç¹æ§ãæ¹åããããã«ãã³ãŒããå
ã®ã³ãŒããšæ©èœçã«åçãªå¥ã®ã³ãŒãã«å€æããããã»ã¹ã§ãã ãã®ä»ã®ç¹æ§ã«ã¯ãã³ãŒãå®è¡ããšã®æ¶è²»ãšãã«ã®ãŒéãšã³ã³ãã€ã«æéïŒçµæã®ã³ãŒããJITã䜿çšããå Žåã®JITã³ã³ãã€ã«æéïŒãå«ãŸããŸãã
ã³ã³ãã€ã©ã¯åžžã«æ¹åãããŠããããã®ã¢ãããŒãã¯æ¹åãããŠããŸãã ããããå®å
šã§ã¯ãªããšããäºå®ã«ãããããããå€ãã®å Žåãæãæ£ããã¢ãããŒãã¯ãæåã§è¡ããããäœã¬ãã«ã®æé©åãã³ã³ãã€ã©ã«ä»»ããããšã§ãã
ã³ã³ãã€ã©ãŒãæé©åãããå¹ççã«å®è¡ããã®ã«åœ¹ç«ã€4ã€ã®æ¹æ³ããããŸãã
- ä¿å®ããããèªã¿åãå¯èœãªã³ãŒããäœæããŸãã Visual C ++ã®ããŸããŸãªOOPæ©èœãããã©ãŒãã³ã¹ã®ææªã®æµãšèããªãã§ãã ããã Visual C ++ã®ææ°ããŒãžã§ã³ã§ã¯ãOOPãªãŒããŒããããæå°éã«æããããšãã§ããå Žåã«ãã£ãŠã¯ããããå®å
šã«åãé€ãããšãã§ããŸãã
- ã³ã³ãã€ã©ãã£ã¬ã¯ãã£ãã䜿çšããŸãã ããšãã°ãããã©ã«ããããéãé¢æ°åŒã³åºãèŠçŽã䜿çšããããã³ã³ãã€ã©ãŒã«æ瀺ããŸãã
- ã³ã³ãã€ã©ã«çµã¿èŸŒãŸããŠããé¢æ°ã䜿çšããŸãã ãããã¯ãã³ã³ãã€ã©ãŒã«ãã£ãŠå®è£
ãèªåçã«æäŸãããç¹å¥ãªé¢æ°ã§ãã ã³ã³ãã€ã©ã¯ãæå®ããããœãããŠã§ã¢ã¢ãŒããã¯ãã£äžã§ã³ãŒããã§ããã ãéãå®è¡ãããããã«ããã·ã³åœä»€ã®ã·ãŒã±ã³ã¹ãå¹ççã«é
眮ããæ¹æ³ã«ã€ããŠæ·±ãç¥èãæã£ãŠããããšã«æ³šæããŠãã ããã çŸåšãMicrosoft .NET Frameworkã¯çµã¿èŸŒã¿é¢æ°ããµããŒãããŠããªãããããããŒãžèšèªã¯ãããã䜿çšã§ããŸããã ãã ããVisual C ++ã¯ãã®ãããªæ©èœãåºç¯å²ã«ãµããŒãããŠããŸãã ãã ããã³ãŒãã®ããã©ãŒãã³ã¹ã¯åäžããŸãããèªã¿ããããšç§»æ€æ§ã«æªåœ±é¿ãäžããããšãå¿ããªãã§ãã ããã
- ãããã¡ã€ã«ã«åºã¥ãæé©åïŒPGOïŒã䜿çšããŸãã ãã®ãã¯ãããžãŒã®ãããã§ãã³ã³ãã€ã©ãŒã¯ãæäœäžã®ã³ãŒãã®åäœã«ã€ããŠããå€ãã®ããšãèªèããããã«å¿ããŠæé©åããŸãã
ãã®èšäºã®ç®çã¯ãéå¹ççã§ãããèªã¿åãå¯èœãªã³ãŒãã«é©çšãããæé©åãå®è¡ããã³ã³ãã€ã©ãŒãä¿¡é Œã§ããçç±ã瀺ãããšã§ãïŒæåã®æ¹æ³ïŒã ãŸãããããã¡ã€ã«ã¬ã€ãã«ããæé©åã®æŠèŠã説æãããœãŒã¹ã³ãŒãã®äžéšãæ¹åã§ããã³ã³ãã€ã©ãã£ã¬ã¯ãã£ãã«ã€ããŠã説æããŸãã
ã³ã³ãã€ã©ãŒã®æé©åã«ã¯ãæãããã¿å®æ°ãªã©ã®åçŽãªå€æãããã³ãã³ãã®ã¹ã±ãžã¥ãŒãªã³ã°ãªã©ã®è€éãªå€æãŸã§ãããŸããŸãªææ³ããããŸãã ãã®èšäºã§ã¯ãã³ãŒãã®ããã©ãŒãã³ã¹ã倧å¹
ã«åäžãããïŒ2æ¡ã®ããŒã»ã³ãïŒããšãã§ããé¢æ°ïŒé¢æ°ã®ã€ã³ã©ã€ã³åïŒãCOMDATæé©åãããã³ã«ãŒãæé©åã眮ãæããããšã§ãµã€ãºãåæžã§ããæãéèŠãªæé©åã«éå®ããŸãã 次ã®ã»ã¯ã·ã§ã³ã§æåã®2ã€ã®ã¢ãããŒãã«ã€ããŠèª¬æããVisual C ++ã§æé©åã®ããã©ãŒãã³ã¹ãå¶åŸ¡ããæ¹æ³ã瀺ããŸãã çµè«ãšããŠã.NET Frameworkã§äœ¿çšããããããã®æé©åã«ã€ããŠç°¡åã«èª¬æããŸãã èšäºå
šäœãéããŠããã¹ãŠã®äŸã§Visual Studio 2013ã䜿çšããŸãã
ãªã³ã¯æã³ãŒãçæ
ãªã³ã¯æã³ãŒãçæïŒLTCGïŒã³ãŒãçæã¯ãC / C ++ã³ãŒãã®ããã°ã©ã å
šäœã®æé©åïŒããã°ã©ã å
šäœã®æé©åãWPOïŒãå®è¡ããããã®ææ³ã§ãã C / C ++ã³ã³ãã€ã©ã¯ãåãœãŒã¹ã³ãŒããã¡ã€ã«ãåå¥ã«åŠçãã察å¿ãããªããžã§ã¯ããã¡ã€ã«ãçºè¡ããŸãã ã€ãŸããã³ã³ãã€ã©ãŒã¯ãããã°ã©ã å
šäœãæé©åããã®ã§ã¯ãªããåäžã®ãã¡ã€ã«ã®ã¿ãæé©åã§ããŸãã ãã ããäžéšã®éèŠãªæé©åã¯ããã°ã©ã å
šäœã«ã®ã¿é©çšãããå ŽåããããŸãã ãªã³ã«ã¯ããã°ã©ã ãå®å
šã«ç解ããŠããããããããã®æé©åã¯ãªã³ã¯äžã«ã®ã¿äœ¿çšã§ããã³ã³ãã€ã«äžã«ã¯äœ¿çšã§ããŸããã
LTCGãæå¹ãªå ŽåïŒãã©ã°
/GL
ïŒãã³ã³ãã€ã©ãã©ã€ããŒïŒ
cl.exe
ïŒã¯ããã³ããšã³ãïŒ
c1.dll
ãŸãã¯
c1xx.dll
ïŒã®ã¿ãåŒã³åºãããªã³ã¯ãŸã§ããã¯ãšã³ãïŒ
c2.dll
ïŒã延æããŸãã çµæã®ãªããžã§ã¯ããã¡ã€ã«ã«ã¯ããã·ã³ã³ãŒãã§ã¯ãªãCäžéèšèªïŒCILïŒãå«ãŸããŸãã 次ã«ããªã³ã«ãŒïŒ
link.exe
ïŒãåŒã³åºãããŸãã 圌ã¯ããªããžã§ã¯ããã¡ã€ã«ã«CILã³ãŒããå«ãŸããŠããããšã確èªããããã¯ãšã³ããåŒã³åºããŸããããã¯ãšã³ãã¯ãWPOãå®è¡ããŠãã€ããªãªããžã§ã¯ããã¡ã€ã«ãçæãããªã³ã«ãŒãããããæ¥ç¶ããŠå®è¡å¯èœãã¡ã€ã«ã圢æã§ããããã«ããŸãã
ããã³ããšã³ãã¯ãæé©åã®ãªã³/ãªãã«é¢ä¿ãªããããã€ãã®æé©åïŒæãããã¿å®æ°ãªã©ïŒãå®è¡ããŸãã ãã ããéèŠãªæé©åã¯ãã¹ãŠããã¯ãšã³ãã«ãã£ãŠå®è¡ãããã³ã³ãã€ã«ããŒã䜿çšããŠå¶åŸ¡ã§ããŸãã
LTCGã䜿çšãããšãããã¯ãšã³ãã§å€ãã®æé©åãç©æ¥µçã«å®è¡ã§ããŸãïŒ
/O1
ãŸãã¯
/O2
ããã³
/Gw
ãšãšãã«
/GL
ã³ã³ãã€ã©ããŒãããã³
/OPT:REF
ããã³
/OPT:ICF
ãªã³ã¯ããŒã䜿çšïŒã ãã®èšäºã§ã¯ãã€ã³ã©ã€ã³åãšCOMDATæé©åã®ã¿ã«ã€ããŠèª¬æããŸãã LTCGæé©åã®å®å
šãªãªã¹ãã¯ãããã¥ã¡ã³ãã«èšèŒãããŠããŸãã ãªã³ã«ã¯ããã€ãã£ãããã€ãã£ã管çãããã³çŽç²ã«ç®¡çããããªããžã§ã¯ããã¡ã€ã«ãããã³å®å
šãªç®¡çãªããžã§ã¯ããã¡ã€ã«ãšsafe.netmodulesã§LTCGãå®è¡ã§ããããšãç¥ã£ãŠãããšåœ¹ç«ã¡ãŸãã
2ã€ã®ãœãŒã¹ã³ãŒããã¡ã€ã«ïŒ
source1.c
ããã³
source2.c
ïŒãšããããŒãã¡ã€ã«ïŒ
source2.h
ïŒã®ããã°ã©ã ã䜿çšããŸãã
source1.c
ããã³
source2.c
ã以äžã®ãªã¹ãã«ç€ºããŸãããã¹ãŠã®
source2.c
é¢æ°ã®ãããã¿ã€ããå«ãããããŒãã¡ã€ã«ã¯éåžžã«åçŽãªã®ã§ã説æããŸããã
// source1.c #include <stdio.h> // scanf_s and printf. #include "Source2.h" int square(int x) { return x*x; } main() { int n = 5, m; scanf_s("%d", &m); printf("The square of %d is %d.", n, square(n)); printf("The square of %d is %d.", m, square(m)); printf("The cube of %d is %d.", n, cube(n)); printf("The sum of %d is %d.", n, sum(n)); printf("The sum of cubes of %d is %d.", n, sumOfCubes(n)); printf("The %dth prime number is %d.", n, getPrime(n)); }
// source2.c #include <math.h> // sqrt. #include <stdbool.h> // bool, true and false. #include "Source2.h" int cube(int x) { return x*x*x; } int sum(int x) { int result = 0; for (int i = 1; i <= x; ++i) result += i; return result; } int sumOfCubes(int x) { int result = 0; for (int i = 1; i <= x; ++i) result += cube(i); return result; } static bool isPrime(int x) { for (int i = 2; i <= (int)sqrt(x); ++i) { if (x % i == 0) return false; } return true; } int getPrime(int x) { int count = 0; int candidate = 2; while (count != x) { if (isPrime(candidate)) ++count; } return candidate; }
source1.c
ãã¡ã€ã«ã«ã¯ãæŽæ°ã®2ä¹ãèšç®ãã2ä¹é¢æ°ãšãããã°ã©ã
main
mainé¢æ°ã®2ã€ã®é¢æ°ãå«ãŸããŠããŸãã ã¡ã€ã³é¢æ°ã¯ãæ£æ¹åœ¢é¢æ°ãšã
source2.c
ãé€ã
source2.c
ãã¹ãŠã®é¢æ°ã
isPrime
ãŸãã
source2.c
ãã¡ã€ã«ã«ã¯ãæŽæ°ã3
cube
ããã®
cube
ã1ããç¹å®ã®æ°ãŸã§ã®æŽæ°ã®
sum
ãèšç®ããããã®åèšã1ããç¹å®ã®æ°ãŸã§ã®æŽæ°ã®ãã¥ãŒãã®åèšãèšç®ããããã®
getPrime
ãç°¡åã«ããããã«æ°ã確èªããããã®
isPrime
ã
isPrime
5ã€ã®é¢æ°ãå«ãŸããŸãæå®ãããæ°ã®çŽ æ°ãååŸããŸãã ãã®èšäºã§ã¯èå³ããªãã®ã§ããšã©ãŒåŠçãã¹ãããããŸããã
ã³ãŒãã¯éåžžã«ã·ã³ãã«ã§ããã䟿å©ã§ãã åçŽãªèšç®ãè¡ãããã€ãã®é¢æ°ãããããããã®ããã€ãã¯ã«ãŒããå«ãã§ããŸãã
getPrime
é¢æ°ã¯ããã®äžã«
getPrime
é¢æ°ãåŒã³åºã
while
ãå«ãŸããŠãã
getPrime
ãæãè€éã§ãã ãã®ã³ãŒãã䜿çšããŠãã³ã³ãã€ã©ãŒã®æé©åãšããã€ãã®è¿œå ã®æé©åãã€ã³ã©ã€ã³åããéèŠãªé¢æ°ã®1ã€ã瀺ããŸãã
3ã€ã®ç°ãªãæ§æã§ã®ã³ã³ãã€ã©ãŒã®çµæãæ€èšããŠãã ããã èªåã§ãµã³ãã«ãæ±ãå Žåã¯ãå®è¡ãããCOMDATæé©åã調ã¹ãããã«ãã¢ã»ã³ãã©ãŒåºåãã¡ã€ã«ïŒã³ã³ãã€ã©ãŒããŒ
/FA[s]
ã䜿çšããŠååŸïŒããã³ããããã¡ã€ã«ïŒãªã³ã«ãŒ
/MAP
ããŒã䜿çšããŠååŸïŒãå¿
èŠã§ãïŒãªã³ã«ãŒã¯ããããå ±åããŸãïŒ
/verbose:icf
ããã³
/verbose:ref
/verbose:icf
ãå«ããå ŽåïŒã ãã¹ãŠã®ããŒãæ£ããããšã確èªããèšäºãèªã¿ç¶ããŸãã CïŒ
/TC
ïŒã³ã³ãã€ã©ãŒã䜿çšããŠãçæãããã³ãŒããåŠç¿ããããããŸãããèšäºã«èšèŒãããŠãããã®ã¯ãã¹ãŠC ++ã³ãŒãã«ãé©çšãããŸãã
ãããã°æ§æ
ãããã°æ§æãäž»ã«äœ¿çšãããã®ã¯ã
/GL
ã¹ã€ãããªãã§
/Od
ã¹ã€ãããæå®ãããšããã¹ãŠã®ããã¯ãšã³ãæé©åããªãã«ãªãããã§ãã ãã®æ§æã§ã¯ãçµæã®ãªããžã§ã¯ããã¡ã€ã«ã«ã¯ããœãŒã¹ã³ãŒããšå®å
šã«äžèŽãããã€ããªã³ãŒããå«ãŸããŠããŸãã çµæã®ã¢ã»ã³ãã©åºåãã¡ã€ã«ãšããããã¡ã€ã«ã調ã¹ãŠãããã確èªã§ããŸãã ãã®æ§æã¯ãVisual Studioã®ãããã°æ§æãšåçã§ãã
ã³ã³ãã€ã«æã³ãŒãçæãªãªãŒã¹æ§æ
ãã®æ§æã¯ããªãªãŒã¹æ§æïŒ
/O1
ã
/O2
ãŸãã¯
/Ox
ã¹ã€ãããæå®ïŒã«äŒŒãŠããŸããã
/GL
ã¹ã€ããã¯å«ãŸããŠããŸããã ãã®æ§æã§ã¯ãçµæã®ãªããžã§ã¯ããã¡ã€ã«ã«ã¯æé©åããããã€ããªã³ãŒããå«ãŸããŸãããããã°ã©ã å
šäœã®ã¬ãã«ã®æé©åã¯å®è¡ãããŸããã
source1.c
çæãããã¢ã»ã³ããªãªã¹ããã¡ã€ã«ã
source1.c
ã2ã€ã®éèŠãªæé©åãè¡ãããŠããããšã
source1.c
ãŸãã
square
é¢æ°ã®æåã®åŒã³åºãã§ãã
square(n)
ãã³ã³ãã€ã«æã«èšç®ãããå€ã«çœ®ãæããããŸããã ããã¯ã©ã®ããã«èµ·ãããŸãããïŒ ã³ã³ãã€ã©ãŒã¯ãé¢æ°ã®æ¬äœãå°ããããšã«æ°ä»ãããã®å
容ãåŒã³åºãã«çœ®ãæããããšã«ããŸããã 次ã«ãã³ã³ãã€ã©ãŒã¯ãå€ã®èšç®ã«æ¢ç¥ã®åæå€ãæã€ããŒã«ã«å€æ°
n
ããããåæå²ãåœãŠãšé¢æ°åŒã³åºãã®éã§å€åããªããšããäºå®ã«æ³šæãåŒããŸããã ãããã£ãŠã圌ã¯ä¹ç®æŒç®ã®å€ãèšç®ããçµæã眮ãæããããšãå®å
šã§ãããšããçµè«ã«éããŸããïŒ
25
ïŒã
square
é¢æ°ã®2çªç®ã®åŒã³åºã
square(m)
ãã€ã³ã©ã€ã³ã§ãããã€ãŸããé¢æ°ã®æ¬äœãåŒã³åºãã«çœ®ãæããããŸããã ãã ããå€æ°mã®å€ã¯ã³ã³ãã€ã«æã«ã¯äžæã§ãããããã³ã³ãã€ã©ã¯äºåã«åŒã®å€ãèšç®ã§ããŸããã§ããã
ããã§ã¯ã
source2.c
ã¢ã»ã³ããªãªã¹ããã¡ã€ã«ã
source2.c
ã¿ãŸãããã
sumOfCubes
é¢æ°ã®
cube
é¢æ°ã®åŒã³åºãã¯ã€ã³ã©ã€ã³ã§ããã ããã«ãããã³ã³ãã€ã©ã¯ã«ãŒãã®æé©åãå®è¡ã§ããŸãïŒããã«ã€ããŠã¯ããã«ãŒãã®æé©åãã»ã¯ã·ã§ã³ã§è©³ãã説æããŸãïŒã
isPrime
é¢æ°ã¯ãSSE2åœä»€ã䜿çšããŠã
sqrt
åŒã³åºããããšãã«
int
ã
double
ã«å€æãã
sqrt
ããçµæãååŸãããšãã«
double
ãã
int
ã«å€æããŸããã å®éãã«ãŒãã®éå§åã«
sqrt
1ååŒã³åºãããŸããã
/arch
ã¹ã€ããã¯ãx86ãããã©ã«ãã§SSE2ã䜿çšããããšãã³ã³ãã€ã©ãŒã«éç¥ããããšã«æ³šæããŠãã ããïŒã»ãšãã©ã®x86ããã»ããµãŒããã³x86-64ããã»ããµãŒã¯SSE2ããµããŒãããŸãïŒã
ãªã³ã¯æã³ãŒãçæãªãªãŒã¹æ§æ
ãã®æ§æã¯ãVisiual Studioã®ãªãªãŒã¹æ§æãšåãã§ããæé©åãæå¹ã«ãªãã
/GL
ã³ã³ãã€ã©ããŒãæå®ãããŸãïŒ
/O1
ãŸãã¯
/O2
æ瀺çã«æå®ããããšãã§ããŸãïŒã ãããã£ãŠãã¢ã»ã³ããªãªããžã§ã¯ããã¡ã€ã«ã®ä»£ããã«CILã³ãŒãã§ãªããžã§ã¯ããã¡ã€ã«ãçæããããã³ã³ãã€ã©ãŒã«æ瀺ããŸãã ããã¯ãäžèšã®ããã«ããªã³ã«ãã³ã³ãã€ã©ã®ããã¯ãšã³ããåŒã³åºããŠWPOãå®è¡ããããšãæå³ããŸãã ããã§ãLTCGã®å€§ããªå©ç¹ã瀺ãããã«ãããã€ãã®WPOã«ã€ããŠèª¬æããŸãã ãã®æ§æçšã«çæãããã¢ã»ã³ããªã³ãŒãã®ãªã¹ãã¯ããªã³ã©ã€ã³ã§å
¥æã§ããŸãã
é¢æ°ã®ã€ã³ã©ã€ã³åããªã³ã«ãªã£ãŠããéïŒæé©åããªã³ã«ãããšãªã³ã«ãªã
/Ob
ã¹ã€ããïŒã
/GL
ã¹ã€ããã䜿çšãããšãã³ã³ãã€ã©ãŒã¯
/Gy
ã¹ã€ããã«é¢ä¿ãªãä»ã®ãã¡ã€ã«ã§å®çŸ©ãããé¢æ°ãã€ã³ã©ã€ã³åã§ããŸãïŒåŸã§è©³ãã説æããŸãïŒã
/LTCG
ãªãã·ã§ã³ã§ããããªã³ã«ãŒã«ã®ã¿åœ±é¿ããŸãã
source1.c
ã¢ã»ã³ããªãªã¹ããã¡ã€ã«ã
source1.c
ã
scanf_s
ãé€ããã¹ãŠã®é¢æ°ã®åŒã³åºããã€ã³ã©ã€ã³ã§ããããšã
source1.c
ãŸãã ãã®çµæãã³ã³ãã€ã©ã¯é¢æ°
cube
ã
sum
ããã³
sumOfCubes
ãèšç®ã§ããŸããã
isPrime
é¢æ°ã®ã¿
isPrime
ã€ã³ã©ã€ã³å
isPrime
ãŸããã§ããã ãã ãã
getPrime
ã§æåã§ã€ã³ã©ã€ã³åãã
getPrime
ãã³ã³ãã€ã©ãŒã¯
getPrime
ã§ã€ã³ã©ã€ã³
getPrime
ãå®è¡ããŸãã
ã芧ã®ãšãããé¢æ°ã®ã€ã³ã©ã€ã³åã¯ãé¢æ°åŒã³åºããæé©åãããã ãã§ãªããã³ã³ãã€ã©ãŒãå€ãã®è¿œå ã®æé©åãå®è¡ã§ããããéèŠã§ãã ã€ã³ã©ã€ã³åã¯éåžžãã³ãŒãã®ãµã€ãºãå¢ããããšã§ããã©ãŒãã³ã¹ãåäžãããŸãã ãã®æé©åãé床ã«äœ¿çšãããšãã³ãŒãã®èšåŒµãšåŒã°ããçŸè±¡ãçºçããŸãã ãããã£ãŠãé¢æ°ãåŒã³åºããã³ã«ãã³ã³ãã€ã©ãŒã¯ã³ã¹ããšå©ç¹ãèšç®ããé¢æ°ãã€ã³ã©ã€ã³åãããã©ããã決å®ããŸãã
ã€ã³ã©ã€ã³åã®éèŠæ§ã«ãããVisual C ++ã³ã³ãã€ã©ã¯ã€ã³ã©ã€ã³åã匷åã«ãµããŒãããŸãã
auto_inline
ãã£ã¬ã¯ãã£ãã䜿çšããŠãé¢æ°ã»ãããã€ã³ã©ã€ã³åããªãããã«ã³ã³ãã€ã©ãŒã«æ瀺ã§ããŸãã
__declspec(noinline)
ã䜿çšããŠãæå®ãããé¢æ°ãŸãã¯ã¡ãœãããã³ã³ãã€ã©ãŒã«äŒããããšãã§ããŸãã é¢æ°ã
inline
ã§ããŒã¯ããã³ã³ãã€ã©ãŒã«ã€ã³ã©ã€ã³ãå®è¡ããããã«ã¢ããã€ã¹ããããšãã§ããŸãïŒãã ããã³ã³ãã€ã©ãŒã¯ããããæªããšå€æããå Žåããã®ã¢ããã€ã¹ãç¡èŠããããšãã§ããŸãïŒã
inline
ã¯ãC ++ã®æåã®ããŒãžã§ã³ãã䜿çšå¯èœã§ãããC99ã§ç»å ŽããŸããã CãšC ++ã®äž¡æ¹ã«Microsoftã®
__inline
ã³ã³ãã€ã©ããŒã¯ãŒãã䜿çšã§ããŸããããã¯ããã®ããŒã¯ãŒãããµããŒãããªãå€ãããŒãžã§ã³ã®Cã䜿çšããå Žåã«äŸ¿å©ã§ãã
__forceinline
ïŒCããã³C ++ã®å ŽåïŒã¯ãå¯èœã§ããã°ãã³ã³ãã€ã©ãŒãåžžã«é¢æ°ãã€ã³ã©ã€ã³åããããã«åŒ·å¶ããŸãã æåŸã«ã
inline_recursion
ããšãšããŠã
inline_recursion
ãã£ã¬ã¯ãã£ãã䜿çšããŠã€ã³ã©ã€ã³åããããšã«ãããæå®ããæ·±ããŸãã¯äžå®ã®æ·±ãã®ååž°é¢æ°ããããã€ããããã³ã³ãã€ã©ãŒã«æ瀺ã§ããŸãã çŸæç¹ã§ã¯ãã³ã³ãã€ã©ãŒã¯é¢æ°åŒã³åºãã®å Žæã§ã€ã³ã©ã€ã³å±éãå¶åŸ¡ããæ©èœãæããããã®å®£èšã®å Žæã§ã¯æ©èœããªãããšã«æ³šæããŠãã ããã
/Ob0
ã¯ãã€ã³ã©ã€ã³åãå®å
šã«ç¡å¹ã«ããŸããããã¯ããããã°äžã«åœ¹ç«ã¡ãŸãïŒãã®ã¹ã€ããã¯ãVisual Studioã®ãããã°æ§æã§æ©èœããŸãïŒã
/Ob1
ã¯ã
inline
ã
/Ob1
inline
ã
/Ob1
ããŒã¯ãããé¢æ°ã®ã¿ã
__forceinline
åè£ãšèŠãªãããã³ã³ãã€ã©ãŒã«æ瀺ããŸãã
/Ob2
ã¯ãæå®ããã
/O[1|2|x]
ã§ã®ã¿åäœããã€ã³ã©ã€ã³åã®ããã«ãã¹ãŠã®é¢æ°ãèæ
®ããããã³ã³ãã€ã©ãŒã«æ瀺ããŸãã ç§ã®æèŠã§ã¯ã
inline
ããã³
__inline
ã䜿çšããå¯äžã®çç±ã¯ã
/Ob1
ããŒã®ã€ã³ã©ã€ã³åãå¶åŸ¡ããããšã§ãã
ã³ã³ãã€ã©ã¯åžžã«é¢æ°ãã€ã³ã©ã€ã³åã§ããããã§ã¯ãããŸããã äŸãã°ãä»®æ³é¢æ°ã®ä»®æ³åŒã³åºãäžïŒã³ã³ãã€ã©ãŒã¯ã©ã®é¢æ°ãåŒã³åºãããããæ£ç¢ºã«ç¥ããªããããé¢æ°ãã€ã³ã©ã€ã³åããããšã¯ã§ããŸããã å¥ã®äŸïŒé¢æ°ã¯ãååãä»ããåŒã³åºãã§ã¯ãªããé¢æ°ãžã®ãã€ã³ã¿ãŒãä»ããŠåŒã³åºãããŸãã ã€ã³ã©ã€ã³åãå¯èœã«ãªãããã«ããã®ãããªç¶æ³ãé¿ããããã«ããŠãã ããã ãã®ãããªãã¹ãŠã®æ¡ä»¶ã®å®å
šãªãªã¹ãã¯ãMSDNã§èŠã€ããããšãã§ããŸãã
ããã°ã©ã ã®ã¬ãã«ã§å
šäœãšããŠé©çšã§ããæé©åã¯ãé¢æ°ã®ã€ã³ã©ã€ã³åã ãã§ã¯ãããŸããã ã»ãšãã©ã®æé©åã¯ããã®ã¬ãã«ã§æãå¹æçã«æ©èœããŸãã ãã®èšäºã®æ®ãã®éšåã§ã¯ãCOMDATæé©åãšåŒã°ããç¹å®ã®ã¯ã©ã¹ã®æé©åã«ã€ããŠèª¬æããŸãã
ããã©ã«ãã§ã¯ãã¢ãžã¥ãŒã«ã®ã³ã³ãã€ã«äžããã¹ãŠã®ã³ãŒãã¯çµæã®ãªããžã§ã¯ããã¡ã€ã«ã®åäžã»ã¯ã·ã§ã³ã«ä¿åãããŸãã ãªã³ã«ã¯ã»ã¯ã·ã§ã³ã¬ãã«ã§åäœããŸããã»ã¯ã·ã§ã³ã®åé€ãçµåã䞊ã¹æ¿ããã§ããŸãã ããã«ãããå®è¡ãã¡ã€ã«ã®ãµã€ãºãçž®å°ããããã©ãŒãã³ã¹ãåäžããã3ã€ã®éåžžã«éèŠãªæé©åïŒ2æ¡ã®ããŒã»ã³ãïŒãå®è¡ã§ããªããªããŸãã 1ã€ç®ã¯ãæªäœ¿çšã®é¢æ°ãšã°ããŒãã«å€æ°ãåé€ããŸãã 2çªç®ã¯ãåäžã®é¢æ°ãšã°ããŒãã«å®æ°ãæãããã¿ãŸãã 3çªç®ã®é¢æ°ã¯ãå®è¡æã«ç©çã¡ã¢ãªãã©ã°ã¡ã³ãéã®é·ç§»ãçããªãããã«ãé¢æ°ãšã°ããŒãã«å€æ°ã䞊ã¹æ¿ããŸãã
ãããã®ãªã³ã«æé©åãæå¹ã«ããã«ã¯ãã³ã³ãã€ã©ããŒ
/Gy
ïŒãªã³ã¯é¢æ°ã¬ãã«ïŒããã³
/Gw
ïŒã°ããŒãã«ããŒã¿ã®æé©åïŒã䜿çšããŠãé¢æ°ãšå€æ°ãå¥ã
ã®ã»ã¯ã·ã§ã³ã«ããã¯ããããã³ã³ãã€ã©ã«äŸé Œããå¿
èŠããããŸãã ãããã®ã»ã¯ã·ã§ã³ã¯COMDATãšåŒã°ããŸãã
__declspec( selectany)
ã䜿çšããŠç¹å®ã®ã°ããŒãã«å€æ°ãããŒã¯ããCOMDATã§å€æ°ãããã±ãŒãžåããããã³ã³ãã€ã©ãŒã«æ瀺ããããšãã§ããŸãã ããã«ã
/OPT:REF
ãªã³ã«ããŒã䜿çšãããšãæªäœ¿çšã®é¢æ°ãšã°ããŒãã«å€æ°ãåé€ã§ããŸãã ããŒ
/OPT:ICF
ã¯ãåäžã®é¢æ°ãšã°ããŒãã«å®æ°ãæããããã®ã«åœ¹ç«ã¡ãŸãïŒICFã¯åäžã®COMDATãã©ãŒã«ãã£ã³ã°ã§ãïŒã
/ORDER
ã¹ã€ããã«ããããªã³ã«ã¯ç¹å®ã®é åºã§çµæã®ã€ã¡ãŒãžã«COMDATãé
眮ããŸãã ãã¹ãŠã®ãªã³ã«æé©åã«ã¯
/GL
ããŒãå¿
èŠãªãããšã«æ³šæããŠãã ããã
/OPT:REF
ããã³
/OPT:ICF
ã¹ã€ããã¯ãæãããªçç±ã§ãããã°äžã«ãªãã«ããå¿
èŠããããŸãã
å¯èœãªéãLTCGã䜿çšããå¿
èŠããããŸãã LTCGãæŸæ£ããå¯äžã®çç±ã¯ãçµæã®ãªããžã§ã¯ããã¡ã€ã«ãšã©ã€ãã©ãªãã¡ã€ã«ãé
åžããããã§ãã ãã·ã³ã³ãŒãã®ä»£ããã«CILã³ãŒããå«ãŸããŠããããšãæãåºããŠãã ããã éçºè
ããã¡ã€ã«ã䜿çšããã«ã¯åãããŒãžã§ã³ã®ã³ã³ãã€ã©ã䜿çšããå¿
èŠããããããCILã³ãŒãã¯ãçæãããåãããŒãžã§ã³ã®ã³ã³ãã€ã©ãšãªã³ã«ã§ã®ã¿äœ¿çšã§ããŸããããã¯å€§ããªå¶éã§ãã ãã®å Žåãã³ã³ãã€ã©ã®ããŒãžã§ã³ããšã«ãªããžã§ã¯ããã¡ã€ã«ã®åå¥ã®ããŒãžã§ã³ãé
åžããããªãå Žåã¯ã代ããã«ã³ãŒãçæã䜿çšããå¿
èŠããããŸãã ããŒãžã§ã³å¶éã«å ããŠããªããžã§ã¯ããã¡ã€ã«ã¯ã察å¿ããã¢ã»ã³ãã©ãªããžã§ã¯ããã¡ã€ã«ãããäœåã倧ãããªããŸãã ãã ããCILã³ãŒããæã€ãªããžã§ã¯ããã¡ã€ã«ã®å€§ããªå©ç¹ãå¿ããªãã§ãã ãããããã¯WPOã䜿çšããæ©èœã§ãã
ã«ãŒãæé©å
Visual C ++ã³ã³ãã€ã©ã¯ãããã€ãã®ã¿ã€ãã®ã«ãŒãæé©åããµããŒãããŠããŸãããã«ãŒãã¢ã³ããŒã«ãèªåãã¯ãã«åãããã³ã«ãŒãäžå€ã³ãŒãã¢ãŒã·ã§ã³ã®3ã€ã®ã¿ã«ã€ããŠèª¬æããŸãã
source1.c
ã®ã³ãŒããå€æŽããŠãnã§ã¯ãªãmã
sumOfCubes
ã«æž¡ãããããã«ããå Žåãã³ã³ãã€ã©ãŒã¯ãã©ã¡ãŒã¿ãŒã®å€ãèšç®ã§ããªããªããŸããä»»æã®åŒæ°ã§æ©èœããããã«é¢æ°ãã³ã³ãã€ã«ããå¿
èŠããããŸãã çµæã®é¢æ°ã¯å€§ããæé©åããããããã³ã³ãã€ã©ãŒã¯ã€ã³ã©ã€ã³åãããŸããã
/O1
ã¹ã€ããã䜿çšããŠã³ãŒããã³ããŒãããšã
sumOfCubes
æé©åã¯é©çšãã
sumOfCubes
ã
/O2
ã¹ã€ããã䜿çšããŠã³ã³ãã€ã«ãããšãé床ãæé©åãããŸãã ãã®å Žåã
sumOfCubes
é¢æ°å
ã®ã«ãŒããå·»ãæ»ãããŠãã¯ãã«åããã
sumOfCubes
ãã³ãŒããµã€ãºã倧å¹
ã«å¢å ããŸãã ãã¥ãŒãé¢æ°ãã€ã³ã©ã€ã³åããªããšãã¯ãã«åãã§ããªãããšãç解ããããšã¯éåžžã«éèŠã§ãã ããã«ããµã€ã¯ã«ãå·»ãæ»ãããšã¯ãã€ã³ã©ã€ã³åãªãã§ã¯ããã»ã©å¹æçã§ã¯ãããŸããã æçµã³ãŒãã®ç°¡ç¥åãããã°ã©ãã£ã«ã«ãªè¡šçŸã次ã®å³ã«ç€ºããŸãïŒãã®ã°ã©ãã¯x86ãšx86-64ã®äž¡æ¹ã«æå¹ã§ãïŒã

ãã®å³ã§ã¯ãç·è²ã®è±åœ¢ã¯å
¥å£ç¹ã瀺ããèµ€è²ã®é·æ¹åœ¢ã¯åºå£ç¹ã瀺ããŸãã éãè±åœ¢ã¯ã
sumOfCubes
é¢æ°ã
sumOfCubes
ãããšãã«å®è¡ãããæ¡ä»¶ã¹ããŒãã¡ã³ããè¡šããŸãã SSE4ããµããŒããããxã8以äžã®å ŽåãSSE4åœä»€ã䜿çšããŠäžåºŠã«4ã€ã®ä¹ç®ãå®è¡ããŸãã è€æ°ã®å€æ°ã«å¯ŸããŠåãæäœãå®è¡ããããã»ã¹ã¯ããã¯ãã«åãšåŒã°ããŸãã ã³ã³ãã€ã©ã¯ãã®ã«ãŒãã2åã»ã©ã»ã©ããŸãã ããã¯ãã«ãŒãã®æ¬äœãåå埩ã§2åç¹°ãè¿ãããããšãæå³ããŸãã çµæãšããŠãä¹ç®ã®8ã€ã®æŒç®ã®ããã©ãŒãã³ã¹ã¯1åã®å埩ã§çºçããŸãã
x
8æªæºã®å Žåãæé©åãããŠããªãã³ãŒããé¢æ°ã®å®è¡ã«äœ¿çšãããŸãã ã³ã³ãã€ã©ãŒã¯1ã€ã§ã¯ãªã3ã€ã®åºå£ç¹ãæ¿å
¥ããããšã«æ³šæããŠãã ããããããã£ãŠãé·ç§»ã®æ°ãæžããŸãã
ãµã€ã¯ã«ã®å·»ãæ»ãã¯ãæ°ããïŒå·»ãæ»ãããïŒãµã€ã¯ã«ã®1åã®ç¹°ãè¿ãå
ã§ãµã€ã¯ã«ã®æ¬äœãæ°åç¹°ãè¿ãããšã«ãã£ãŠå®è¡ãããŸãã ããã«ããããµã€ã¯ã«èªäœã®æäœã®å®è¡é »åºŠãäœããªããããçç£æ§ãåäžããŸãã ããã«ãããã«ãããã³ã³ãã€ã©ãŒã¯è¿œå ã®æé©åïŒãã¯ãã«åãªã©ïŒãå®è¡ã§ããŸãã å·»ãæ»ãã«ãŒãã®æ¬ ç¹ã¯ãã³ãŒãã®éãšã¬ãžã¹ã¿ã®è² è·ãå¢å ããããšã§ãã ããããããã«ããããããããµã€ã¯ã«ã®æ¬äœã«å¿ããŠããã®ãããªæé©åã¯çç£æ§ã2æ¡ã®å²åã§é«ããããšãã§ããŸãã
x86ããã»ããµãšã¯ç°ãªãããã¹ãŠã®x86-64ããã»ããµã¯SSE2ããµããŒãããŠããŸãã ããã«ã
/arch
ã¹ã€ããã䜿çšããŠãIntelããã³AMDã®ææ°ã®x86-64ã¢ãã«ã§AVX / AVX2åœä»€ãå©çšã§ããŸãã
/arch:AVX2
æå®ããããšã«ãããFMAããã³BMIåœä»€ã䜿çšããããã³ã³ãã€ã©ãŒã«æ瀺ããŸãã
çŸåšãVisual C ++ã³ã³ãã€ã©ã§ã¯ãã«ãŒãã®å·»ãæ»ããå¶åŸ¡ã§ããŸããã ãã ãã
no_vector
ãªãã·ã§ã³ãæå®ãã
loop
ãã£ã¬ã¯ãã£ãã䜿çšããŠã圱é¿ãäžããããšãã§ããŸãïŒåŸè
ã¯ãæå®ãããã«ãŒãã®
no_vector
ãã¯ãã«åãç¡å¹ã«ããŸãïŒã
çæãããã¢ã»ã³ãã©ã³ãŒããèŠããšãè¿œå ã®æé©åãé©çšã§ããããšãããããŸãã ãšã«ãããã³ã³ãã€ã©ãŒã¯ãšã«ããçŽ æŽãããä»äºãããŠãããã®ã§ããã€ããŒãªæé©åãé©çšããããã«åæããã®ã«å€ãã®æéãè²»ããå¿
èŠã¯ãããŸããã
someOfCubes
é¢æ°
someOfCubes
ãã«ãŒãã解ãããå¯äžã®ãã®ã§
someOfCubes
ãŸããã ã³ãŒããå€æŽããŠ
n
代ããã«
m
ã
sum
é¢æ°ã«æž¡ããšãã³ã³ãã€ã©ãŒã¯ãã®å€ãèšç®ã§ãããã³ãŒããçæããå¿
èŠããããã«ãŒãã2åå·»ãæ»ãããŸãã
çµè«ãšããŠããµã€ã¯ã«äžå€éã®é€å»ãªã©ã®æé©åãæ€èšããŸãã 次ã®ã³ãŒããèŠãŠãã ããã
int sum(int x) { int result = 0; int count = 0; for (int i = 1; i <= x; ++i) { ++count; result += i; } printf("%d", count); return result; }
è¡ã£ãå¯äžã®å€æŽã¯ãè¿œå ã®å€æ°ãè¿œå ããããšã§ãããã®å€æ°ã¯åå埩ã§å¢å ããæåŸã«ã³ã³ãœãŒã«ã«è¡šç€ºãããŸãã ãã®ã³ãŒãã¯ãå¢åãããå€æ°ãã«ãŒãå€ã«ç§»åããããšã§ç°¡åã«æé©åãããããšãããããŸã
x
ãå²ãåœãŠãã ãã§ãã ãã®æé©åã¯ãã«ãŒãäžå€ã³ãŒãã¢ãŒã·ã§ã³ãšåŒã°ããŸãã ãäžå€ããšããèšèã¯ãã³ãŒãã®äžéšãã«ãŒãå€æ°ãå«ãåŒããç¬ç«ããŠããå Žåã«ãã®ææ³ãé©çšå¯èœã§ããããšã瀺ããŠããŸãã
: , . ? ,
x
. ,
count
. x count, ! ,
x
,
count
. , . , Visual C++ , ,
x
.
, , , , . .
O1
,
/O2
,
/Ox
,
optimize
:
#pragma optimize( "[optimization-list]", {on | off} )
optimization list , :
g
,
s
,
t
,
y
.
/Og
,
/Os
,
/Ot
,
/Oy
.
c
off
.
on
.
/Og
, , , .
LTCG
,
/Og
WPO.
optimize
, , : , . , , profile-guided- (PGO), , , . , . Visual Studio , , .
.NET
.NET , . (C# compiler) JIT-. . , . JIT-. JIT- .NET 4.5 SIMD. JIT- .NET 4.5.1 ( RyuJIT) SIMD.
RyuJIT Visual C++ ? , RyuJIT , , Visual C++ . , ,
true
, . RyuJIT . , SSE4.1, JIT- SSE4.1
subOfCubes
, . , RyuJIT , . . JIT- . Visual C++ , . Microsoft .NET Native Visual C++. Windows Store.
. C# Visual Basic
/optimize
. JIT-
System.Runtime.CompilerServices.MethodImpl
MethodImplOptions
.
NoOptimization
,
NoInlining
,
AggressiveInlining
( .NET 4.5) JIT- , .
ãŸãšã
, , . Visual C++. , , . , Visual C++. , . Visual C++ , . 2.