arduino / arduino/Arduino

[IDE] Slow Startup - because of events trigged by 'boardsCustomMenus'

Open
#10,214 4 comments 0 reactions 0 assignees View on GitHub
Component: IDE Type: Bug
Dominant language
Java
Stars
14.6k
Forks
7k
PR merge metrics
No merged PRs in 30d

Description

I am doing some analysis to improve the IDE startup time (I am discussing the topic in the email list).

I found another problem that is related to the menus. In particular: `createBoardMenusAndCustomMenus`, and in the method: `filterVisibilityOfSubsequentBoardMenus`.

What happens is that for each menu on a board such as Esp8266, it is calling `LibrariesIndexer.rescanLibraries()`, and it ends up costing a lot of time at startup and also when selecting a board.

This is the stack (not an error ...):

> at processing.app.Base.onBoardOrPortChange (Base.java:1346)
> at processing.app.**Base $ 12.actionPerformed** (Base.java:1605)
> at processing.app.Base.filterVisibilityOfSubsequentBoardMenus (Base.java:1651)
> at processing.app.Base.access $ 0 (Base.java:1635)
> at processing.app.**Base $ 11.actionPerformed** (Base.java:1576)
> at processing.app.Base.rebuildBoardsMenu (Base.java:1550)
> at processing.app.Base. (Base.java:285)
> at processing.app.Base.main (Base.java:150)

As you can see for each menu item, he is manually calling 'actionPerformed', and doing a lot of unnecessary things
```
Set log4j store directory /home/ricardo/.arduino15
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/media/ricardo/Dados/Workspace/Arduino/arduino-master/arduino-core/lib/slf4j-simple-1.7.22.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/media/ricardo/Dados/Workspace/Arduino/arduino-master/app/lib/slf4j-simple-1.7.22.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@48d7ad8b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=115200]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@a53bb6f,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=80 MHz]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@6759f091,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=26 MHz]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@14a54ef6,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=512K (no SPIFFS)]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@3b8ee898,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=QIO]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@294bdeb4,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=40MHz]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@1f86099a,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=ck]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@f2c488,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Disabled]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@7bc9e6ab,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=None]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@4248ed58,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=v2 Lower Memory]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@4564e94b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=2]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> menu javax.swing.JRadioButtonMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@51745f40,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Only Sketch]
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.filterVisibilityOfSubsequentBoardMenus(Base.java:1651)
at processing.app.Base.access$0(Base.java:1635)
at processing.app.Base$11.actionPerformed(Base.java:1576)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$11.actionPerformed(Base.java:1578)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base$12.actionPerformed(Base.java:1605)
at processing.app.Base.rebuildBoardsMenu(Base.java:1550)
at processing.app.Base.(Base.java:285)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> onBoardOrPortChange main
java.lang.Throwable
at processing.app.Base.onBoardOrPortChange(Base.java:1346)
at processing.app.Base.(Base.java:294)
at processing.app.Base.main(Base.java:150)
(DEBUG)>>>>>>>>> rescanLibraries main
(DEBUG)>>>>>>>>> rescanLibraries main
>>>>> pdeKeywords = processing.app.syntax.PdeKeywords@63a28987
>>>>> pdeKeywords = processing.app.syntax.PdeKeywords@63a28987
>>>>> pdeKeywords = processing.app.syntax.PdeKeywords@63a28987
>>>>> pdeKeywords = processing.app.syntax.PdeKeywords@63a28987

```

Contributor guide

Open the contributing guide

Research direction

Start in Base.java at createBoardMenusAndCustomMenus, rebuildBoardsMenu, and filterVisibilityOfSubsequentBoardMenus, following the stack through onBoardOrPortChange and LibrariesIndexer.rescanLibraries(). Reproduce IDE startup and board selection with the reported debug output; done means the repeated unnecessary library rescans no longer cause the reported slowdown.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
desktop, performance
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.