Skip to content

Conversation

@Jason3S
Copy link
Collaborator

@Jason3S Jason3S commented Jan 9, 2026

Pull request overview

This PR improves word lookup performance when words are not found by optimizing how the spell checker generates different word forms for dictionary lookups. The key optimization is to avoid expensive Unicode normalization and replacement mapping operations when they're not needed.

Changes:

  • Converted mapWord from required to optional on SpellingDictionary interface, using undefined for dictionaries that don't need word mapping
  • Added early-exit optimization for ASCII words to skip Unicode normalization
  • Added test-before-apply optimization for replacement mappers to avoid expensive operations when the word won't match
  • Enhanced dictionary logging to track cache misses and improved the public API for logging functions
  • Added comprehensive tests including integration test with real German dictionary

When a word is not found, the spell checker tries many different forms to find the word. This can be expensive if a lot of words are not found.

When a word is not found, the spell checker tries many different forms to find the word. This can be expensive if a lot of words are not found.
@github-actions github-actions bot added the fix label Jan 9, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Jan 10, 2026

Performance Report

Daily Performance
xychart-beta
    title Files Per Second by Day
    y-axis Files per Second
    x-axis Date [Dec-13, Dec-14, Dec-15, Dec-16, Dec-20, Dec-22, Dec-23, Dec-24, Dec-27, Dec-28, Dec-29, Dec-30, Jan-1, Jan-4, Jan-5, Jan-6, Jan-7, Jan-8, Jan-9, Jan-10]
    bar [162.46, 160.30, 159.32, 159.99, 160.32, 171.41, 173.30, 173.54, 170.88, 173.10, 172.87, 170.63, 172.55, 170.72, 165.99, 165.55, 169.22, 174.07, 185.19, 187.45]
    line [126.25, 125.99, 122.54, 125.77, 120.95, 129.07, 131.35, 128.71, 129.73, 130.21, 126.25, 125.32, 128.46, 125.36, 119.96, 121.55, 126.54, 132.92, 138.94, 136.24]
    line [94.05, 97.42, 87.40, 93.20, 92.02, 98.77, 95.06, 94.41, 95.55, 97.07, 96.22, 92.57, 92.92, 91.62, 91.70, 90.24, 93.64, 97.75, 101.99, 101.23]
    line [5.69, 6.12, 5.85, 6.27, 5.94, 6.19, 6.23, 6.06, 5.80, 6.19, 6.04, 6.09, 6.29, 6.13, 5.79, 5.41, 5.66, 6.15, 6.86, 6.90]
    line [201.42, 192.31, 202.71, 196.90, 201.49, 199.06, 199.67, 194.62, 190.28, 203.79, 203.98, 206.16, 191.99, 203.06, 195.28, 197.18, 199.76, 210.90, 223.95, 228.77]
    line [296.25, 298.40, 299.27, 280.90, 293.45, 278.89, 296.00, 294.23, 289.77, 295.71, 297.33, 290.64, 293.31, 297.11, 291.75, 279.45, 292.30, 315.14, 325.37, 329.28]
    line [164.74, 167.10, 169.90, 168.25, 171.20, 165.98, 169.49, 175.43, 173.51, 166.13, 173.69, 176.28, 174.86, 172.30, 168.35, 166.48, 160.20, 176.21, 192.32, 196.53]
    line [14.25, 14.42, 14.66, 14.20, 14.14, 14.58, 14.66, 13.81, 14.51, 13.39, 13.58, 14.12, 14.33, 14.46, 13.75, 12.60, 13.58, 14.59, 15.66, 15.79]
    line [144.49, 139.02, 141.78, 142.36, 140.50, 151.95, 150.33, 152.02, 150.72, 154.90, 153.82, 147.24, 149.99, 145.79, 146.47, 145.32, 149.61, 152.47, 167.66, 162.55]
    line [36.47, 38.38, 37.81, 37.32, 38.13, 39.99, 39.24, 39.22, 39.13, 37.99, 37.43, 37.30, 38.53, 37.44, 35.32, 32.27, 37.29, 39.53, 40.03, 40.97]
    line [242.80, 219.56, 233.62, 231.32, 236.32, 236.26, 240.94, 253.96, 249.85, 237.45, 249.30, 236.26, 250.59, 240.41, 245.35, 243.40, 249.06, 252.82, 269.41, 273.80]
    line [45.02, 45.75, 43.43, 44.94, 44.85, 45.35, 43.98, 45.75, 48.03, 44.47, 43.53, 43.39, 44.67, 43.92, 40.38, 37.83, 41.50, 45.72, 48.43, 43.80]
    line [70.10, 71.99, 68.96, 71.11, 72.00, 74.62, 76.21, 75.66, 76.28, 80.16, 75.45, 77.29, 76.83, 75.96, 77.04, 75.98, 75.37, 79.34, 80.97, 83.22]
    line [65.11, 62.93, 65.98, 63.02, 64.70, 64.39, 64.92, 64.92, 65.76, 63.97, 65.18, 60.36, 63.48, 65.17, 62.63, 59.94, 62.94, 68.03, 71.19, 73.13]
    line [24.27, 23.97, 21.89, 24.77, 24.75, 25.98, 24.78, 24.02, 24.07, 23.90, 24.05, 23.79, 23.47, 23.84, 21.71, 20.06, 22.54, 25.57, 25.37, 26.38]
    line [306.54, 308.67, 318.29, 308.47, 312.68, 311.01, 311.87, 322.19, 317.56, 317.24, 315.38, 325.99, 315.10, 321.37, 318.36, 304.42, 303.41, 319.39, 327.56, 357.94]
    line [99.56, 95.79, 93.99, 95.03, 91.66, 95.50, 94.32, 94.29, 94.73, 94.34, 95.29, 95.11, 98.41, 97.41, 93.11, 86.98, 96.48, 99.80, 107.59, 107.79]
    line [110.81, 107.51, 105.11, 109.29, 110.23, 118.20, 116.66, 113.51, 116.56, 110.18, 116.43, 113.57, 116.81, 116.74, 114.96, 116.34, 117.08, 121.26, 127.78, 131.45]
    line [169.99, 161.97, 169.28, 168.79, 164.45, 163.90, 173.08, 173.52, 171.67, 165.07, 170.82, 168.89, 168.46, 160.87, 163.97, 157.39, 159.96, 176.03, 182.37, 173.15]
    line [32.08, 31.89, 31.67, 31.01, 31.00, 31.79, 31.95, 32.72, 33.00, 31.56, 31.04, 31.19, 31.58, 30.98, 28.44, 27.47, 29.34, 33.19, 34.45, 32.48]
    line [70.99, 69.49, 68.20, 68.29, 71.18, 72.28, 72.81, 72.16, 72.22, 72.29, 71.63, 70.43, 69.31, 70.55, 65.48, 65.68, 67.02, 74.90, 75.80, 79.70]
    line [122.50, 124.97, 121.63, 124.44, 114.40, 117.66, 113.42, 116.57, 120.86, 116.04, 115.61, 111.25, 114.64, 107.26, 104.85, 102.99, 109.30, 116.77, 127.71, 114.20]
    line [230.85, 236.16, 237.46, 237.06, 237.81, 238.36, 240.26, 242.42, 235.97, 234.05, 235.94, 244.60, 237.90, 238.37, 234.19, 223.75, 225.18, 243.31, 257.18, 256.97]
    line [199.02, 199.50, 195.58, 198.56, 202.04, 205.76, 202.04, 203.32, 201.04, 202.44, 203.10, 195.80, 206.74, 207.91, 185.17, 183.38, 197.81, 213.96, 231.09, 232.21]
    line [22.48, 22.26, 24.16, 21.86, 22.99, 23.86, 22.95, 22.15, 22.59, 22.93, 22.71, 21.96, 22.43, 22.76, 19.93, 19.65, 21.35, 23.88, 24.29, 22.74]
    line [182.93, 185.74, 173.94, 185.68, 184.19, 188.28, 188.11, 196.54, 189.53, 183.55, 193.13, 194.30, 182.73, 194.72, 192.90, 184.51, 177.92, 195.10, 212.88, 219.97]
    line [206.57, 216.35, 210.81, 207.51, 213.81, 235.09, 232.12, 236.13, 235.71, 228.72, 232.65, 236.79, 238.66, 239.84, 237.65, 227.69, 241.17, 242.31, 251.84, 257.31]
    line [84.32, 82.91, 77.95, 81.87, 81.89, 89.30, 90.84, 89.17, 86.07, 86.04, 90.94, 91.20, 88.38, 89.72, 82.57, 85.29, 87.34, 86.74, 95.27, 97.94]
    line [129.94, 136.83, 140.59, 128.00, 132.13, 140.04, 140.36, 136.98, 135.57, 135.50, 134.25, 129.01, 139.25, 139.78, 129.55, 131.60, 134.11, 136.19, 147.37, 149.33]
    line [31.34, 29.78, 30.86, 29.89, 30.20, 33.22, 32.90, 33.40, 32.96, 33.38, 32.90, 31.64, 32.05, 31.87, 30.32, 30.13, 30.52, 32.45, 34.68, 36.83]
    line [142.44, 148.72, 148.74, 148.66, 145.81, 145.83, 151.65, 150.82, 149.41, 147.54, 148.32, 148.24, 148.81, 152.12, 144.06, 141.46, 148.01, 153.69, 163.45, 163.04]
    line [116.61, 109.61, 115.93, 113.66, 115.36, 122.68, 121.26, 119.81, 119.36, 122.21, 121.33, 118.71, 119.46, 120.59, 115.93, 111.61, 116.47, 122.24, 129.36, 128.91]
    line [205.14, 200.36, 207.64, 202.85, 200.31, 210.29, 210.04, 207.76, 200.78, 205.77, 199.55, 199.57, 206.34, 210.39, 198.78, 192.42, 197.28, 209.87, 213.91, 219.61]
    line [180.77, 185.77, 186.35, 184.33, 182.33, 191.53, 189.75, 189.98, 177.07, 192.83, 190.79, 182.79, 190.84, 188.67, 194.33, 177.58, 179.97, 187.56, 204.85, 175.41]
    line [50.78, 49.91, 50.66, 50.34, 50.02, 51.61, 51.21, 51.38, 49.64, 48.60, 49.52, 48.09, 50.03, 48.82, 46.25, 44.36, 47.22, 53.09, 55.75, 56.48]
    line [149.26, 148.44, 146.25, 144.57, 148.51, 160.26, 155.20, 157.30, 154.76, 157.76, 156.45, 156.97, 156.48, 161.27, 156.23, 155.16, 163.04, 163.18, 170.50, 178.84]
    line [73.95, 75.07, 76.77, 72.26, 69.84, 77.03, 74.27, 74.27, 73.83, 75.96, 75.41, 73.52, 70.94, 72.13, 67.68, 66.21, 71.65, 76.02, 80.93, 84.19]
    line [232.83, 233.41, 237.39, 235.87, 236.73, 241.85, 239.59, 240.67, 245.15, 245.04, 246.20, 235.52, 245.54, 241.43, 227.89, 226.93, 235.13, 241.29, 256.22, 256.06]
    line [162.41, 162.92, 155.61, 157.24, 162.25, 174.81, 169.46, 179.44, 172.82, 176.92, 167.34, 176.43, 176.94, 178.99, 168.22, 166.87, 176.13, 175.56, 186.67, 196.90]
    line [76.57, 75.62, 71.86, 75.70, 72.52, 79.52, 79.75, 79.57, 78.19, 78.53, 81.17, 72.47, 80.44, 78.06, 78.74, 77.69, 75.81, 82.18, 88.38, 87.15]
    line [113.85, 113.19, 111.86, 113.23, 116.22, 119.95, 116.76, 117.75, 118.71, 118.58, 117.32, 112.42, 116.77, 113.28, 107.29, 110.98, 110.70, 119.74, 122.80, 129.73]
    line [18.41, 18.71, 17.35, 18.44, 18.66, 19.39, 19.24, 18.95, 18.61, 19.20, 19.16, 18.64, 18.56, 18.69, 15.82, 15.37, 16.82, 19.06, 19.36, 19.05]
    line [359.05, 350.76, 385.22, 356.23, 361.41, 363.52, 371.74, 360.07, 349.58, 358.00, 357.09, 358.22, 365.46, 375.72, 366.42, 366.13, 364.89, 378.25, 407.03, 408.32]
    line [46.00, 48.05, 47.07, 45.85, 42.75, 47.52, 47.21, 45.81, 45.88, 45.34, 46.09, 44.04, 43.96, 44.61, 40.41, 39.77, 41.67, 47.14, 50.43, 48.76]
    line [200.18, 192.55, 195.85, 196.96, 197.31, 203.68, 215.88, 203.82, 209.47, 208.55, 206.80, 208.32, 210.94, 208.87, 204.66, 200.55, 205.66, 217.93, 227.16, 232.86]
    line [329.78, 336.28, 339.96, 335.03, 330.81, 346.52, 335.23, 343.48, 342.97, 326.49, 346.96, 341.41, 349.59, 332.44, 321.99, 323.13, 336.38, 352.94, 374.70, 389.29]
    line [114.58, 111.22, 109.33, 106.79, 113.91, 116.30, 113.89, 119.27, 121.25, 119.32, 118.60, 119.88, 120.18, 120.91, 116.77, 113.59, 115.36, 119.01, 126.14, 130.00]
    line [192.23, 185.43, 191.26, 188.26, 189.10, 196.56, 199.42, 199.83, 198.90, 201.82, 194.83, 201.20, 199.08, 201.68, 196.07, 191.44, 191.98, 208.77, 213.46, 218.16]
    line [212.61, 210.51, 204.56, 210.18, 211.34, 200.66, 223.22, 223.16, 220.54, 207.84, 221.69, 222.09, 227.69, 222.11, 226.42, 218.19, 221.48, 227.88, 240.46, 239.34]
    line [160.91, 157.90, 164.74, 161.04, 164.69, 164.20, 175.57, 172.74, 173.87, 177.24, 172.99, 166.08, 180.17, 181.21, 173.75, 179.71, 177.60, 181.52, 194.07, 204.27]
    line [146.06, 142.91, 137.61, 141.27, 139.39, 164.22, 164.25, 165.65, 160.55, 167.52, 164.35, 162.61, 160.21, 152.67, 150.17, 151.88, 156.83, 157.18, 166.03, 166.95]
Loading
Time to Process Files
Repository Elapsed Min/Avg/Max SD SD Graph
AdaDoom3/AdaDoom3 2.80 2.9 / 3.2 / 3.6 0.17 ●┣━━┻━━╋━━┻━━┫
alexiosc/megistos 6.92 7.0 / 8.0 / 9.9 0.52 ●━━┻━━╋━━┻━━┫
apollographql/apollo-server 2.50 2.4 / 2.7 / 3.1 0.13 ┣●┻━━╋━━┻━┫
aspnetboilerplate/aspnetboilerplate 8.88 8.8 / 9.9 / 12.5 0.64 ┣●━┻━━╋━━┻━━┫
aws-amplify/docs 12.01 11.8 / 13.1 / 15.9 0.66 ┣●━┻━━╋━━┻━━┫
Azure/azure-rest-api-specs 9.49 9.1 / 10.3 / 11.7 0.50 ┣●━┻━━╋━━┻━━┫
bitjson/typescript-starter 1.05 1.0 / 1.1 / 1.4 0.10 ┣━┻━●╋━━┻━┫
caddyserver/caddy 3.33 3.2 / 3.7 / 4.3 0.21 ┣●━┻━━╋━━┻━━┫
canada-ca/open-source-logiciel-libre 1.02 1.0 / 1.2 / 1.4 0.08 ●━┻━━╋━━┻━┫
chef/chef 5.23 5.2 / 6.0 / 6.8 0.32 ●┣━━┻━━╋━━┻━━┫
dart-lang/sdk 53.37 55.4 / 62.8 / 70.9 3.61 ● ┣━━━┻━━━╋━━━┻━━━┫
django/django 13.14 13.4 / 15.2 / 17.0 0.78 ● ┣━━┻━━╋━━┻━━┫
eslint/eslint 9.45 9.4 / 10.5 / 11.3 0.44 ●┣━━┻━━╋━━┻━━┫
exonum/exonum 3.25 3.3 / 3.7 / 4.1 0.16 ●┣━━┻━━╋━━┻━━┫
flutter/samples 15.02 14.3 / 16.4 / 17.9 0.82 ┣●━┻━━╋━━┻━━┫
gitbucket/gitbucket 3.20 3.1 / 3.5 / 4.0 0.17 ┣●━┻━━╋━━┻━━┫
googleapis/google-cloud-cpp 125.87 123.1 / 135.5 / 155.9 8.73 ┣━━●┻━━━╋━━━┻━━━┫
graphql/express-graphql 1.14 1.0 / 1.2 / 1.4 0.09 ┣━┻━●╋━━┻━┫
graphql/graphql-js 2.70 2.6 / 2.9 / 3.2 0.14 ┣●┻━━╋━━┻━┫
graphql/graphql-relay-js 1.06 1.0 / 1.2 / 1.5 0.10 ┣━●━━╋━━┻━┫
graphql/graphql-spec 1.20 1.2 / 1.4 / 1.6 0.09 ┣●┻━━╋━━┻━┫
iluwatar/java-design-patterns 11.14 11.4 / 12.8 / 14.1 0.57 ● ┣━━┻━━╋━━┻━━┫
ktaranov/sqlserver-kit 5.88 5.8 / 6.5 / 7.2 0.31 ●━━┻━━╋━━┻━━┫
liriliri/licia 3.69 3.6 / 4.2 / 4.7 0.21 ● ┣━━┻━━╋━━┻━━┫
MartinThoma/LaTeX-examples 6.07 6.1 / 7.0 / 8.5 0.47 ●━━┻━━╋━━┻━━┫
mdx-js/mdx 1.77 1.8 / 2.0 / 2.2 0.11 ●┣━┻━━╋━━┻━┫
microsoft/TypeScript-Website 5.10 5.0 / 5.6 / 6.2 0.25 ●━━┻━━╋━━┻━━┫
MicrosoftDocs/PowerShell-Docs 20.08 19.8 / 22.9 / 25.1 1.11 ●┣━━━┻━━╋━━┻━━━┫
neovim/nvim-lspconfig 3.90 3.9 / 4.5 / 4.9 0.20 ● ┣━━┻━━╋━━┻━━┫
pagekit/pagekit 3.37 3.4 / 3.6 / 4.0 0.14 ┣●━┻━━╋━━┻━━┫
php/php-src 23.13 23.1 / 26.0 / 30.2 1.37 ●━━━┻━━╋━━┻━━━┫
plasticrake/tplink-smarthome-api 1.27 1.2 / 1.4 / 1.7 0.11 ┣━●━━╋━━┻━┫
prettier/prettier 7.02 7.4 / 7.9 / 8.5 0.25 ● ┣━━┻━━╋━━┻━━┫
pycontribs/jira 1.40 1.4 / 1.6 / 1.9 0.11 ●━┻━━╋━━┻━┫
RustPython/RustPython 6.30 5.4 / 6.2 / 7.4 0.47 ┣━━┻━━●━━┻━━┫
shoelace-style/shoelace 2.69 2.7 / 3.0 / 3.3 0.12 ●┣━┻━━╋━━┻━┫
slint-ui/slint 14.99 11.9 / 14.1 / 15.8 0.63 ┣━━┻━━╋━━┻━●┫
SoftwareBrothers/admin-bro 2.55 2.4 / 2.6 / 2.9 0.13 ┣━┻●━╋━━┻━┫
sveltejs/svelte 20.19 19.9 / 22.5 / 24.7 0.99 ●┣━━━┻━━╋━━┻━━━┫
TheAlgorithms/Python 5.47 5.4 / 5.9 / 6.7 0.26 ┣━●┻━━╋━━┻━━┫
twbs/bootstrap 1.61 1.6 / 1.8 / 2.1 0.09 ●┣━┻━━╋━━┻━┫
typescript-cheatsheets/react 1.29 1.3 / 1.4 / 1.9 0.11 ┣━●━━╋━━┻━┫
typescript-eslint/typescript-eslint 3.94 3.8 / 4.4 / 4.9 0.20 ●━━┻━━╋━━┻━━┫
vitest-dev/vitest 8.90 8.7 / 9.9 / 11.6 0.50 ●━━┻━━╋━━┻━━┫
w3c/aria-practices 3.18 3.2 / 3.6 / 4.0 0.18 ●━━┻━━╋━━┻━━┫
w3c/specberus 1.83 1.8 / 2.1 / 2.6 0.13 ●━┻━━╋━━┻━┫
webdeveric/webpack-assets-manifest 1.26 1.1 / 1.3 / 1.6 0.10 ┣━┻━━●━━┻━┫
webpack/webpack 4.89 4.8 / 5.5 / 6.1 0.28 ●┣━━┻━━╋━━┻━━┫
wireapp/wire-desktop 1.35 1.2 / 1.4 / 1.7 0.10 ┣━┻━●╋━━┻━┫
wireapp/wire-webapp 9.20 9.4 / 10.6 / 12.0 0.57 ● ┣━━┻━━╋━━┻━━┫

Note:

  • Elapsed time is in seconds.
Files per Second over Time
Repository Files Sec Fps Rel Trend Fps N
AdaDoom3/AdaDoom3 103 2.80 36.83 15.74% ▅▄▄▄▃▃▄▃▃▅▄▃▄▅▆▆▆▇▇█ 53
alexiosc/megistos 583 6.92 84.19 15.15% ▅▅▅▃▂▃▄▄▄▄▅▅▅▆▇█▇▇▇█ 53
apollographql/apollo-server 253 2.50 101.23 7.21% ▆▃▅▅▅▅▄▅▅▆▅▆▆▇▇█▇███ 53
aspnetboilerplate/aspnetboilerplate 2286 8.88 257.31 11.41% ▇▆▇▆▅▆▆▆▅▆▇▆▆▆█▇██▇█ 53
aws-amplify/docs 2874 12.01 239.34 8.72% ▆▆▇▇▆▅▅▆▆▆▆▆▆▇▇█████ 53
Azure/azure-rest-api-specs 2438 9.49 256.97 8.20% ▆▅▆▄▃▃▄▆▅▃▄▄▅▆▇▇▇█▇▇ 53
bitjson/typescript-starter 20 1.05 19.05 4.40% ▇▅▄▂▂▂▂▂▃▄▄▄▅▆█▆▇▄█▆ 53
caddyserver/caddy 290 3.33 87.15 10.88% ▅▃▅▅▅▅▅▅▅▅▄▅▅▆▇▇███▇ 53
canada-ca/open-source-logiciel-libre 7 1.02 6.90 14.18% ▆▅▅▃▃▃▃▃▂▅▃▄▄▆▆█▇█▇▇ 53
chef/chef 1196 5.23 228.77 13.92% ▆▄▅▄▄▅▅▅▄▅▅▅▅▄████▆█ 53
dart-lang/sdk 10901 53.37 204.27 17.39% ▆▅▄▆▅▅▆▅▅▅▅▅▅▅▆▇▇▇▇█ 53
django/django 2891 13.14 219.97 15.75% ▅▅▅▅▅▅▄▄▄▃▂▄▃▅█▇██▇█ 53
eslint/eslint 2062 9.45 218.16 10.64% ▆▅▅▅▅▄▄▄▅▄▆▃▇▅███▇▇█ 53
exonum/exonum 421 3.25 129.73 12.30% ▅▃▄▃▃▄▄▄▄▆▄▄▅▅█▇█▄██ 53
flutter/samples 2441 15.02 162.55 8.98% ▃▄▄▄▄▄▄▄▄▅▅▅▃▅██▇██▇ 53
gitbucket/gitbucket 413 3.20 128.91 8.83% ▆▅▅▄▄▄▄▄▂▅▅▅▅▅█▇█▇▇▇ 53
googleapis/google-cloud-cpp 21013 125.87 166.95 7.26% ▅▅▅▅▆▆▄▅▅▅▆▆▅▆██▇█▇█ 53
graphql/express-graphql 26 1.14 22.74 1.88% ▇▄▅▂▃▃▃▃▂▅▄▅▆▇█▇█▆█▆ 53
graphql/graphql-js 368 2.70 136.24 7.02% ▆▅▅▃▃▄▄▄▄▅▅▅▆▄██▆██▇ 53
graphql/graphql-relay-js 28 1.06 26.38 11.07% ▇▅▅▃▃▂▃▃▂▄▅▅▇▇▇█▇█▅█ 53
graphql/graphql-spec 19 1.20 15.79 11.78% ▇▅▇▄▃▃▄▄▂▅▄▆▆▆▇█████ 53
iluwatar/java-design-patterns 1992 11.14 178.84 14.47% ▆▅▅▅▅▄▄▄▅▅▆▆▅▅▇▇▆▇▇█ 53
ktaranov/sqlserver-kit 489 5.88 83.22 10.13% ▆▅▆▅▅▅▆▅▅▆▅▅▆▆█▆▇███ 53
liriliri/licia 1437 3.69 389.29 14.53% ▅▂▅▂▄▃▄▄▃▄▄▄▅▅▆▆▇▆██ 53
MartinThoma/LaTeX-examples 1409 6.07 232.21 14.94% ▆▆▅▂▂▃▃▃▄▆▅▅▅▆██████ 53
mdx-js/mdx 141 1.77 79.70 12.98% ▆▄▄▃▃▄▃▄▄▄▅▃▇▆▇███▃█ 53
microsoft/TypeScript-Website 761 5.10 149.33 10.13% ▆▅▅▃▃▄▅▅▄▅▅▄▅▅▅▆▇▇█▇ 53
MicrosoftDocs/PowerShell-Docs 2639 20.08 131.45 13.76% ▅▄▅▄▃▅▅▅▅▅▄▆▅▅▇▇█▇▆█ 53
neovim/nvim-lspconfig 767 3.90 196.53 14.23% ▅▅▅▄▄▅▅▃▄▅▃▄▅▄▇███▇█ 53
pagekit/pagekit 741 3.37 219.61 7.77% ▇▇▆▄▄▄▃▄▄▆▅▅▇▆█▇▆███ 53
php/php-src 2265 23.13 97.94 12.35% ▆▆▆▂▅▅▅▅▅▅▆▅▅▄▆██▆▇█ 53
plasticrake/tplink-smarthome-api 62 1.27 48.76 8.23% ▆▄▅▂▃▄▄▃▂▄▅▃▅▆███▇█▇ 53
prettier/prettier 2511 7.02 357.94 13.72% ▄▅▅▅▃▄▃▄▄▄▄▄▅▄▆▆▆▅▅█ 53
pycontribs/jira 79 1.40 56.48 13.39% ▅▃▅▃▂▃▃▂▃▄▃▅▅▆███▆██ 53
RustPython/RustPython 719 6.30 114.20 -1.11% ▄▄▄▂▃▃▄▂▂▅▄▄▅▆▅█▅█▇▅ 53
shoelace-style/shoelace 439 2.69 163.04 9.37% ▆▆▅▄▄▃▄▄▄▅▅▆▅▆▇█▇███ 53
slint-ui/slint 2630 14.99 175.41 -6.21% ▄▅▆▄▄▃▃▄▄▄▃▄▄▅▅▆█▆▆▃ 53
SoftwareBrothers/admin-bro 441 2.55 173.15 2.99% ▆▃▅▅▃▃▄▄▃▅▅▃▆▆▇██▇▇▆ 53
sveltejs/svelte 8245 20.19 408.32 11.34% ▅▇▅▅▄▅▃▅▆▅▅▅▅▅▇▇████ 53
TheAlgorithms/Python 1400 5.47 256.06 7.06% ▇▅▄▅▃▅▅▅▄▇▅▆▆▅███▇██ 53
twbs/bootstrap 118 1.61 73.13 13.50% ▆▄▅▄▄▄▃▄▃▅▅▅▆▆▇▇▇█▇█ 53
typescript-cheatsheets/react 53 1.29 40.97 8.91% ▇▅▆▅▄▂▃▄▄▅▆▆▇▇████▇█ 53
typescript-eslint/typescript-eslint 1298 3.94 329.28 11.75% ▅▅▅▄▄▃▄▃▄▄▅▄▅▆█▇██▇▇ 53
vitest-dev/vitest 2436 8.90 273.80 11.89% ▅▅▅▆▅▅▅▅▅▅▆▅▄▆▇██▆▇█ 53
w3c/aria-practices 414 3.18 130.00 11.30% ▆▆▆▅▅▄▅▄▄▆▅▅▆▅▆███▅█ 53
w3c/specberus 197 1.83 107.79 12.82% ▇▅▆▄▄▅▄▂▄▅▆▆▆▆██████ 53
webdeveric/webpack-assets-manifest 55 1.26 43.80 -0.72% ▆▅▅▄▂▄▄▃▄▄▅▅▆▇▆█▇▇█▆ 53
webpack/webpack 1139 4.89 232.86 12.70% ▄▅▅▄▄▄▅▃▃▅▄▅▅▅▇▅██▇▇ 53
wireapp/wire-desktop 44 1.35 32.48 3.79% ▆▅▅▃▃▂▃▄▃▄▄▄▇▆▇▇█▆█▆ 53
wireapp/wire-webapp 1811 9.20 196.90 14.94% ▆▆▄▅▄▄▅▅▄▅▆▅▄▅▇▆▇▇▇█ 53
Data Throughput
Repository Files Sec Kps Rel Trend Kps N
AdaDoom3/AdaDoom3 103 2.80 782.70 15.74% ▅▄▄▄▃▃▄▃▃▅▄▃▄▅▆▆▆▇▇█ 53
alexiosc/megistos 583 6.92 661.53 15.15% ▅▅▅▃▂▃▄▄▄▄▅▅▅▆▇█▇▇▇█ 53
apollographql/apollo-server 253 2.50 828.21 7.21% ▆▃▅▅▅▅▄▅▅▆▅▆▆▇▇█▇███ 53
aspnetboilerplate/aspnetboilerplate 2286 8.88 626.05 11.41% ▇▆▇▆▅▆▆▆▅▆▇▆▆▆█▇██▇█ 53
aws-amplify/docs 2874 12.01 836.53 8.72% ▆▆▇▇▆▅▅▆▆▆▆▆▆▇▇█████ 53
Azure/azure-rest-api-specs 2438 9.49 679.43 8.19% ▆▅▆▄▃▃▄▆▅▃▄▄▅▆▇▇▇█▇▇ 53
bitjson/typescript-starter 20 1.05 76.22 4.40% ▇▅▄▂▂▂▂▂▃▄▄▄▅▆█▆▇▄█▆ 53
caddyserver/caddy 290 3.33 765.08 11.19% ▅▃▅▅▅▅▅▅▅▅▄▅▅▆▇▇███▇ 53
canada-ca/open-source-logiciel-libre 7 1.02 57.14 14.18% ▆▅▅▃▃▃▃▃▂▅▃▄▄▆▆█▇█▇▇ 53
chef/chef 1196 5.23 1062.16 13.82% ▆▄▅▄▄▅▅▅▄▅▅▅▅▄████▆█ 53
dart-lang/sdk 10901 53.37 1384.91 17.39% ▆▅▄▆▅▅▆▅▅▅▅▅▅▅▆▇▇▇▇█ 53
django/django 2891 13.14 1385.77 15.83% ▅▅▅▅▅▅▄▄▄▃▂▄▃▅█▇██▇█ 53
eslint/eslint 2062 9.45 1506.06 10.82% ▆▅▅▅▅▄▄▄▅▄▆▃▇▅███▇▇█ 53
exonum/exonum 421 3.25 1240.88 12.30% ▅▃▄▃▃▄▄▄▄▆▄▄▅▅█▇█▄██ 53
flutter/samples 2441 15.02 1428.21 8.86% ▃▄▄▄▄▄▄▄▄▅▅▅▃▅██▇██▇ 53
gitbucket/gitbucket 413 3.20 586.49 8.84% ▆▅▅▄▄▄▄▄▂▅▅▅▅▅█▇█▇▇▇ 53
googleapis/google-cloud-cpp 21013 125.87 1358.85 7.23% ▅▅▅▅▆▆▄▅▅▅▆▆▅▆██▇█▇█ 53
graphql/express-graphql 26 1.14 104.06 1.88% ▇▄▅▂▃▃▃▃▂▅▄▅▆▇█▇█▆█▆ 53
graphql/graphql-js 368 2.70 790.79 7.02% ▆▅▅▃▃▄▄▄▄▅▅▅▆▄██▆██▇ 53
graphql/graphql-relay-js 28 1.06 103.65 11.07% ▇▅▅▃▃▂▃▃▂▄▅▅▇▇▇█▇█▅█ 53
graphql/graphql-spec 19 1.20 526.85 11.78% ▇▅▇▄▃▃▄▄▂▅▄▆▆▆▇█████ 53
iluwatar/java-design-patterns 1992 11.14 552.77 14.47% ▆▅▅▅▅▄▄▄▅▅▆▆▅▅▇▇▆▇▇█ 53
ktaranov/sqlserver-kit 489 5.88 1260.22 10.13% ▆▅▆▅▅▅▆▅▅▆▅▅▆▆█▆▇███ 53
liriliri/licia 1437 3.69 463.79 14.53% ▅▂▅▂▄▃▄▄▃▄▄▄▅▅▆▆▇▆██ 53
MartinThoma/LaTeX-examples 1409 6.07 479.57 14.94% ▆▆▅▂▂▃▃▃▄▆▅▅▅▆██████ 53
mdx-js/mdx 141 1.77 370.24 12.98% ▆▄▄▃▃▄▃▄▄▄▅▃▇▆▇███▃█ 53
microsoft/TypeScript-Website 761 5.10 1032.98 10.13% ▆▅▅▃▃▄▅▅▄▅▅▄▅▅▅▆▇▇█▇ 53
MicrosoftDocs/PowerShell-Docs 2639 20.08 1371.48 13.78% ▅▄▅▄▃▅▅▅▅▅▄▆▅▅▇▇█▇▆█ 53
neovim/nvim-lspconfig 767 3.90 366.15 14.16% ▅▅▅▄▄▅▅▃▄▅▃▄▅▄▇███▇█ 53
pagekit/pagekit 741 3.37 457.90 7.77% ▇▇▆▄▄▄▃▄▄▆▅▅▇▆█▇▆███ 53
php/php-src 2265 23.13 1715.16 12.35% ▆▆▆▂▅▅▅▅▅▅▆▅▅▄▆██▆▇█ 53
plasticrake/tplink-smarthome-api 62 1.27 263.45 8.23% ▆▄▅▂▃▄▄▃▂▄▅▃▅▆███▇█▇ 53
prettier/prettier 2511 7.02 510.90 13.70% ▄▅▅▅▃▄▃▄▄▄▄▄▅▄▆▆▆▅▅█ 53
pycontribs/jira 79 1.40 400.39 13.39% ▅▃▅▃▂▃▃▂▃▄▃▅▅▆███▆██ 53
RustPython/RustPython 719 6.30 1331.68 2.67% ▄▃▄▂▃▃▄▂▂▅▄▄▅▆▅█▅█▇▅ 53
shoelace-style/shoelace 439 2.69 787.71 9.37% ▆▆▅▄▄▃▄▄▄▅▅▆▅▆▇█▇███ 53
slint-ui/slint 2630 14.99 1083.07 -6.29% ▄▅▆▄▄▃▃▄▄▄▃▄▄▅▅▆█▆▆▃ 53
SoftwareBrothers/admin-bro 441 2.55 381.64 2.99% ▆▃▅▅▃▃▄▄▃▅▅▃▆▆▇██▇▇▆ 53
sveltejs/svelte 8245 20.19 274.01 11.31% ▅▇▅▅▄▅▃▅▆▅▅▅▅▅▇▇████ 53
TheAlgorithms/Python 1400 5.47 652.05 7.10% ▇▅▄▅▃▅▅▅▄▇▅▆▆▅███▇██ 53
twbs/bootstrap 118 1.61 600.50 13.50% ▆▄▅▄▄▄▃▄▃▅▅▅▆▆▇▇▇█▇█ 53
typescript-cheatsheets/react 53 1.29 302.99 8.91% ▇▅▆▅▄▂▃▄▄▅▆▆▇▇████▇█ 53
typescript-eslint/typescript-eslint 1298 3.94 1704.25 11.78% ▅▅▅▄▄▃▄▃▄▄▅▄▅▆█▇██▇▇ 53
vitest-dev/vitest 2436 8.90 595.14 11.76% ▅▅▅▆▅▅▅▅▅▅▆▅▄▆▇██▆▇█ 53
w3c/aria-practices 414 3.18 1212.12 11.30% ▆▆▆▅▅▄▅▄▄▆▅▅▆▅▆███▅█ 53
w3c/specberus 197 1.83 340.89 12.82% ▇▅▆▄▄▅▄▂▄▅▆▆▆▆██████ 53
webdeveric/webpack-assets-manifest 55 1.26 100.34 -0.72% ▆▅▅▄▂▄▄▃▄▄▅▅▆▇▆█▇▇█▆ 53
webpack/webpack 1139 4.89 1075.77 12.81% ▅▅▅▄▄▄▅▃▃▅▄▅▅▅▇▅██▇▇ 53
wireapp/wire-desktop 44 1.35 144.68 3.91% ▆▅▅▃▃▂▃▄▃▄▄▄▇▆▇▇█▆█▆ 53
wireapp/wire-webapp 1811 9.20 740.63 15.51% ▆▆▄▅▄▄▅▅▄▅▆▅▅▅▇▆▇▇▇█ 53

@Jason3S Jason3S requested a review from Copilot January 10, 2026 10:54
@Jason3S Jason3S marked this pull request as ready for review January 10, 2026 10:54
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves word lookup performance when words are not found by optimizing how the spell checker generates different word forms for dictionary lookups. The key optimization is to avoid expensive Unicode normalization and replacement mapping operations when they're not needed.

Changes:

  • Converted mapWord from required to optional on SpellingDictionary interface, using undefined for dictionaries that don't need word mapping
  • Added early-exit optimization for ASCII words to skip Unicode normalization
  • Added test-before-apply optimization for replacement mappers to avoid expensive operations when the word won't match
  • Enhanced dictionary logging to track cache misses and improved the public API for logging functions
  • Added comprehensive tests including integration test with real German dictionary

Reviewed changes

Copilot reviewed 24 out of 26 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryFromTrie.ts Core performance optimization: ASCII check and repMapper test before expensive operations
packages/cspell-dictionary/src/util/repMap.ts Changed ReplaceMapper and RepMapper to include test regex for pre-checking matches
packages/cspell-dictionary/src/SpellingDictionary/CachingDictionary.ts Enhanced logging to track cache misses and improved API documentation
packages/cspell-dictionary/src/index.ts Cleaned up exports, replacing _debug object with explicit named exports
packages/cspell-lib/src/lint/lint.ts Updated to use new logging API
packages/cspell-dictionary/src/SpellingDictionary/*.ts Changed mapWord from required method to optional property (5 dictionary implementations)
packages/cspell-dictionary/src/test/reader.test.helper.ts New test helper for reading dictionary files from npm packages
packages/cspell-lib/src/lib/textValidation/docValidator.ts Added performance measurement hooks (some commented out)
packages/cspell-lib/src/lib/Settings/RegExpPatterns.ts Added commented-out regex pattern
Various test files Updated tests to handle mapWord being optional/undefined
package.json files Added German dictionary as dev dependency for integration testing; added perf-test script
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@Jason3S Jason3S merged commit cc73e3f into main Jan 10, 2026
80 checks passed
@Jason3S Jason3S deleted the dev-perf branch January 10, 2026 12:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants