ã¯ãã¹ãã©ãããã©ãŒã ããã³ã¯ãã¹ããŒããŠã§ã¢ã®æé©å
ã«é¢ããèšäºã®ç¶ãã§ã5ã€ã®ãã£ãŒã«ããš10,000,000è¡ã®ããŒãã«ã§ã®ãã«ãã¹æ€çŽ¢ã®äŸã䜿çšããã€ã³ããã¯ã¹æ€çŽ¢ã§ããã®ã¿ã¹ã¯ã®å¿
ç¶æ§ã䜿çšããŠããã®ãããªæ€çŽ¢ã
3.5-5.3åé«éåããæ¹æ³ã瀺ããŸãããŒããŠã§ã¢ãã©ãããã©ãŒã ã«é¢ä¿ãªã
C ++ ã
åã®èšäºã§ãæ€çŽ¢ã1.3åé«éåããããšãã§ããŸããïŒ
GitHub.comèšèªæ§æãç°¡åã«èª¬æããããšã¯ããŸããããå®éã®ã¿ã¹ã¯ã®æ®µéã®1ã€ã解決ãããšãã®C ++ã®å©ç¹ã瀺ããŸãã
ç§ãã¡ã¯ãŸã MSVC11ïŒMSVS2012ïŒãšGCC 4.7.2ã§ã¯ãã¹ãã©ãããã©ãŒã ãèšè¿°ãããããã§Cã䜿çšããéšåçã«å®è£
ãããæšæºC ++ 11ã§ãã
ããããããããããã«ãã€ã³ããã¯ã¹æ€çŽ¢ãªãã§èšè¿°ããŠããŸããããã®ãœãªã¥ãŒã·ã§ã³ã¯åŸã§ã€ã³ããã¯ã¹æ€çŽ¢ã§äœ¿çšãããŸãã
1. C ++ã®ããŒãã³ã¢ãœãªã¥ãŒã·ã§ã³
ããã¯ãCã§æ¬åœã«ããŒãã³ã¢ãªãœãªã¥ãŒã·ã§ã³ã®ããã«èŠããã¯ãã§ããããã¯ãCéçºè
ã«ãšã£ãŠæ®å¿µãªããšã«ã3840ã®é¢æ°ãäœæããã©ãã§ãééããç¯ããªãããã§ãã Céçºè
ã¯ããããèšè¿°ããŸãããç§ãã¡ã¯ããããéåžžã«æ¬æãæã£ãŠæ±ããC ++ã³ã³ãã€ã©ããããã®3840颿°ãã©ã®ããã«èšè¿°ã§ãããã瀺ããŸãã 圌ã¯ãããè¿
éã«è¡ããŸããããCéçºè
ãæžããããæ¡éãã«éãæ£ç¢ºã«è¡ããŸãã
éåžžã«ç°¡åã§ããDBMSã®çè«ã§ã¯ãè¿°èªã®
selectivity
ïŒ
selectivity
ïŒ-æ¡ä»¶ïŒè¿°èªïŒã®1ã€ã«å¿ããé©åãªããŒãã«è¡ã®å²åãªã©ããããŸãã æ¡ä»¶ã®éžææ§ãäœãã»ã©ããããæ¯èŒããå¿
èŠãæ©ããªããã©ã€ã³ãé©åããªãããšãããã«ããããŸãã ã€ãŸã 以äžã®æ¡ä»¶äžã§æ¯èŒãåãé€ããŸãã
å®éã®DBMSã§ã¯ããã®ããã«ããªããã£ãã€ã¶ãŒã¯çµ±èšãåéããããŒã¿é
åžã¹ã±ãžã¥ãŒã«ã«å¿ããŠéžæåºŠãèšç®ããããã«å¿
èŠãªåŒãéžæããŸãã 仿¥ã¯ããã£ãŒã«ãã®åæã䜿çšãã颿£æ°åŠãšçµã¿åããè«ã§ååã§ãããšæãã®ã§ãç°¡åã«ããããã«ãããŒã¿ã®äžæ§ååžã®èšç®ããã«ãŒãã£ããªãã£ãŒã®éžææ§ãæ€èšããŸãã ïŒåã®ã«ãŒãã£ããªãã£ãŒã¯ãåå
ã®åºæå€ã®å²åã§ããïŒ
éžææ§ïŒè¡æ°ïŒã¯æ¬¡ãšçãããªããŸãïŒ
selectivity = c_array_size * (1 + field.end â field.begin) / cardinality;
é
åã®ãµã€ãºãšåçã«åæ£ãããããŒã¿ã®ã«ãŒãã£ããªãã£ã¯ãã³ã³ãã€ã«ã®æ®µéã§ããã£ãŠããŸãã ãŸããå®è¡æã«åãã£ãŒã«ãã®æ€çŽ¢æ¡ä»¶ã®å¢çãååŸããéžææ§ãèšç®ããŸãã
次ã«ãéžæåºŠãå°ããé ã«ãã£ãŒã«ããéžæããŸãã ãŸããéžæãããã£ãŒã«ãçªå·ã®é åºã«å¿ããŠãæé©ãªé¢æ°ã®æ°å€ã€ã³ããã¯ã¹ãäœæãããããåŒã³åºããŠæ€çŽ¢ããŸãã
æ€çŽ¢æ¡ä»¶ã®ããªã¢ã³ãããšã«æé©åããã颿°ããŸãã¯å€æ
æ§ã¯ã©ã¹ã¯ã2ã€ã®ãã¹ãããããã³ãã¬ãŒãã®å·»ãæ»ãã§çæããŸãã
- æ€çŽ¢æ¡ä»¶ã®ååšã«é¢ãããã¹ãŠã®ãªãã·ã§ã³ãåæããïŒ ä»¥åã®C ++ãœãªã¥ãŒã·ã§ã³ãšåæ§ ïŒ
- æ€çŽ¢èªã®é åºã«é¢ãããã¹ãŠã®ãªãã·ã§ã³ãåæãã
åèšã§ã
(2^5)*5! = 32*120 = 3840
é
åãäœæãããèªã¿èŸŒãŸã
(2^5)*5! = 32*120 = 3840
(2^5)*5! = 32*120 = 3840
ãªããžã§ã¯ãã§ãå®è£
ã¯ç°ãªããŸãããå
±éã®åºæ¬æœè±¡ç¥å
ããããŸãã
1ã€ã®ãã£ãŒã«ãã®ç¯å²ãã§ãã¯ã¯åžžã«äžç·ã«è¡ãããŸãã ã³ã³ãã€ã«æéãé
ãããªãããã«ã1ã€ã®ãã£ãŒã«ãã®æå°å€ãšæå€§å€ã®æ€èšŒãåå¥ã«äº€æãããã亀æãããããŸããã
次ã«ãã³ãŒããã©ã®ããã«èŠããããèŠãŠã¿ãŸãããã
2.äŸåé¢ä¿ãæžãã
ãŸãããœãªã¥ãŒã·ã§ã³ãå®è£
ããã«ã¯ããã³ãã¬ãŒãcompile-time-gettersãä»ããŠæååã®ãã£ãŒã«ããžã®ã¢ã¯ã»ã¹ãå®è£
ããå¿
èŠããããŸãã ãŸããäŸåé¢ä¿ã軜æžããçŽ æŽãããããŒãã¹ã远å ãããŸããã³ãŒãå
ã®ãã£ãŒã«ãã®ã¿ã€ããšæ°ã®å€æŽã¯ã
T_cash_account_row.
è¡ã®æ§é ã®ã¿ã«åœ±é¿ã
T_cash_account_row.
æ€çŽ¢ã¯ã©ã¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯å€æŽãããããã³ãã¬ãŒãæ€çŽ¢ã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åããããšã«ãããä»»æã®ããŒãã«ã§ã®æ€çŽ¢ã®å®è£
ãå®è¡ãããŸãã
ããã¯ããã£ãŒã«ããæã€è¡æ§é ã®ã³ãŒãã®ããã«ãªããŸãã
struct T_cash_account_row {
enum T_field_enum
ãããã©ã«ãã§ã¯åžžã«0ããå§ãŸãæé ã®å€ãæã¡ãŸãïŒ
C ++ 03 7.2åæåå®£èš ïŒã
#include <type_traits>
ã©ã€ãã©ãªã®
std::enable_if<>
ã䜿çšãããšãç¹å®ã®ãã³ãã¬ãŒããã©ã¡ãŒã¿å€ã«å¯ŸããŠã®ã¿é¢æ°/ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãåãåãããšãã§ããŸãã ããã§ãªãå Žåãã€ã³ã¹ã¿ã³ã¹åäžã«çœ®æãšã©ãŒãçºçãã
SFINAEïŒsubstitution-failure-is-not-an-errorïŒã®ååã«åŸã£ãŠã眮æãšã©ãŒãçºçãããšãã³ã³ãã€ã«ãšã©ãŒã¯çºçããã颿°ã€ã³ã¹ã¿ã³ã¹ã¯åã«äœæãããŸããã æšæºã®è©³çްïŒ
C ++ 03 14.8.2ãã³ãã¬ãŒãåŒæ°ã®æšè« ïŒã
ããã¯ãããšãã°æ¬¡ã®ããã«ãgetterãã³ãã¬ãŒããã©ã¡ãŒã¿ãä»ããŠããŸããŸãªã¿ã€ãã®å¿
èŠãªãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããããã«å¿
èŠã§ãã
auto code = row->get_field_value<T_cash_account_row::code_e>();
ãã®å Žåã5ã€ã®ãã£ãŒã«ãã¯ãã¹ãŠåãã¿ã€ãã§ããã
std::enable_if<>
ãªãã§ãå®è¡ã§ããŸãããå
ã«èããŸãã ç§ã®äŸã§ã¯ã5ã€ã®ãã£ãŒã«ãã®ããããã®ã¿ã€ãã倿Žã§ããã²ãã¿ãŒã¯ã³ã³ãã€ã«ããŠæ£åžžã«åäœããŸãã ãã³ãã¬ãŒã颿°ã®ç¹æ®åã«ãã£ãŠããããäœæããå Žåãç°ãªãã¿ã€ãã«ã¢ã¯ã»ã¹ãããšãšã©ãŒãçºçãããšããŸããããšãã°ããã®ãããªã³ãŒãã¯ã³ã³ãã€ã«ãããŸããã
struct T_cash_account_row {
ã³ã³ãã€ã©ã¯ã
get_field_value<>()
颿°ã®ãããŸããªåŒã³åºãã«é¢ãããšã©ãŒãèªç¶ã«ã¹ããŒããŸãã
Ideone.comãã®ããŒãžã§ã³ã¯åé¡ãªã
ã³ã³ãã€ã«ãããŸãïŒ
ideone.comã²ãã¿ãŒã§æ£ãããªããŸãããä»åºŠã¯ãåã®èšäºã®ããã¢ãŒã·ã§ã³ã«äŒŒããã³ãã¬ãŒãã®å±éã䜿çšããŸãããã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ãªããã¡ã³ã¯ã¿ãŒã«äœ¿çšããŸãïŒãã¡ã³ã¯ã¿ãŒã¯ãæŒç®ååŒã³åºã
operator()(âŠ)
ãªãŒããŒããŒããããã¯ã©ã¹
operator()(âŠ)
ïŒïŒ
ãã®ããã¢ãŒã·ã§ã³ã§ã¯ã
last_e
åæã®å€ãšãã³ãã¬ãŒãã²ãã¿ãŒãä»ãããã£ãŒã«ããžã®ã¢ã¯ã»ã¹ã«åºã¥ããŠãåãã£ãŒã«ãã®æ¯èŒãæ¡åŒµããŸãã
ãããŠã次ã®ããã«ãã¡ã³ã¯ã¿ãŒ
struct T_test_pred
ããããã€ããŸãã
ãŸããã¯ã©ã¹
T_filter<>, T_custom_filter<> T_optimized_search<>
ã§ã¯ãããŒãã«è¡ã¿ã€ããæž¡ããããã³ãã¬ãŒããã©ã¡ãŒã¿ãŒ
T_row
ã
T_row
ããšã«
T_row
T_cash_account_row
ããã®å Žåã¯
T_cash_account_row
ã§ãã
ããã§ãããŒãã«ãã£ãŒã«ãã®æ°ãååãããã³ã¿ã€ãã®ãã¹ãŠã®å€æŽã
T_cash_account_row
å
ã«æä»çã«éäžããæ€çŽ¢ã³ãŒãå
šäœããã³ãã¬ãŒãã¯ã©ã¹ããèªåçã«çæãããŸããç®çã®è¡ã®ã¿ã€ãã§ãã³ãã¬ãŒããã€ã³ã¹ã¿ã³ã¹åããã ãã§ãã
T_optimized_search<T_cash_account_row> optimized_search; // C++ optimized search
çµæã®äœæ¥ã³ãŒããžã®ãªã³ã¯ã¯æ¬¡ã®
ãšããã§ã
ãGitHub.comãã®äŸã¯ãã³ãŒãã®éèŠãªé åã§ããŒã ãªãŒããŒããã³ããã©ãŒãã³ã¹ã¢ãŒããã¯ããã¢ãžã¥ãŒã«ã®å€éšã€ã³ã¿ãŒãã§ã€ã¹ã ãã§ãªãããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠéä¿¡ããããªããžã§ã¯ãã®ã¿ã€ãã«ã泚æãæãå¿
èŠãããçç±ãæç¢ºã«ç€ºããŠããŸãã ç§ãã¡ã®å Žåããããã¯
T_cash_account_row T_range_filters
ã§ãã
T_cash_account_row
ãã³ãã¬ãŒãã²ãã¿ãŒãä»ããŠãã©ã¡ãŒã¿ãŒãæž¡ãæ©èœãèšå®ãã
T_cash_account_row
ããã³ãã¬ãŒãã®ããã¢ãŒã·ã§ã³ãéããŠã¢ãžã¥ãŒã«ã®éçºè
ã«ããããæè»ãªå®è£
ãããã³TDDãã¹ãã«ããéçºææ³ã䜿çšããå Žåã®ãã¹ãã®ããæè»ãªå®è£
ãäºåã«æ±ºå®ããŸãã
ã³ã³ãã€ã©ãŒMSVC11ïŒMSVS2012ïŒããã³CPU Core i5 K750ã®1ã€ã®ã³ã¢ã§ã¯ãçµæã¯æ¬¡ã®ããã«ãªããŸãã
çæãããè¡ïŒ10,000,000
C ++-æ€çŽ¢äž...
C ++-æé©åãããæ€çŽ¢ã«ã¯0.056000ç§ããããŸããã
èŠã€ãã£ãè¡ïŒ38
Cæ€çŽ¢...
C-searchã«ã¯0.074000ç§ããããŸããã
Cããé«éãªC ++ïŒ1.321429å
èŠã€ãã£ãè¡ïŒ38
ã芧ã®ãšãããC ++ã³ãŒãã¯Cã³ãŒãã®1.3åé«éã§ãããçµæã®
test_predicate
颿°ã®
test_predicate
ã³ãŒãã¯ä»¥åã®C ++ããŒãžã§ã³
test_pradicate_enum_cpp.asmãšåãã§ãã
ãTortoiseDiffããã®äžå¿«ãªç»åã

ããããä»ã§ã¯ãã¹ãŠã®å€æŽã1ãæã«éäžããŠããããããã®æ€çŽ¢ã¢ãžã¥ãŒã«ã®äœ¿çšãéåžžã«å®¹æã«ãªããŸãã
ããã«ãå¥ã®ããçç£çãªæé©åã®ããã«ã³ãŒããæºåããŸããã
3. 3.5ã5.3åã®å é
ã³ã³ãã€ã«æã®èšç®ããããšãã°
ãã³ãã¬ãŒãã§ã®çŽ æ°ã®æ€çŽ¢ãèæ
®ãããŠãã C ++ã«é¢ããèšäºãé »ç¹ã«ãããŸã
ã èšäºã¯è峿·±ããã®ã§ãããèè
èªèº«ãæ°ã¥ããŠããããã«ãããŸã£ãã圹ã«ç«ããªãããšãããæ¹æ³ãæããŸããã
ã³ã³ãã€ã«æã®èšç®ãšãã³ãã¬ãŒãã䜿çšããæé©åããé¡èãªæ€çŽ¢é«éåãå®çŸããæ¹æ³ã説æããŸãã
3.1åçŽãªãã³ãã¬ãŒãèšç®
å¿
èŠãªãã®ã®ãã¡æãåçŽãªãã®ããå§ããŸããããã³ã³ãã€ã«æã®éä¹èšç®ãå®è£
ããŸãïŒ
template <unsigned N> struct factorial : std::integral_constant<unsigned, N * factorial<N-1>::value> {}; template <> struct factorial<0> : std::integral_constant<unsigned, 1> {};
èŠçŽ æ°ã
(2^5)*5! = 3840
éçé
å
std::array<>
ãäœæããã«ã¯ãéä¹èšç®ãå¿
èŠ
(2^5)*5! = 3840
(2^5)*5! = 3840
ã
颿£æ°åŠãšçµã¿åããè«ãããäžæã®èŠçŽ ã®ç°ãªãé åã®æ°ã¯ããããã®æ°ã®éä¹ã«çããããšãç¥ãããŠããŸãã ãŸããèŠçŽ ã®ååšã«é¢ãããªãã·ã§ã³ã®æ°ã¯ãèŠçŽ ã®æ°ã®çšåºŠã§2ã§ãã ïŒãã¡ãããæ¬ èœããŠããèŠçŽ ãã©ã®ããã«åé
眮ããããã¯çµ¶å¯Ÿã«éèŠã§ã¯ãããŸãããäœåãªãªãã·ã§ã³ããªããšã³ã³ãã€ã«ãéããªãå¯èœæ§ããããŸããããã®èšäºã¯ã§ããéãç°¡çŽ åããããåªããŠããŸããïŒ
次ã«ãæ§é å
ã§ã©ã®ãããªæé©åãè¡ãããããèŠãŠã¿ãŸããã
ã€ã³ã¹ã¿ã³ã¹åæã«
struct T_custom_filter
ããŸãã
ãŸãã
index_order
ãã©ã¡ãŒã¿ãŒãåãå
¥ããããã«ãªããŸããã æ¬¡ã«ãæ€çŽ¢ã®ãããã®ãªããã¡ã³ã¯ã¿ãŒã倿ŽãããŸããã
åãšåæ§ã«ã
T_get_use_filter
ãã³ãã¬ãŒãã¯ãæå®ãããindex_predã€ã³ããã¯ã¹ã®
number_filter
ãã£ãŒã«ãã§ãã£ã«ã¿ãŒã䜿çšããïŒãŸãã¯äœ¿çšããªãïŒããã®ãã©ã°ãè¿ããŸãã
T_number_field<>
ãã³ãã¬ãŒãããã
index_order
ãã£ãŒã«ããš
field_num
ã®ãã£ãŒã«ãçªå·ãæ¯èŒããããã®ã€ã³ããã¯ã¹ã«åºã¥ããŠãã²ãã¿ãŒ
get_field_value<static_cast<T_field_enum>(ordered_field_number)>()
ããå€ãååŸããããã«ãã£ãŒã«ãçªå·
ordered_field_number
ãååŸããŸãã
3.2ããè€éãªãã³ãã¬ãŒãèšç®
ä»ããé£ããã ãã³ãã¬ãŒãã¯ã©ã¹
T_number_field<>
ãã£ãŒã«ãé åºã®èšç®ãå®è£
ããŸãã ãã£ãŒã«ãé åºã€ã³ããã¯ã¹
index_order
ã¯æ¬¡ã®ããã«çæãããŸã-ããšãã°ã5ã€ã®ãã£ãŒã«ãã®ã€ã³ããã¯ã¹ã¯æ¬¡ã®åŒã䜿çšããŠã³ã³ãã€ã«ãããŸãã
index_order = field0 + 5*field1 + 5*4*field2 + 5*4*3*field3 + 5*4*3*2*field4;
field1
ãã£ãŒã«ãçªå·ïŒ5ã€ã®ãã¡äœ¿çšå¯èœïŒãæ¯èŒãããšãã«æåã«æ¥ãã field2-0ãã3ïŒæ®ãã®4ã€ã®ãã¡ïŒã®ãã£ãŒã«ãçªå·ãæ¯èŒæã«2çªç®ã«æ¥ã; ...; field5ã¯ãæåŸã«æ¥ã0ãã0ïŒæ®ãã®1çªç®ããïŒãŸã§ã®ãã£ãŒã«ãã®çªå·ã§ãã åžžã«0ã§ãããããçç¥ã§ããŸãã
index_order = field0 + 5*field1 + 5*4*field2 + 5*4*3*field3;
ãŸãã¯ãåãã§ãïŒ
index_order = field0 + 5*(field1 + 4*(field2 + 3*(field3)));
誰ããindex_orderã®å€ãèšç®ã·ã¹ãã ã®å¯å€åºæ°ãæã€æ°å€ãšããŠè¡šçŸããæ¹ãç°¡åãããããŸãã
field0
ã¯åºæ°5ã®æåã®æ°åïŒ5å€0ã4ãåãããšãã§ããŸãïŒã
field1
ã¯åºæ°4ã®2æ¡ç®ã§ãïŒ4å€0ãåãããšãã§ããŸãïŒ -3ïŒãªã©ã ãããã£ãŠãïŒ5ïŒïŒã®çµã¿åããã§ã¯ãä»»æã®ãã£ãŒã«ãé åããšã³ã³ãŒãã§ããŸãã çè§£ãæ·±ããããã«ã確çè«ã®åºç€ãŸãã¯é¢æ£æ°åŠããã®æ€çŽ¢ã«æ
£ããããšããå§ãããŸãã
èŠèŠçã«ã¯ãããã¯æ¬¡ã®ããã«è¡šãããšãã§ããŸããã«ãã³ïŒïŒã¯å©çšå¯èœãªæäœåªå
床å€ïŒæé«åªå
床ïŒã瀺ããæ£æ¹åœ¢[]-å©çšå¯èœããã®çªå·ãããã³ã«ãŒãªãŒ{}-ãã£ãŒã«ãã®å®æ°ã ããšãã°ãæåã¯æ¬¡ã®åªå
é äœãæã€5ã€ã®ãã£ãŒã«ãããããŸãïŒ5ã3ã1ã2ã4
ãã£ãŒã«ãçªå·ïŒ0 1 2 3 4
æ¯èŒåªå
床ïŒ5 3ïŒ1ïŒ2 4-[2]-çŸåšã®ãã£ãŒã«ãçªå·ïŒfield0ïŒ{2}
æ¯èŒåªå
床ïŒ5 3ïŒ2ïŒ4-[2]-çŸåšã®ãã£ãŒã«ãçªå·ïŒfield1ïŒ{3}
æ¯èŒåªå
床ïŒ5ïŒ3ïŒ4-[1]-çŸåšã®ãã£ãŒã«ãçªå·ïŒfield2ïŒ{1}
æ¯èŒåªå
床ïŒ5ïŒ4ïŒ-[1]-çŸåšã®ãã£ãŒã«ãçªå·ïŒfield3ïŒ{4}
æ¯èŒåªå
床ïŒïŒ5ïŒ-[0]-çŸåšã®ãã£ãŒã«ãçªå·ïŒfield4ïŒ{0}
index_order = field0 + 5*(field1 + 4*(field2 + 3*(field3)));
ã€ã³ããã¯ã¹å€ãååŸããŸãïŒ
index_order = 2 + 5*(2 + 4*(1 + 3*(1))) = 92;
åŸã§ãã©ã³ã¿ã€ã 颿°
T_optimized_search::get_index_order().
ãããã©ã®ããã«å®è£
ããããã瀺ããŸã
T_optimized_search::get_index_order().
çŸåšãææ Œã®çµæããã®ã€ã³ããã¯ã¹ã¯ã³ã³ãã€ã«æ®µéã§èªèãããéã®åé¡ã¯ãã³ã³ãã€ã«æã«åãã£ãŒã«ãã®ã·ãªã¢ã«çªå·ãååŸããæ¹æ³ã§ãã
æåã«ãè§æ¬åŒ§[]ã§æ°å€ãååŸããæ¹æ³ãåŠã³ãŸãã ç¹å®ã®å ŽåããçŸåšã®ãã£ãŒã«ãçªå·ãã¯ã
index_order = 2 + 5*(2 + 4*(1 + 3*(1))) = 92
ãã
index_order = 2 + 5*(2 + 4*(1 + 3*(1))) = 92
ã«ã€ããŠ
index_order = 2 + 5*(2 + 4*(1 + 3*(1))) = 92
ããã«èŠã€ãããŸãã
field0 = index_orderïŒ
5 = 92ïŒ
5 = 2;
field1 =ïŒindex_order / 5ïŒïŒ
4 =ïŒ92/5ïŒïŒ
4 = 2;
field2 =ïŒindex_order /ïŒ5 * 4ïŒïŒïŒ
3 =ïŒ92/5 * 4ïŒïŒ
3 = 1;
field3 =ïŒindex_order /ïŒ5 * 4 * 3ïŒïŒïŒ
2 =ïŒ92/5 * 4 * 3ïŒïŒ
2 = 1;
field4 = 0;
ã³ã³ãã€ã«æã«ã次ã®ãã³ãã¬ãŒãã¯ã©ã¹ããããè¡ããŸãã
ãããŠãnumber_filterã«çãããçŸåšã®ãã£ãŒã«ãçªå·ãã®å€ãååŸãããã®æ¹æ³ã§ãã³ãã¬ãŒããã€ã³ã¹ã¿ã³ã¹åããŸã
T_number_remaining_field<index_order, number_filter>::value
ã
æ··ä¹±ããç¬éããããŸãïŒèª°ããïŒ
number_filter=0
ïŒã§ãããèãããããããŸããã
T_number_remaining_field<index_order, 0>::value
2ã€ã®ãã©ã¡ãŒã¿ãŒãæã€
T_number_remaining_field<index_order, 0>::value
éšåçãªç¹æ®åãããã«åŒã³åºãããŸãã
template <unsigned index_order, unsigned index> struct T_number_remaining_field<index_order, 0, index>
index_order
眮ãæãããã0ã¯
index
眮ãæããã
index
ã ããããããã¯ããã§ã¯ãããŸããïŒ
æšæºïŒ
C ++ 03 14.8.2ãã³ãã¬ãŒãåŒæ°ã®æšè« ïŒã«ããã°ãæåã«ãããã©ã«ãå€ã¯
index = T_row::last_e
ãããå®éãã€ã³ã¹ã¿ã³ã¹åã¯
T_number_remaining_field<index_order, 0, T_row::last_e>::value
ã ãããŠãå°éãžã®ã¢ããŒã«ããããŸãã
template <unsigned index_order, unsigned index> struct T_number_remaining_field<index_order, 0, index>
ãŸãã5ã€ã®ãã£ãŒã«ãã®çŸåšã®ãŒããã£ãŒã«ãçªå·ïŒ
T_row::last_e=5
ïŒã®å Žåãå¿
èŠã«å¿ããŠ
index_order % 5
ãååŸã
index_order % 5
ã
è§æ¬åŒ§å
ã®ãçŸåšã®ãã£ãŒã«ãçªå·ããèŠã€ããæ¹æ³ãå®è£
ããŸããã æ¬¡ã«ãäžæ¬åŒ§{}ã§å²ãŸãããã£ãŒã«ãã®å®éã®ãã£ãŒã«ãçªå·ã®åä¿¡ãå®è£
ããå¿
èŠããããŸãã
èŠèŠçãªè¡šçŸãããããããã«ãè§æ¬åŒ§[]å
ã®ãçŸåšã®ãã£ãŒã«ãçªå·ãã¯ãäžæ¬åŒ§{}å
ã®å®éã®ãã£ãŒã«ãçªå·ãšå¿
ãããäžèŽããŸããã çªå·ã®ä»ããã«ãŒãã®ããããäžããäžãžæé ã§äžŠãã§ãããšæ³åãããšãæåã¯ãããã®çªå·ã¯ãããå
ã®é åºãšäžèŽããŸãã ããããçãäžããã«ãŒããåãåºããšããããã®äžã«ããã«ãŒãã¯ãæ¯åãããã®ãŠãããçªå·ãå®éã®çªå·ã«æ¯ã¹ãŠæžãããŸãã
ç§ãã¡ã®å Žåãããã«ããã宿°ãšåªå
é äœã®å€ãããäœã宿°{}ããã³åªå
é äœå€ïŒïŒïŒä»¥åã«åé€ãããããé«ãåªå
é äœïŒãæã€ãã¹ãŠã®ãã£ãŒã«ããããçŸåšã®ãã£ãŒã«ãå€ã[]ãã£ãšã ãã®ãããªãªãã»ããã¯ã次ã®ãã³ãã¬ãŒãã¯ã©ã¹ã«ãã£ãŠèšç®ãããŸãã
æåŸã«ã次ã®ãã³ãã¬ãŒãã¯ã©ã¹ã§å®éã®ãã£ãŒã«ãçªå·ãååŸããŸãã
ã§ãã
3.3ãã¹ãããããã³ãã¬ãŒãã®ããã¢ãŒã·ã§ã³
ããã§ãæ€çŽ¢ãã£ãŒã«ãã®ååšãšãã®é åºã§ãã£ã«ã¿ãŒãã³ãã¬ãŒã
T_custom_filter<>
ãã€ã³ã¹ã¿ã³ã¹åããå¿
èŠããããŸãã ãããè¡ãã«ã¯ããã¹ãããããã³ãã¬ãŒãããã¢ãŒã·ã§ã³ã䜿çšããŸãã
template<typename T_row> class T_optimized_search {
ããã§ã¯ããã£ãŒã«ãæ¯èŒã®ååšã®ã³ã³ãã€ã«æããã¢ãŒã·ã§ã³struct T_unroll_find<>
ã䜿çšãããã®å
éšã§ãã£ãŒã«ãæ¯èŒã®é åºã®ããã¢ãŒã·ã§ã³ã䜿çšããŸããstruct T_unroll_order<>
ããŸããæ€çŽ¢é¢æ°ã§ã¯get_index_pred()
ããã£ãŒã«ããæ¯èŒããå¿
èŠæ§ã«å¿ããŠã€ã³ããã¯ã¹ãååŸããã©ã³ã¿ã€ã 颿°get_index_order()
ãšããã£ãŒã«ããæ¯èŒããããã«å¿
èŠãªé åºã«å¿ããŠã€ã³ããã¯ã¹ãååŸããã©ã³ã¿ã€ã 颿°ã䜿çšããŸããæåã®æ©èœã¯åããŸãŸã§ãã
ãããŠ2çªç®ã远å ãããŸããget_index_order()
ããŸããstruct T_cash_account_row
颿°ãæååã®æ§é ã«çŸããŠããããšãæç¢ºã«ããŸãget_bitf_size()
-ã«ãŒãã£ããªãã£ãååŸããããã«ïŒãã®åœ¢åŒã§ãã¹ã€ãã/ã±ãŒã¹ãä»ããã«ãconstexprãã€ãŸãã³ã³ãã€ã«æãšããŠæ©èœã§ããŸãããMSVC11ã¯ãŸã ãµããŒãããŠããŸããïŒïŒ struct T_cash_account_row { ...
ããäžåºŠãéžææ§ã®åŒïŒè¡æ°ïŒãæãåºããŸãïŒselectivity = c_array_size * (1 + field.end â field.begin) / cardinality;
ãããŠããã£ãŒã«ãã®æ¯èŒã®é åºã«å¿ããŠãã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã³ãã¬ãŒãããã¢ãŒã·ã§ã³ã䜿çšããŠåæ¡ä»¶/ãã£ãŒã«ãã®éžææ§ãèšç®ããã€ã³ããã¯ã¹èªäœãååŸããæ©èœïŒ
ããã§ãããŒå
¥åã«ã¯std::map<>
ãã£ãŒã«ãçªå·ãå
¥åãããå€ã«ã¯æ³å®ãããéžææ§ãå
¥åãããŸããæ¬¡ã«ããµã€ã¯ã«ã§æå°ã®éžææ§ãèŠã€ãã察å¿ãããã£ãŒã«ãçªå·ãããŒããååŸããããããã¬ã³ãŒããåé€ããstd::map<>
ãã®ãã£ãŒã«ãçªå·ã䜿çšããŠã€ã³ããã¯ã¹ãã³ã³ãã€ã«ããŸãããããã£ãŠãåãã£ãŒã«ãã®ã«ãŒãã§ã颿°ã«ãã£ãŠè¿ããããã®ã€ã³ããã¯ã¹ãget_index_order
æ°åŠçã«ååŸãããæ¹æ³ã«ã€ããŠã¯ãã§ã«èª¬æããŸãããindex_order = field1 + 5*(field2 + 4*(field3 + 3*(field4)));
ãããã£ãŠãæ€çŽ¢ãã³ãã¬ãŒãã3840
äžåºŠå·»ãæ»ãããããã®ãªããžã§ã¯ãã§éçé
åã«å
¥åãããããã®æ€çŽ¢æ¡ä»¶ã«æé©åãããæ€çŽ¢é¢æ°ã§å¿
èŠãªãªããžã§ã¯ãã®ã©ã³ã¿ã€ã ã€ã³ããã¯ã¹ãååŸããããšãã§ããŸãããçµæã®ã¢ã»ã³ãã©ãŒé¢æ°ã³ãŒãtest_predicate
C ++ã®ä»¥åã®ããŒãžã§ã³ãšæ¯èŒããŠå€æŽãããŸãã-2ã€ã®æ¯èŒãå Žæã倿Žãããããã®æåã®ãã®ãæåŸã«ãªããŸããïŒgithub.com asmããTortoiseDiffããã®åçã
4.ãã¹ãçµæ
C ++ã§ã®ãã®ãœãªã¥ãŒã·ã§ã³ã®å®å
šã«æ©èœããããŒãžã§ã³ã¯æ¬¡ã®ãšãã ã§ããGitHub.comâO3 âmarch = nativeã¹ã€ãããCPU Core i5 K750ãããã³exeãã¡ã€ã«ãµã€ãº1.3MBã®GCC4.7.2ã§ã¯ãçµæã¯æ¬¡ã®ããã«ãªããŸããçæãããè¡ïŒ10000000
C ++-æ€çŽ¢...
C ++-æé©åãããæ€çŽ¢ã«ã¯0.017000ç§ããããŸããã
èŠã€ãã£ãè¡ïŒ38
C-Searching ...
C-searchã«ã¯0.090000ç§ããããŸããã
Cããé«éãªC ++ïŒ5.294118å
èŠã€ãã£ãè¡ïŒ38
ãŸããããŒ/ O2 / Ob2 / OiãCPU Core i5 K750ãexeãã¡ã€ã«ãµã€ãº1.42MBã®MSVC11ïŒMSVS2012ïŒã§ã¯ãçµæã¯æ¬¡ã®ããã«ãªããŸããçæãããè¡ïŒ10000000
C ++-æ€çŽ¢äž...
C ++-æé©åãããæ€çŽ¢ã«ã¯0.021000ç§ããããŸããã
èŠã€ãã£ãè¡ïŒ38
C-Searching ...
C-searchã¯0.074000ç§ããããŸããã
Cããé«éãªC ++ïŒ3.523809å
èŠã€ãã£ãè¡ïŒ38
ã芧ã®ãšãããã©ã³ã¿ã€ã ã¯Cã®74ããªç§ããC ++ã®21ããªç§ã«äœäžããŸãããé床ã¯3.5åã«å¢å ããŸãããçŽ æŽãããã
ãããŠãã芧ã®ãšãããGCCã¯ããã«é¡èãªé床ã®éãã5.3åã瀺ããŠããŸãããããŠãããã¯SIMDåœä»€ããã£ãã·ã¥ããªãã§ãããšã¯ç°ãªãã絶察ã«ã¯ãã¹ããŒããŠã§ã¢ãœãªã¥ãŒã·ã§ã³ã§ããããã°ã©ã å®è¡çšã«æé©åããã1ã€ã®ãã¹ãäœæããPGOãšã¯ç°ãªããå
¥åããŒã¿ã®ãã¹ãŠã®å Žåã«æé©åããã3840åã®ãã¹ãäœæããŸããããã®ãœãªã¥ãŒã·ã§ã³ã¯è€éã«æãããããããŸããããC ++ãæ¬åœã«çè§£ããããšã®æå³ãæç¢ºã«ãªããŸããã C ++ãããããããªãå Žåã¯ãCã§æžããšããéžæè¢ã1ã€ãããããŸãããããã¯ã颿°ãã€ã³ã¿ãŒã®é
åã«ãã£ãŠCã§è§£æ±ºã§ãããšããçå¿µãææããããã«ãäŸãæããŸãããªããªã , C , , .
C:
GitHub.comC- diff :
GitHub.comGCC4.7.2 âO3 âmarch=native, CPU Core i5 K750 :
Generated rows: 10000000
C-optimized-SearchingâŠ
C-optimized-search took 0.049000 seconds.
Found rows: 38
C-SearchingâŠ
C-search took 0.086000 seconds.
The C++ faster than C: 1.755102 times
Found rows: 38
ãŸããããŒ/ O2 / Ob2 / OiãCPU Core i5 K750ã䜿çšããMSVC11ã§ã¯ãçµæã¯æ¬¡ã®ããã«ãªããŸããçæãããè¡ïŒ10000000
C-optimized-Searching ...
C-optimized-searchã¯0.045000ç§ããããŸããã
èŠã€ãã£ãè¡ïŒ38
C-Searching ...
C-searchã¯0.074000ç§ããããŸããã
Cãããé«éãªC ++ïŒ1.644444å
èŠã€ãã£ãè¡ïŒ38
Cã§ã®æé©åã®çµæãèŠããšãC ++ã§ã®æé©åããã2ã3åé
ããŠããŸããCã®GCCã®å éã¯C ++ã®5.3åã«å¯ŸããŠ1.8åã§ãããCã®MSVCã®å éã¯C ++ã®3.5åã«å¯ŸããŠ1.6åã§ããããã«ãCã®æé©åã¯ãC ++ã³ã³ãã€ã©ãŒã«ãã£ãŠç°¡åã«ã³ã³ãã€ã«ã§ããŸããã倿Žã¯1ã€ããããŸãããããã®éã¯ã§ããŸããã5.çµè«
C ++ãã³ãã¬ãŒãã䜿çšããŠãã³ã³ãã€ã«æã«èšç®ãšã¯ãã¹ããŒããŠã§ã¢æé©åãå®è£
ããå®éã®ã¿ã¹ã¯ã§3.5ã5.3åã®å éãå®çŸããæ¹æ³ã瀺ããŸãããC ++ã«ã¯é©çšã§ããªãã£ãCã®ãããªæé©åã¯ãããŸãããã»ãŒå®å
šãªåŸæ¹äºææ§ããããŸããããããC-C ++ã®å¯äžã®ä»£æ¿-ãã®ãããªæé©åã®ããã®ãã³ãã¬ãŒã-ã¯ãæ°åãæ°çŸãæ°åã®é¢æ°ãæžãããšã§ã-ã³ããŒã¢ã³ãããŒã¹ãã¯æ¬åœã«ããã§ãããã®æé©åã¯Javaããã³CïŒã«ã¯é©çšã§ããªãããšãæãåºãããŠãã ããããžã§ããªãã¯ã§ã¯ããã©ã¡ãŒã¿ãŒã§å€ã䜿çšããããšã¯ã§ããŸããããã¿ã€ãã®ã¿ãå¯èœã§ãã JavaãšCïŒã«ã¯ä»ã«ãå©ç¹ããããŸã-ãããã¯éçºãããã©ã€ãã©ãªã§ãããæããªãšã©ãŒã«å¯Ÿããä¿è·ã§ããæ¬¡ã®èšäºã§ã¯ããã®ã¿ã¹ã¯ã«æé©ãªã€ã³ããã¯ã¹æ€çŽ¢ãªãã·ã§ã³ãã€ã³ããã¯ã¹ããã·ã¥çµåãšããããããANDãã«ãã€ã³ããã¯ã¹æ¥ç¶ãããã§é©åã§ã¯ãªãçç±ãããã³ã€ã³ããã¯ã¹æ§æããŒãã«ãšã€ã³ããã¯ã¹ãªã³ãªãŒã¹ãã£ã³ããŒã¿ã¢ã¯ã»ã¹æŠç¥ã䜿çšããå¿
èŠãããçç±ã«ã€ããŠèª¬æããŸãããã€ããªæ€çŽ¢ã®çæãšããªãç§ãã¡ã®å Žåãé åºä»ãããã·ã¥ã€ã³ããã¯ã¹ãé©ããŠããã®ãã説æããŸãã Core i5 K750ã®1ã€ã®ã³ã¢ã§æ¯ç§0.15ã360äžãªã¯ãšã¹ãã®é床ãå®çŸããç«¶åã¢ã¯ã»ã¹ã匱ã倿Žãå°ãªããã«ãã¹ã¬ããããŒãžã§ã³ã§ãããã©ã®ããã«å®è£
ããããã瀺ããŸãã GPUã§ã®ãã®æ€çŽ¢ãé«éåããã¬ã³ãŒãã°ã«ãŒãããšã«1ã€ã®ã¡ã¢ãªããªã¢ãåãã忣ã¹ã¬ããç¶æ
ã§ããå°æ¥ã®ãã«ãã¹ã¬ãããã¿ãŒã³ã®çç±ã瀺ããŸããæ¬¡ã«ãè² è·ã®é«ãWebãããžã§ã¯ãã®æ€çŽ¢åé¡ã«è¿ã¥ããFastCGIãšboost :: asioã䜿çšããŠå®è£
ãæ¯èŒããŸããããããäžåºŠã«ãã¹ãŠã§ã¯ãããŸããã