In reply to MICRO_91:
There is no direction associated with uvm_config_db. They are essentially global variables accessed with string names. Every call to the uvm_config_db involves a lot of string processing. It was designed for initialization and occasional communication.
TLM establishes a strict protocol or contract on who initiates transfer of data and the direction of that transfer. It make take a little extra effort to setup, but communication is more efficient.
The UVM provides a few other mechanisms that might be more efficient than either, like the pool classes. You really need to experiment and read the code to get a feel for what is best for your situation.