A method of load balancing in a network comprising a device, wherein the device comprises: a controller comprising a processor, and a plurality of outputs, the method comprising the device: determining an average data intensity for each of the plurality of outputs, wherein the average data intensity is based on data packet transmissions respectively to each of the plurality of outputs; receiving an output congestion value from each of the plurality of outputs; calculating, at the processor, an effective congestion value for each of the plurality of outputs, wherein the effective congestion value is a function of the output congestion value and the average data intensity; performing, at the processor, a comparison of the effective congestion values for the plurality of outputs; and selecting an output based on the comparison, wherein the output congestion value is calculated based on at least one of a shadow queue value of the output and an arbiter value, wherein, when the output congestion value is calculated based on the shadow queue value of the output, the shadow queue value of the output is a virtual queue size for the output, and wherein, when the output congestion value is calculated based on the arbiter value, the arbiter value reflects packets with a pending arbiter request. a controller comprising a processor, and a plurality of outputs, the method comprising the device: determining an average data intensity for each of the plurality of outputs, wherein the average data intensity is based on data packet transmissions respectively to each of the plurality of outputs; receiving an output congestion value from each of the plurality of outputs; calculating, at the processor, an effective congestion value for each of the plurality of outputs, wherein the effective congestion value is a function of the output congestion value and the average data intensity; performing, at the processor, a comparison of the effective congestion values for the plurality of outputs; and selecting an output based on the comparison, wherein the output congestion value is calculated based on at least one of a shadow queue value of the output and an arbiter value, wherein, when the output congestion value is calculated based on the shadow queue value of the output, the shadow queue value of the output is a virtual queue size for the output, and wherein, when the output congestion value is calculated based on the arbiter value, the arbiter value reflects packets with a pending arbiter request. determining an average data intensity for each of the plurality of outputs, wherein the average data intensity is based on data packet transmissions respectively to each of the plurality of outputs; receiving an output congestion value from each of the plurality of outputs; calculating, at the processor, an effective congestion value for each of the plurality of outputs, wherein the effective congestion value is a function of the output congestion value and the average data intensity; performing, at the processor, a comparison of the effective congestion values for the plurality of outputs; and selecting an output based on the comparison, wherein the output congestion value is calculated based on at least one of a shadow queue value of the output and an arbiter value, wherein, when the output congestion value is calculated based on the shadow queue value of the output, the shadow queue value of the output is a virtual queue size for the output, and wherein, when the output congestion value is calculated based on the arbiter value, the arbiter value reflects packets with a pending arbiter request.