librespot-golang icon indicating copy to clipboard operation
librespot-golang copied to clipboard

AudioFile.Read(): CPU usage unnecessarily @ 100 %

Open joonas-fi opened this issue 3 years ago • 0 comments

https://github.com/librespot-org/librespot-golang/blob/31669e5a889fb671269fab6b87322b3159119f90/librespot/player/audiofile.go#L104

When chunk hasn't arrived from server yet, the consumer code that is calling Read() will get 0-byte successful reads at rapid pace, until server responds. This means that the consumer is calling the read as fast as it can, millions of times a second, manifesting in 100 % CPU usage. After I inserted a 100 ms sleep in after the line I quoted, CPU usage is back to normal.

This behaviour is discouraged by the Reader interface:

Implementations of Read are discouraged from returning a zero byte count with a nil error

Source

It doesn't say it directly, but it means that Read() is expected to block until it has data to return.

joonas-fi avatar Apr 18 '22 13:04 joonas-fi