@@ -11278,6 +11278,56 @@ suggest_try_special(su)
1127811278 }
1127911279}
1128011280
11281+ /*
11282+ * Change the 0 to 1 to measure how much time is spent in each state.
11283+ * Output is dumped in "suggestprof".
11284+ */
11285+ #if 0
11286+ # define SUGGEST_PROFILE
11287+ proftime_T current ;
11288+ proftime_T total ;
11289+ proftime_T times [STATE_FINAL + 1 ];
11290+ long counts [STATE_FINAL + 1 ];
11291+
11292+ static void
11293+ prof_init (void )
11294+ {
11295+ for (int i = 0 ; i <= STATE_FINAL ; ++ i )
11296+ {
11297+ profile_zero (& times [i ]);
11298+ counts [i ] = 0 ;
11299+ }
11300+ profile_start (& current );
11301+ profile_start (& total );
11302+ }
11303+
11304+ /* call before changing state */
11305+ static void
11306+ prof_store (state_T state )
11307+ {
11308+ profile_end (& current );
11309+ profile_add (& times [state ], & current );
11310+ ++ counts [state ];
11311+ profile_start (& current );
11312+ }
11313+ # define PROF_STORE (state ) prof_store(state);
11314+
11315+ static void
11316+ prof_report (char * name )
11317+ {
11318+ FILE * fd = fopen ("suggestprof" , "a" );
11319+
11320+ profile_end (& total );
11321+ fprintf (fd , "-----------------------\n" );
11322+ fprintf (fd , "%s: %s\n" , name , profile_msg (& total ));
11323+ for (int i = 0 ; i <= STATE_FINAL ; ++ i )
11324+ fprintf (fd , "%d: %s (%ld)\n" , i , profile_msg (& times [i ]), counts [i ]);
11325+ fclose (fd );
11326+ }
11327+ #else
11328+ # define PROF_STORE (state )
11329+ #endif
11330+
1128111331/*
1128211332 * Try finding suggestions by adding/removing/swapping letters.
1128311333 */
@@ -11309,7 +11359,13 @@ suggest_try_change(su)
1130911359 continue ;
1131011360
1131111361 /* Try it for this language. Will add possible suggestions. */
11362+ #ifdef SUGGEST_PROFILE
11363+ prof_init ();
11364+ #endif
1131211365 suggest_trie_walk (su , lp , fword , FALSE);
11366+ #ifdef SUGGEST_PROFILE
11367+ prof_report ("try_change" );
11368+ #endif
1131311369 }
1131411370}
1131511371
@@ -11467,6 +11523,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1146711523
1146811524 /* Always past NUL bytes now. */
1146911525 n = (int )sp -> ts_state ;
11526+ PROF_STORE (sp -> ts_state )
1147011527 sp -> ts_state = STATE_ENDNUL ;
1147111528 sp -> ts_save_badflags = su -> su_badflags ;
1147211529
@@ -11510,6 +11567,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1151011567 if (sp -> ts_curi > len || byts [arridx ] != 0 )
1151111568 {
1151211569 /* Past bytes in node and/or past NUL bytes. */
11570+ PROF_STORE (sp -> ts_state )
1151311571 sp -> ts_state = STATE_ENDNUL ;
1151411572 sp -> ts_save_badflags = su -> su_badflags ;
1151511573 break ;
@@ -11909,6 +11967,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1190911967#endif
1191011968 /* Save things to be restored at STATE_SPLITUNDO. */
1191111969 sp -> ts_save_badflags = su -> su_badflags ;
11970+ PROF_STORE (sp -> ts_state )
1191211971 sp -> ts_state = STATE_SPLITUNDO ;
1191311972
1191411973 ++ depth ;
@@ -11983,6 +12042,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1198312042 byts = pbyts ;
1198412043 idxs = pidxs ;
1198512044 sp -> ts_prefixdepth = PFD_PREFIXTREE ;
12045+ PROF_STORE (sp -> ts_state )
1198612046 sp -> ts_state = STATE_NOPREFIX ;
1198712047 }
1198812048 }
@@ -11995,6 +12055,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1199512055 su -> su_badflags = sp -> ts_save_badflags ;
1199612056
1199712057 /* Continue looking for NUL bytes. */
12058+ PROF_STORE (sp -> ts_state )
1199812059 sp -> ts_state = STATE_START ;
1199912060
1200012061 /* In case we went into the prefix tree. */
@@ -12012,9 +12073,11 @@ suggest_trie_walk(su, lp, fword, soundfold)
1201212073 )
1201312074 {
1201412075 /* The badword ends, can't use STATE_PLAIN. */
12076+ PROF_STORE (sp -> ts_state )
1201512077 sp -> ts_state = STATE_DEL ;
1201612078 break ;
1201712079 }
12080+ PROF_STORE (sp -> ts_state )
1201812081 sp -> ts_state = STATE_PLAIN ;
1201912082 /*FALLTHROUGH*/
1202012083
@@ -12028,6 +12091,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1202812091 {
1202912092 /* Done all bytes at this node, do next state. When still at
1203012093 * already changed bytes skip the other tricks. */
12094+ PROF_STORE (sp -> ts_state )
1203112095 if (sp -> ts_fidx >= sp -> ts_fidxtry )
1203212096 sp -> ts_state = STATE_DEL ;
1203312097 else
@@ -12184,13 +12248,15 @@ suggest_trie_walk(su, lp, fword, soundfold)
1218412248 * delete/insert/swap a character. */
1218512249 if (has_mbyte && sp -> ts_tcharlen > 0 )
1218612250 {
12251+ PROF_STORE (sp -> ts_state )
1218712252 sp -> ts_state = STATE_FINAL ;
1218812253 break ;
1218912254 }
1219012255#endif
1219112256 /*
1219212257 * Try skipping one character in the bad word (delete it).
1219312258 */
12259+ PROF_STORE (sp -> ts_state )
1219412260 sp -> ts_state = STATE_INS_PREP ;
1219512261 sp -> ts_curi = 1 ;
1219612262 if (soundfold && sp -> ts_fidx == 0 && fword [sp -> ts_fidx ] == '*' )
@@ -12245,6 +12311,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1224512311 {
1224612312 /* If we just deleted a byte then inserting won't make sense,
1224712313 * a substitute is always cheaper. */
12314+ PROF_STORE (sp -> ts_state )
1224812315 sp -> ts_state = STATE_SWAP ;
1224912316 break ;
1225012317 }
@@ -12256,12 +12323,14 @@ suggest_trie_walk(su, lp, fword, soundfold)
1225612323 if (sp -> ts_curi > byts [n ])
1225712324 {
1225812325 /* Only NUL bytes at this node, go to next state. */
12326+ PROF_STORE (sp -> ts_state )
1225912327 sp -> ts_state = STATE_SWAP ;
1226012328 break ;
1226112329 }
1226212330 if (byts [n + sp -> ts_curi ] != NUL )
1226312331 {
1226412332 /* Found a byte to insert. */
12333+ PROF_STORE (sp -> ts_state )
1226512334 sp -> ts_state = STATE_INS ;
1226612335 break ;
1226712336 }
@@ -12278,6 +12347,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1227812347 if (sp -> ts_curi > byts [n ])
1227912348 {
1228012349 /* Done all bytes at this node, go to next state. */
12350+ PROF_STORE (sp -> ts_state )
1228112351 sp -> ts_state = STATE_SWAP ;
1228212352 break ;
1228312353 }
@@ -12349,6 +12419,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1234912419 if (c == NUL )
1235012420 {
1235112421 /* End of word, can't swap or replace. */
12422+ PROF_STORE (sp -> ts_state )
1235212423 sp -> ts_state = STATE_FINAL ;
1235312424 break ;
1235412425 }
@@ -12357,6 +12428,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1235712428 * SWAP3 etc. also don't make sense then. */
1235812429 if (!soundfold && !spell_iswordp (p , curwin ))
1235912430 {
12431+ PROF_STORE (sp -> ts_state )
1236012432 sp -> ts_state = STATE_REP_INI ;
1236112433 break ;
1236212434 }
@@ -12387,6 +12459,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1238712459 /* When the second character is NUL we can't swap. */
1238812460 if (c2 == NUL )
1238912461 {
12462+ PROF_STORE (sp -> ts_state )
1239012463 sp -> ts_state = STATE_REP_INI ;
1239112464 break ;
1239212465 }
@@ -12395,6 +12468,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1239512468 * Also get here if the second char is not a word character. */
1239612469 if (c == c2 )
1239712470 {
12471+ PROF_STORE (sp -> ts_state )
1239812472 sp -> ts_state = STATE_SWAP3 ;
1239912473 break ;
1240012474 }
@@ -12406,6 +12480,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1240612480 sp -> ts_twordlen , tword , fword + sp -> ts_fidx ,
1240712481 c , c2 );
1240812482#endif
12483+ PROF_STORE (sp -> ts_state )
1240912484 sp -> ts_state = STATE_UNSWAP ;
1241012485 ++ depth ;
1241112486#ifdef FEAT_MBYTE
@@ -12425,8 +12500,11 @@ suggest_trie_walk(su, lp, fword, soundfold)
1242512500 }
1242612501 }
1242712502 else
12503+ {
1242812504 /* If this swap doesn't work then SWAP3 won't either. */
12505+ PROF_STORE (sp -> ts_state )
1242912506 sp -> ts_state = STATE_REP_INI ;
12507+ }
1243012508 break ;
1243112509
1243212510 case STATE_UNSWAP :
@@ -12484,6 +12562,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1248412562 * Second character may any char: "a.b" -> "b.a" */
1248512563 if (c == c3 || c3 == NUL )
1248612564 {
12565+ PROF_STORE (sp -> ts_state )
1248712566 sp -> ts_state = STATE_REP_INI ;
1248812567 break ;
1248912568 }
@@ -12495,6 +12574,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1249512574 sp -> ts_twordlen , tword , fword + sp -> ts_fidx ,
1249612575 c , c3 );
1249712576#endif
12577+ PROF_STORE (sp -> ts_state )
1249812578 sp -> ts_state = STATE_UNSWAP3 ;
1249912579 ++ depth ;
1250012580#ifdef FEAT_MBYTE
@@ -12515,7 +12595,10 @@ suggest_trie_walk(su, lp, fword, soundfold)
1251512595 }
1251612596 }
1251712597 else
12598+ {
12599+ PROF_STORE (sp -> ts_state )
1251812600 sp -> ts_state = STATE_REP_INI ;
12601+ }
1251912602 break ;
1252012603
1252112604 case STATE_UNSWAP3 :
@@ -12547,6 +12630,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1254712630 {
1254812631 /* Middle char is not a word char, skip the rotate. First and
1254912632 * third char were already checked at swap and swap3. */
12633+ PROF_STORE (sp -> ts_state )
1255012634 sp -> ts_state = STATE_REP_INI ;
1255112635 break ;
1255212636 }
@@ -12562,6 +12646,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1256212646 sp -> ts_twordlen , tword , fword + sp -> ts_fidx ,
1256312647 p [0 ], p [1 ], p [2 ]);
1256412648#endif
12649+ PROF_STORE (sp -> ts_state )
1256512650 sp -> ts_state = STATE_UNROT3L ;
1256612651 ++ depth ;
1256712652 p = fword + sp -> ts_fidx ;
@@ -12587,7 +12672,10 @@ suggest_trie_walk(su, lp, fword, soundfold)
1258712672 }
1258812673 }
1258912674 else
12675+ {
12676+ PROF_STORE (sp -> ts_state )
1259012677 sp -> ts_state = STATE_REP_INI ;
12678+ }
1259112679 break ;
1259212680
1259312681 case STATE_UNROT3L :
@@ -12623,6 +12711,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1262312711 sp -> ts_twordlen , tword , fword + sp -> ts_fidx ,
1262412712 p [0 ], p [1 ], p [2 ]);
1262512713#endif
12714+ PROF_STORE (sp -> ts_state )
1262612715 sp -> ts_state = STATE_UNROT3R ;
1262712716 ++ depth ;
1262812717 p = fword + sp -> ts_fidx ;
@@ -12648,7 +12737,10 @@ suggest_trie_walk(su, lp, fword, soundfold)
1264812737 }
1264912738 }
1265012739 else
12740+ {
12741+ PROF_STORE (sp -> ts_state )
1265112742 sp -> ts_state = STATE_REP_INI ;
12743+ }
1265212744 break ;
1265312745
1265412746 case STATE_UNROT3R :
@@ -12684,6 +12776,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1268412776 || sp -> ts_score + SCORE_REP >= su -> su_maxscore
1268512777 || sp -> ts_fidx < sp -> ts_fidxtry )
1268612778 {
12779+ PROF_STORE (sp -> ts_state )
1268712780 sp -> ts_state = STATE_FINAL ;
1268812781 break ;
1268912782 }
@@ -12697,10 +12790,12 @@ suggest_trie_walk(su, lp, fword, soundfold)
1269712790
1269812791 if (sp -> ts_curi < 0 )
1269912792 {
12793+ PROF_STORE (sp -> ts_state )
1270012794 sp -> ts_state = STATE_FINAL ;
1270112795 break ;
1270212796 }
1270312797
12798+ PROF_STORE (sp -> ts_state )
1270412799 sp -> ts_state = STATE_REP ;
1270512800 /*FALLTHROUGH*/
1270612801
@@ -12733,6 +12828,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1273312828 ftp -> ft_from , ftp -> ft_to );
1273412829#endif
1273512830 /* Need to undo this afterwards. */
12831+ PROF_STORE (sp -> ts_state )
1273612832 sp -> ts_state = STATE_REP_UNDO ;
1273712833
1273812834 /* Change the "from" to the "to" string. */
@@ -12754,8 +12850,11 @@ suggest_trie_walk(su, lp, fword, soundfold)
1275412850 }
1275512851
1275612852 if (sp -> ts_curi >= gap -> ga_len && sp -> ts_state == STATE_REP )
12853+ {
1275712854 /* No (more) matches. */
12855+ PROF_STORE (sp -> ts_state )
1275812856 sp -> ts_state = STATE_FINAL ;
12857+ }
1275912858
1276012859 break ;
1276112860
@@ -12775,6 +12874,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
1277512874 repextra -= tl - fl ;
1277612875 }
1277712876 mch_memmove (p , ftp -> ft_from , fl );
12877+ PROF_STORE (sp -> ts_state )
1277812878 sp -> ts_state = STATE_REP ;
1277912879 break ;
1278012880
@@ -13287,7 +13387,13 @@ suggest_try_soundalike(su)
1328713387 /* try all kinds of inserts/deletes/swaps/etc. */
1328813388 /* TODO: also soundfold the next words, so that we can try joining
1328913389 * and splitting */
13390+ #ifdef SUGGEST_PROFILE
13391+ prof_init ();
13392+ #endif
1329013393 suggest_trie_walk (su , lp , salword , TRUE);
13394+ #ifdef SUGGEST_PROFILE
13395+ prof_report ("soundalike" );
13396+ #endif
1329113397 }
1329213398 }
1329313399}
0 commit comments