Instead of commissioning the devices at each startup, you could just scan for used short addresses. Start with a QUERY MISSING SHORT ADDRESS, sent using broadcast addressing if you want to see if there are any devices with no short addresses. You should only be giving out new addresses to those devices which don't already have a short address.
If you want to search for which short addresses are already used, sending a query such as QUERY DEVICE STATUS, with each short address 0-63 in a loop should be faster than 20 seconds (could be less than 3 seconds).
Since you are looking for Control Devices, these are 24 bit commands from IEC62386-103
QUERY MISSING SHORT ADDRESS is opcode byte 0x33
QUERY DEVICE STATUS is opcode byte 0x30
If you were doing the same for Control Gear (lamp drivers), these would be 16 bit commands from IEC62386-102
QUERY MISSING SHORT ADDRESS is opcode byte 0x96, command number 150
QUERY STATUS is opcode byte 0x90, command number 144
But if the controller stores the short addresses used in non volatile memory, you should not have to check all the devices on each power up, you could use what you have stored in local memory.