Skip to content

Commit ca1fe98

Browse files
committed
patch 7.4.1056
Problem: Don't know why finding spell suggestions is slow. Solution: Add some code to gather profiling information.
1 parent a61018d commit ca1fe98

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

src/spell.c

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,8 @@ static char *(features[]) =
741741

742742
static int included_patches[] =
743743
{ /* Add new patch number below this line */
744+
/**/
745+
1056,
744746
/**/
745747
1055,
746748
/**/

0 commit comments

Comments
 (0)